VHDL中的最小灵敏度列表

1 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;
Run Code Online (Sandbox Code Playgroud)

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

FRo*_*Rob 6

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

你异步读D和E. 您将clk作为注册的一部分阅读.因此,你必须包括它们.

process (D, E, clk)
begin
end process;
Run Code Online (Sandbox Code Playgroud)

注意:在VHDL-2008中,最小灵敏度列表是

process (all)
begin
end process;
Run Code Online (Sandbox Code Playgroud)

编辑:一般来说更多关于灵敏度列表.

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

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

现在,由于设计庞大,需要重新评估每个信号分配的每个过程,因此复杂性会爆炸.为了防止这种情况,只有当灵敏度列表中的信号发生变化时,才会重新评估每个过程.在当天,软件无法自动检测为给定进程监听(或可能忽略)所需的所有信号,因此用户必须通过灵敏度列表为工具提供提示.

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

现在,为什么Qint 不在灵敏度列表中呢?因为变化Qint不会传播到其他信号,直到下一个上升沿clk.它仅在边缘处精确采样clk.

因此,Qint仅用于处理的时钟部分,并且其本身确定另一信号的状态.

这就是你对寄存器的期望.当时钟上升/下降时,输入被采样,然后存储并传播到输出.在时钟中间边缘之间,输入信号可以(并且经常会)改变,但很快就会稳定到有效的逻辑状态.