我有这个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;
我的问题是:如果我想要MINIMAL敏感度列表,我必须在敏感度列表中写出哪些信号?
答案 0 :(得分:6)
您必须在您的敏感度列表中包含所有已读取的信号,而不是在您的过程的时钟部分内。
您异步读取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
仅用于过程的时钟部分,并且本身确定另一个信号的状态。
这就是你对寄存器的期望。当时钟上升/下降时,输入被采样,然后存储并传播到输出。在时钟中间边缘之间,输入信号可以(并且经常会)改变,但很快就会稳定到有效的逻辑状态。
答案 1 :(得分:1)
Sigasi checks for incomplete sensitivity lists。它还提供快速修复功能,可自动将缺失的信号添加到列表中。这样你就不必再担心这个了。