2016-09-16 108 views
-1

我已经在下面的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 = '1' 和ADDR = '00 ' - > DOUT [15:0] = IN0 [15:0]

RD = '0' - > DOUT [15:0] = '0000'

RD = '1' 和ADDR =' 01'→dout [7:0] = in1 [7:0]和dout [15:8] = in0 [15:8]

因此,通过保持之前的值为0 [15:8],似乎dout [15:8]产生一个锁存器,尽管当rd = 0时我认为dout [15:8]为0。

任何想法为什么模拟行为的方式? 谢谢,

吉尔

+0

你的代码段是无效的VHDL。你还没有显示声明,注意'rd'必须是布尔类型。表达式“00”和“01”作为选项不是有效的字符串或字符文字。您的if语句缺少一个then语句和case语句都缺少关闭(分隔)分号。 – user1155120

+0

那么在这种情况下,你不会将任何东西分配给d0的那些位。因此他们必须保持以前的价值。 (马修泰勒是正确的敏感列表,但这与你问的问题没有关系) –

+0

我无法复制[奇怪的闩锁](http://i.stack.imgur.com/2fcw8.png )在你创建一个[最小完整和可验证的例子](http://stackoverflow.com/help/mcve)后,你的行为不正确的代码和叙述。请提供一个MCVE。提供有关VHDL工具及其版本的信息可能也很有用。 – user1155120

回答

1

in0in1从你的敏感列表中丢失。

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