有一个类似的问题here,并用
回答。是的,
rising_edge()/falling_edge()
仅应用于时钟 信号。尽管它在仿真中起作用,但可能会导致问题和 综合中意想不到的硬件。
使用'event
属性来检测非时钟信号的边沿是否一样,如以下示例所示,是否一样?
process (rndm_sig)
begin
if (rndm_sig'event and rndm_sig = 1) then
-- do something.
end if;
end process;
答案 0 :(得分:5)
综合工具会将任何用作X'event and X= 1
或rising_edge.(X)
的信号视为时钟。
在FPGA中,这意味着路由工具将尝试为信号分配专用的时钟网,其中包含所有内容。例如该信号必须路由到专用时钟输入,这可能导致明显的延迟和与其他信号的偏差。
此外,信号最好“干净”。这意味着如果信号上出现最小的尖峰,则FF将计时。这也意味着,如果您的信号不干净,则某些FF可能会触发,而有些则不会。
计时工具将需要知道周期和高/低时间,并尝试使设置和保持时间与所有其他时钟相对应。这可能会导致重大问题和/或设计中的额外逻辑。如果信号与其他时钟完全不同步,则可能具有元稳定性,并且可能需要在时钟寄存器之后添加同步器。
因此可以归结为:强烈建议 强烈建议 将X'event and X= 1
或rising_edge.(X)
构造仅使用“真实”时钟信号。
同时,数字设计中有一条规则说:如果没有其他解决方案,所有规则都将被淘汰。
在我来自ASIC的行业中,您在打破基本规则之前必须与一些高级设计师交谈。然后,您必须在代码周围添加一些强调的大注释,说明”“是的,这违反了规则,但没有其他方法,因为我们拥有此,此,此并且它已经由X和Y进行了审查和签名” / em>是的,我曾经在设计中使用过闩锁。