VHDL代码中的奇怪锁存行为

时间:2016-09-16 18:59:55

标签: vhdl simulation fpga synthesis

我在以下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。

为什么模拟会以这种方式表现? 谢谢,

吉尔

1 个答案:

答案 0 :(得分:1)

您的敏感度列表中缺少

in0in1

组合过程中的敏感性列表应包括所有输入。输入是经过测试的任何信号(示例中为rdaddr)以及作业右侧的任何信号(示例中为in0in1 )。