来自此处的代码: http : //esd.cs.ucr.edu/labs/tutorial/latch.vhd 为什么“ data_in”需要在灵敏度列表中? 我知道流程需要它进行分配,但是流程基于启用输入起作用。 谢谢 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我有这个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
仅用于该过程的计时部分,它本身可以确定另一个信号的状态。
这就是您期望注册的内容。 当时钟上升/下降时对输入进行采样,然后将其存储并传播到输出。 在时钟边沿之间,输入信号可以(并且经常会)改变,但很快会稳定为有效的逻辑状态。
Sigasi在编写代码时检查不完整的敏感性列表 。 它还提供了快速修复功能,可以自动将丢失的信号添加到列表中。 这样,您就不必再为此担心。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.