【发布时间】:2016-09-16 18:59:54
【问题描述】:
我注意到以下 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' and addr = '01' -> dout[7:0] = in1[7:0] and dout[15:8] = in0[15:8]
因此,似乎通过保持先前的 in0[15:8] 值为dout[15:8] 生成了一个锁存器,尽管我希望dout[15:8] 在rd=0 时设置为0。
你知道为什么模拟会这样吗? 谢谢,
吉尔
【问题讨论】:
-
您的 sn-p 不是有效的 VHDL。您没有显示声明,注意
rd必须是布尔类型。表达式'00'和'01'作为选择不是有效的字符串或字符文字。您的 if 语句缺少 then,您的 if 语句和 case 语句都缺少结束(定界)分号。 -
好吧,在这种情况下,您不会为 d0 的那些位分配任何东西。因此,它们必须保持其先前的值。 (Matthew Taylor 关于敏感度列表是正确的,但这与您提出的问题无关)
-
从您错误的代码和叙述创建 Minimal Complete and Verifiable example 后,我无法复制 strange latch 行为。请提供 MCVE。提供有关您的 VHDL 工具及其版本的信息也可能很有用。
-
我猜大卫的 MCVE 和未发布的测试平台之间的区别是一个增量循环,其中 rd = '1' 和 addr 通过 0 转换(设置 dout(15:8))到 1 (设置输出(7:0))。他也没有告诉我们这是行为模拟还是综合后模拟;我不希望这样的代码在综合后表现相同。
标签: vhdl simulation fpga synthesis