繁体   English   中英

何时必须将信号插入到过程的灵敏度列表中

[英]When must a signal be inserted into the sensitivity list of a process

当架构中声明的信号必须插入到进程的敏感列表中时,我感到很困惑。

在任何情况下都可以遵循一般法律吗?

当我必须在过程灵敏度列表中包含信号时,我真的很难理解。

“一般法则”就是这样

您的流程需要知道的有关需求变化的任何内容都在敏感列表中。


对于具有同步复位的典型可合成寄存器:

process (clk) is
begin
    if rising_edge(clk) then
        if reset = '1' then
             -- do reset things
        else
             -- read some signals, assign some outputs
        end if;
    end if;
end process;

只有时钟需要在列表中,因为其他所有内容只在时钟发生变化时才会被查看(由于if rising_edge(clk)语句)。


如果需要异步重置:

process (clk, reset) is
begin
    if reset = '1' then
        -- do reset things
    elsif rising_edge(clk) then
        -- read some signals, assign some outputs
    end if;
end process;

然后reset信号也必须在灵敏度列表中,因为您的设计需要在每次更改时检查它的值,而不管时钟在做什么。


对于组合逻辑,我完全避免使用过程,因为保持灵敏度列表保持最新的问题,然后模拟的可能性与合成代码的行为不同。 VHDL-2008中的all关键字已经缓解了这一点,但我仍然没有发现自己想要编写冗长复杂的组合逻辑,这样一个过程会有所帮助。

如果信号位于过程的灵敏度列表中,则该过程将“唤醒”并在该信号的值发生变化时进行评估。 如果它不在灵敏度列表中,则信号可能会发生变化,但不会重新评估过程以确定新输出应该是什么。

对于组合逻辑:可能您希望所有输入信号都包含在灵敏度列表中。 如果它们不包含在灵敏度列表中,那么即使输入信号发生变化,也会导致输出不变。 这是一个常见错误(由于疏忽)。 请注意,在VHDL 2008中,您可以使用“all”关键字自动包含流程中的所有必要信号,并避免创建锁存器。

对于同步逻辑:可能您只想在灵敏度列表中显示您的时钟(可能还有您的重置)信号。 这是因为当您的系统时钟发生变化时,您只关心信号的值(时钟除外)。 这是因为您通常会描述仅允许在时钟边沿上更改其输出值的寄存器(由触发器组成)。

在使用HDL进行综合的情况下,所有这些都可能令人困惑,因为您在VHDL中描述的电路的子集实际上只能在FPGA中实现。 例如,您不能拥有对两个独立时钟边沿敏感的原始存储元件,即使您可以通过在灵敏度列表中包含两个时钟来描述这样的电路。

此外,综合工具(在这种情况下谈论Xilinx XST)并不一定总是尊重过程灵敏度列表。 如果您未能列出在过程体中评估其值的所有进程,则XST将发出警告,表示它将假定其值已评估的信号位于敏感性列表中。 这可能会导致行为模拟与实际硬件之间的差异。 记在心上。

...另外,请注意,灵敏度列表一旦合成就不会影响您的设计行为。 它仅在模拟期间使用。 因此,通过更改敏感度列表,可以很容易地在RTL和合成代码之间引入行为差异。

Josh给出的规则是好的,但最重要的是,阅读你的工具给你的警告并采取行动。 他们通常会检查灵敏度列表是否正确并标记出任何问题。 Emacs VHDL模式还有一个更新灵敏度列表的命令,它通常很擅长。


嗯,忍者

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM