在FPGA设计中,经常遇到信号需要在多个时钟域传递的情况。当两个时钟频率不同或者不同源时,信号在传递过程中就有可能产生亚稳态,从而导致实际时序和设计时序不同,破坏整个系统的功能。因此在涉及多时钟域信号传递时,应该尽量做好同步,消除亚稳态。
1.亚稳态的产生:当触发器的要求的建立时间和保持时间不满足时,亚稳态就产生了。表现为触发器的输出处于一个短暂的不稳定状态,需要一段时间来恢复到稳定的0/1状态。当触发器产生亚稳态时,触发器的输出电平在高和低之间振荡,导致触发器输出的转变时间长于触发器的clock-to-output delay(tco),触发器从亚稳态恢复到稳定态的时间长于tco,把超出
建立时间(tSU)和保持时间(tH)所构成的时间窗口越大越有可能进入亚稳态,一般新型器件(往往意味着性能更佳)的时间窗口小于旧器件,因而减小了进入亚稳态的可能性。
2.计算平均无故障时间(MTBF):如式1.1(一级触发器),式1.3(两级触发器)
3.可能产生亚稳态的情况:<1>.输入信号是异步信号;<2>时钟毛刺超出了触发器所能忍受的极限;<3>时钟不同频或者不同源(相位不同);<4>不满足建立时间和保持时间的时间窗。避免亚稳态最显而易见的办法可以从降低时钟频率入手,但在大多数情况都不推荐,一般采用多级触发器来同步(打两拍)。
4.防止亚稳态传播:<1>.多级同步器(打两拍),能降低亚稳态产生的几率,同时引入了延迟。<2>.采用clock boost circuit的多级触发器(将时钟进行倍频后再做同步),Altera称之为Clock Boost或者Clock Doubler,能在一个时钟周期内完成信号的同步。如图1.7
5.亚稳态检测电路:如图1.8
6.特殊的电路:<1>.针对信号周期大于时钟周期的同步电路(慢时钟域到快时钟域)如下,其中Clock Domain 2的触发器一般为2个及以上,此时不存在采不到信号的情况,但是待传递的信号的频率可能会大于实际需要的,因此将两级同步器升级为上升沿或者下降沿或者双沿检测电路。
<2>.针对信号周期小于时钟周期的同步电路(快时钟域到慢时钟域),一般需要在快时钟域将传递信号展宽,可以通过计数器来完成;或者采用握手/反馈机制,当badat2拉高后,即确定adat已经同步到bdat2(假设要传递高电平),则拉低adat或者进行后续操作:
这是利用了脉冲信号的上升沿进行输出脉冲信号,然后通过后面反馈回来的信号进行清零,从而为下一次脉冲控制信号做好准备。需要注意的是,窄脉冲控制信号的产生频率不能太快,也就是需要等到清零信号无效(三个触发器的延时)后才能发出下一个脉冲控制信号,不然后面的慢时钟域采样电路无法识别两次控制信号,而只当成一次控制信号处理(原文地址https://www.cnblogs.com/IClearner/p/6485389.html)。