待解决问题
fpga中always块的时钟问题
离问题结束还有0天0小时  |  提问者:Yin9639   |  提问时间:2022-2-14 09:59
同一个工程中的always块都尽量用系统时钟来驱动吗,是不是不提倡这个always用clka驱动,另一个always用clkb驱动
首先,你需要搞清楚,“always块都尽量用同一个时钟来驱动”的根本原理是什么。verilog中,由时钟来驱动的always块,对应到电路是D触发器。
D触发器是我们常听到的名字,它有一个更加让人望文生义的名字——边沿触发型锁存器。即这个锁存器会在时钟的边沿(一般用上升沿)那一时刻把输入信号的电平状态锁住,存到一个反相器互相首尾相连组成的锁存器中。为了保证锁存器锁住一个稳定的0或1状态,而不是锁住一个0~1之间的中间电平产生亚稳态,就需要D触发器的输入信号在时钟上升沿时刻附近保持稳定,这就是我们常说的要满足'setup'和'hold'的条件。为了确保这个条件能满足,我们需要做几件事情:
1. 我们认为所有的信号都应该是从一级D触发器输出到下一级(整个模块输入和输出先不考虑),于是我们要获得所有“输出——输入”路径
2. 每个路径我们可以知道它都经过了那些逻辑器件(与或非门),每个器件的延时我们都能算出最大最小值
3. 再判断这个最大延时和最小延时是否满足setup和hold条件。直白点,就是要看看前一级D触发器输出信号在翻转后,一直传输到下一级D触发器的输入,是否正好碰到它的上升沿附近?
讲到这里,我们就会发现,上面第3步能检查的前提是,“前一级D触发器输出信号翻转的时间与下一级D触发器时钟上升沿的时间必须要有固定的时间差”,这就是我们所说的时钟同步。为了保证前一级D触发器和后一级D触发器所使用的时钟同步,有几个基本条件:
1. 他们的时钟源头必须要相同,即同源。比如两个时钟在物理上最终来自于两个晶振,那是无论如何都不可能同步的;
2. 两个时钟的频率必须是有公约数,这样我们才能遍历出他们之间的所有情况下的边缘时间差
3. 你需要告诉综合工具,他们要求处理成同步。那么,综合工具就会从两个时钟的最源头,一直追溯到这两个D触发器的时钟端,算出他们各自时钟路径的延时。再结合两个时钟频率算出他们上升沿的所有关系,就能知道上面所说的“每个器件的延时最大最小值”是否能满足setup和hold条件
了解完了这么多,回到你的问题,答案就已经很显然了。
“它不提倡always块用clka驱动,另一个用clkb驱动”,无非就是希望你尽量使用同步时序。
但是clka和clkb也可能是同步时钟,只需要这两个时钟满足我上面说的几个基本条件就行了。
而使用同一个时钟clka,也有可能不同步,比如你这两个always块在两个模块里,然后你们各自综合,综合工具并不知道这两个模块的clka就是同一个时钟,如果你在综合时没有清楚地告诉综合工具的话,它们就不是同步是中了。
所以,你上面的描述并不准确
回答时间:2024-1-27 11:37
 
我要回应:  回应字数在5000字以内