VHDL中stalloLoad信号触发延迟问题咨询(ZedBoard Zynq开发板)
问题原因分析
你的stalloLoad延迟一个时钟沿触发,核心原因是VHDL同步进程中信号赋值的时序特性:在同一个时钟上升沿的进程执行中,所有信号的赋值操作不会立即生效,当前进程内用到的信号值都是上一个时钟周期的旧值。
具体逻辑链如下:
- 当
contatoreLoad = 0时,你执行了rd_sig <= inst(11 downto 7),但这个赋值要等到当前时钟沿结束后才会更新rd_sig的实际值。 - 同一个时钟沿里紧接着的
if(rd_sig = "00110")判断,用的还是rd_sig在上一个时钟周期的旧值,所以此时不会触发contatoreLoad <= 1。 - 要等到下一个时钟上升沿,
rd_sig才会更新为当前inst的rd字段值,这时判断条件才会成立,contatoreLoad被设为1,进而触发stalloLoad <= '1'——这就导致了延迟一个时钟沿的现象。
修正方案
直接使用输入信号inst(11 downto 7)进行判断,而非依赖刚赋值的rd_sig(inst是当前时钟周期的稳定输入值)。修改后的关键代码片段如下:
if(contatoreLoad = 0) then codop <= inst(6 downto 0); rd_sig <= inst(11 downto 7); rs1_sig <= inst(19 downto 15); rs2_sig <= inst(24 downto 20); codop <= codop_sig; rd <= rd_sig; rs1 <= rs1_sig; rs2 <= rs2_sig; -- 直接用inst的rd字段判断,而非rd_sig if(inst(11 downto 7) = "00110") then contatoreLoad <= 1; end if; end if;
额外注意事项
你的代码里还有几处未定义的信号(codop、rs1_sig、rs2_sig、codop_sig、regLoad),需要在architecture的信号声明区补充定义,否则无法正常编译。
内容的提问来源于stack exchange,提问作者Boat01
相关产品推荐
相关产品推荐

