VHDL:对正常信号使用上升沿

问题描述 投票:0回答:1

如果我们按照此接受的答案中的建议生成“clock_enable”信号: 在非时钟信号上使用上升沿是不好的做法吗?有替代方案吗?

喜欢:

signal mySignal_d : std_logic := '0'; 
signal clock_enable: std_logic;
mySignal_d <= mySignal when rising_edge(Clock); 
clock_enable <= not mySignal_d and mySignal; 

可以使用

rising_edge(clock_enable)
吗? 或者使用仍然会更好:

if rising_edge(Clock) then
    if (clock_enable= '1') then

这两者的行为有区别吗?如果是,那为什么?是关于

rising_edge
的实施吗?是否有任何文献或
rising_edge
的开源实现可以准确说明为什么
rising_edge(clock_enable)
会导致问题?

vhdl fpga clock
1个回答
0
投票

任何时候你使用“rising_edge(some_signal)”,那么在模拟中你都会得到类似触发器的行为,其时钟输入连接到“some_signal”,并且正如预期的那样,你将在综合中得到一个触发器。

这当然是允许的,但你可能会在模拟和综合中遇到一些意想不到的问题。

当您将信号连接到触发器的时钟输入时,您必须保证它没有尖峰(“不是 mySignal_d 和 mySignal”不是无尖峰)。仅当信号是时钟信号或者由触发器的 Q 输出创建时,这才是可能的。在任何其他情况下(当信号由某些组合逻辑创建时),信号可能会出现尖峰,这可能会意外触发触发器。这不仅是综合后的问题,而且在模拟中也可能发生(例如由增量周期引起的)。

如果您创建了一个无尖峰信号(通过使用触发器的 Q 输出作为时钟信号)并将其用作生成的时钟信号来触发某些触发器,您必须注意 2 个时钟域之间的数据路径(原始时钟域和生成时钟域)在综合和时序收敛中很难处理。这是因为生成时钟的上升沿被延迟(到原始时钟的上升沿)触发器切换时间(以及一些线路延迟)。该延迟并不稳定,而是取决于温度、电压和工艺偏差。当然,有可以处理此类问题的综合和布局流程,但以正确的方式使用它们通常很困难,并且并不总是能提供时序收敛。

所以回答你的问题,使用“rising_edge(clock_enable)”是不行的,你应该尽可能避免它。

© www.soinside.com 2019 - 2024. All rights reserved.