VHDL 中的最小灵敏度列表

Minimal sensitivity list in VHDL

我有这个 VHDL 代码:

  entity Element is port(
   clk, D, E, F, G: in std_logic;
   Qout: out std_logic);
   end Element;

   architecture beh of Element is
   signal Qint: std_logic;
   begin

    process(...)
       variable sel: std_logic_vector(1 downto 0);
    begin
       if D='1' then
          Qint<= '0';
       elsif E='1' then
          Qint<= '1';
       elsif rising_edge(clk) then
          sel:=F&G;
          case sel is
            when "00"=> Qint<= not Qint;
            when "01"=> Qint<= not Qint;
            when "10"=> Qint<= '0';
            when "11"=> Qint<= Qint;
            when others=> null;
          end case;
       end if;
    end process;

   Qout<= Qint;

   end beh;

我的问题是:如果我想要最小灵敏度列表,我必须在灵敏度列表中写入哪些信号?

您必须在您的敏感度列表中包含所有读取的信号,而不是在您的进程的时钟部分内。

您异步读取 D 和 E。您将 clk 阅读为寄存器的一部分。因此你必须包括它们。

process (D, E, clk)
begin
end process;

注意:在VHDL-2008中,最小敏感列表为

process (all)
begin
end process;

编辑:关于一般敏感度列表的更多信息。

VHDL 中的仿真是在确定性循环中完成的。对于每个信号分配,所有相关信号也必须更新,因为这就是硬件中发生的事情。

模拟器(例如 modelsim、isim)将逐步执行您的 HDL,确定所有信号变化,然后确定哪些其他信号依赖于这些变化。然后模拟第二组变化并找到另一组相关信号,依此类推。模拟一直持续到 a) 达到稳定状态或 b) 最大迭代次数已经过去。

现在,由于设计很大,需要重新评估每个过程个信号赋值,复杂度爆炸。为防止这种情况,每个进程仅在其敏感列表中的信号 更改 时才重新评估。过去,软件无法自动检测给定过程需要收听(或可以忽略)的所有信号,因此用户必须通过敏感度列表向工具提供提示。

如今,有了 VHDL-2008,软件变得如此智能,CPU 变得如此之快,以至于仿真软件可以简单地分析所有 HDL 并自行确定依赖关系。

现在,为什么 Qint 不在 敏感度列表中?因为 Qint 的变化在 clk 的下一个上升沿之前不会传播到其他信号。它仅在 clk.

的边缘精确采样

因此,Qint 仅用于进程的时钟部分,它本身确实确定另一个信号的状态。

这就是您对寄存器的期望。输入在时钟 rises/falls 时被采样,然后存储并传播到输出。在时钟边沿之间,输入信号可以(而且经常会)发生变化,但会迅速稳定到有效的逻辑状态。

Sigasi checks for incomplete sensitivity lists 在你编码的时候。它还提供了一个快速修复功能,可以自动将缺失的信号添加到列表中。这样你就不用自己担心了。