为什么打两拍可以解决亚稳态?

为什么经常可以看到跨时钟域的时候,会把信号打两拍?为啥说打两拍就可以解决亚稳态的问题?如果最初采到信号的时候是不稳定的,为什么用两个DFF接一下,就稳定了呢?而且不稳定的值不还是接进来,两个DFF还徒增了延迟,开始我一直没有太明白,其实两级打拍能解决亚稳态,严格意义来说是不准确的,并没有解决,而是阻断了亚稳态的传播。这里先说下两级打拍适用于单bit,慢到快的时钟域情况
基于此我们细说下。

首先亚稳态是这样产生的:
image
这个图其实没有那么准,altera的有个文档里是这样画的:
image
就是说亚稳态的产生不是在tco之后才产生,差不多是th后就产生了,小差异,不影响我们后续的分析。接着说,我们看波形时候,非0即1,实际cmos的电压是曲线的,是抖动上升的,包括时钟也是一样,不是标准的方波,我们在ila里看到的其实可以说是理想波形。所以,当DFF的输入数据,在DFF要求的稳定时间窗口之内发生变化,就会导致DFF没有足够的时间将新数据存进去,DFF的输出就没有那么健壮,从电压上看就会晃啊晃,可能最终能晃到高电平要求的电压标准,这个时候输出就是1,也可能晃不到,那就是0。这个晃的时间,有个名称叫Tmet,中文叫决断时间。这个时间通常是很小很小的,远小于时钟周期,可以贴张图:
image
有个Tmet之后还有个MTBF,全称是mean time between failures,看英文就知道是说发生故障的平均间隔时间,这个的定义如下:
image
其中C1和C2都是器件的特性,常数,改不了,fdata是异步数据的变化率,Tmet是数据亚稳态之后稳定的时间,所以为了使MTBF尽可能大,我们可以做的就是降低时钟周期,或者降低数据变化的频率,或者选择更高级的器件。我们使用这个公式计算下第一级DFF的故障时间,假设:

  • C1为0.0002ns
  • C2为0.17ns
  • Tmet为2.3ns
  • 时钟为200M
  • 数据翻转率为20K
    则根据公式算出来是约260个小时,而如果采样两级打拍,就是两级DFF级联的方式,则直接提升了Tmet的时间,而且是指数级的提升,在上面的条件下,也就是Tmet+Tclk-Tsu(先忽略)=7.3,两级打拍之后的MTBF是1.54×10¹⁵个小时,这个提升是非常可观的,从这个角度说几乎避免了亚稳态的传播。

好了,网上很多解释到这里也就结束了,我那时候不太明白为什么亚稳态对数字系统有这么大的危害,前面提到它可能晃到1也可能晃到0,那我两级之后采到的值,最终输出的值,不也是0或者1吗,结果不一样还是可能错的吗,其实事实就是这样,就是可能最终的值是错的。那为啥还打两拍,所谓阻断亚稳态传播,这个传播的到底是个啥,我在一本书里看到是这样解释的:
image
image
这个解释我觉得挺有道理的,先到这吧

posted @ 2025-09-26 15:57  原声带1993  阅读(32)  评论(0)    收藏  举报