我在以下VHDL代码中注意到一个奇怪的锁存行为:
process (rd,addr) is
begin
if (rd)
case (addr) is
when '00' => dout(15 downto 0) <= in0(15 downto 0);
when '01' => dout(7 downto 0) <= in1(7 downto 0);
when others => dout <= (others => '0');
end case
else
dout <= (others => '0');
end if
end process;
模拟如下:
rd =&#39; 1&#39;和addr =&#39; 00&#39; - &GT; dout [15:0] = in0 [15:0]
rd =&#39; 0&#39; - &GT; dout [15:0] =&#39; 0000&#39;
rd =&#39; 1&#39;和addr =&#39; 01&#39; - &GT; dout [7:0] = in1 [7:0]和dout [15:8] = in0 [15:8]
所以似乎通过保持先前的in0 [15:8]值为dout [15:8]生成一个锁存器,虽然我希望dout [15:8]在rd = 0时设置为0。
为什么模拟会以这种方式表现? 谢谢,
吉尔
答案 0 :(得分:1)
in0
和in1
。
组合过程中的敏感性列表应包括所有输入。输入是经过测试的任何信号(示例中为rd
和addr
)以及作业右侧的任何信号(示例中为in0
和in1
)。