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 在你编码的时候。它还提供了一个快速修复功能,可以自动将缺失的信号添加到列表中。这样你就不用自己担心了。
我有这个 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 在你编码的时候。它还提供了一个快速修复功能,可以自动将缺失的信号添加到列表中。这样你就不用自己担心了。