首页 > 解决方案 > 在 VHDL 中,如果信号不是时钟,我可以使用 signal'event 吗?

问题描述

我正在尝试清理我的 VHDL 代码。我有一个不是 clk 的信号。

我可以编写如下所示的事件更改监视器吗?如何编译它以便可以合成它?(见代码)我尝试了几种排列,但我无法编译它。如果信号不是 CLK,signal'event 会编译吗?如果是,它是如何完成的?我在网络和其他文献上看到它可以完成,但我看到的所有示例都显示 CLK'event。

signal cntr: unsigned(15 downto 0) := (others => '0');

...
process(CLK):
begin

IF rising_edge(CLK) THEN
    if (cntr'event) then
        do something;
    end if;
or...
    if(cntr(0)'event) then
        do something;
    end if;
END IF;
end process;

我得到以下信息和其他信息:无法合成包含孤立的“事件”预定义属性的条件

标签: vhdl

解决方案


rising_edge(CLK)已经是一个事件,使您的设计同步,这很好。正如评论中所说,只有时钟信号应该使用它。
即使在那个时候看另一个在同步设计中也没有意义,因为这两个信号不会同时完全改变,从而产生竞争条件。或者实际上是时钟中的时钟,以及合成错误......
它可能在模拟中起作用,但不要依赖这个事实。

用 HDL 语言进行编程的常规方法是将信号的先前值保存在同一时钟上(例如cntr_d <= cntr),并与先前的值进行比较。这允许查找信号是否上升(之前为 0,当前为 1)、下降、更改(不同)......
而且该方法非常适合合成!


推荐阅读