在进行IC/FPGA设计的时候,如果使用了多个频率不同的时钟信号,就有可能产生亚稳态的问题,即某些跨时钟域传输的信号,可能会因为建立时间或保持时间不满足,而出现寄存器采样后数据状态不稳定或未知的情况。如下图所示,在CLK上升沿到来时,D恰好也发生变换,因而D不满足
T
s
e
t
u
p
T_{setup}
Tsetup或者
T
h
o
l
d
u
p
T_{holdup}
Tholdup,所以寄存器的输出就会出现亚稳态的情况。 解决这个问题的一个常见方法就是打两拍,当然该方法主要针对的是单bit信号的跨时钟域传输问题。 如下图所示,我们可以看到,虽然寄存器在采样D1信号时发生了亚稳态,输出Q1处于一个不确定的状态,但是可以肯定的是,这个不稳定的状态不会一直持续下去,它最终会恢复到一个稳定的状态,有可能是0,也有可能是1,而在绝大多数的情况下,这个从不稳定到稳定的时间一般是小于时钟周期的,因此,如果我们在下一个时钟周期再对Q1进行采样,就能得到的一个稳定的、确定的值Q2(当然也不绝对,但是从概率上来说出现亚稳态的几率已经很小了),从而在某种程度上来说,消除了亚稳态现象。
但是,也有例外的情况,如下图所示,Q1信号在下一个时钟上升沿到来之前,仍然处于亚稳态,因此Q2采样得到的也是一个不确定的值,针对这种情况,处理的方法是再打一拍,这是Q3仍然处于亚稳态的概率已经非常低了,几乎可以视作不可能发生。
当然,为了出现亚稳态的几率更小,我们还可以打更多拍,但在实际的工程应用中,打两拍已经满足大多数场景了。
跨时钟域处理(一):两级DFF同步
关注
打赏