【问题标题】:Strange latch behavior in VHDL codeVHDL 代码中的奇怪锁存行为
【发布时间】: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


【解决方案1】:

您的敏感度列表中缺少in0in1

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

【讨论】:

    猜你喜欢
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多