分享

详解异步时钟域和亚稳态

 xpxys99 2019-08-20

什么是亚稳态

触发器的建立时间和保持时间在时钟上升沿左右定义了一个时间窗口,如果触发器数据输入端口上的数据在这个时间窗口内发生变化(或者数据更新),那么就会产生时序违规。存在这个时序违规是因为违反了建立时间要求和保持时间要求,此时触发器内部的一个节点(一个内部节点或者要输出到外部节点)可能会在一个电压范围内浮动,无法稳定在逻辑0或者逻辑1状态。换句话说,如果数据在上述窗口中被采集,触发器中的晶体管不能可靠地设置为逻辑0或者逻辑1对应的电平上。所以此时的晶体管并未处于饱和区对应的高或者低电平,而是在稳定到一个确定电平之前,徘徊在一个中间电平状态(这个中间电平或许是一个正确值,又或许不是)。如图3-5所示,这就是所谓的亚稳态。

详解异步时钟域和亚稳态

图3-5 异步时钟域亚稳态波形图

由图3-5中的波形,信号的跳变发生在建立和保持边界组成的时间窗口内,这意味着输出不会是逻辑0或逻辑1对应的确定电平,而是它们之间的一个中间电平。如果触发器包含有一个输出缓冲,那么亚稳态本身就可以称为随着内部信号的逐渐稳定而在输出上表现出的杂散过渡。输出保持亚稳态的时间是随机的,甚至可能在整个时钟周期内都保持亚稳态。那么,如果这个亚稳态值输入到组合逻辑,根据逻辑门电路的切换门槛,错误的操作就可以发生。从时序收敛的角度来说,要求两个触发器之间的组合逻辑延时都要小于最小的时钟周期,但是这种亚稳态信号保持亚稳态的时间本身就变相地增加了逻辑延时。很显然,一个亚稳态信号会给设计带来致命的功能故障,而且该信号也将无法在各个时钟沿上采集到一致的结果。

亚稳态发生场合

只要系统中有异步元件,亚稳态就是无法避免的。亚稳态主要发生在异步信号检测、跨时钟域信号传输以及复位电路等常用设计中。

亚稳态危害

理论上讲,如果亚稳态不能够在一个时钟周期内返回到稳定态,那么目的寄存器也会发生亚稳态,这就是亚稳态的传播。

亚稳态的毛刺直接输出,有可能导致系统错误。比如毛刺信号送给CPU做中断,可能导致CPU产生错误的中断响应。

采样到错误的电平,导致功能错误。这是逻辑设计人员最容易遇到的问题。最典型的例子是,假设有一个4位one-hot编码的状态机。正常的功能只有四个状态0、2、4、8,但是这个状态机有多个异步输入信号,那么就会发生亚稳态。我们知道,亚稳态返回到1或者0是随机的,这样就会导致状态机的输入有非法的组合,使状态机进入到非法状态{1,3,5,6,7,9,10,…}。如果状态机没有安全编码保护,状态机就会挂死在非法状态。

破坏Block RAM的内容。在读取RAM时,如果生成读地址的时钟和RAM的读时钟是异步的,那么读取也会破坏RAM的内容。这基本上是因为读RAM会伴随一个自动的回写动作,这是大多数CMOS FPGA的特性。回写的时候,由于在地址上发生了亚稳态,导致某一个地址的内容回写到了另外的地址上,从而破坏了RAM的内容。

产生亚稳态后,寄存器Q端输出在稳定下来之前可能是毛刺、振荡、固定的某一电压值。在信号传输中产生亚稳态就会导致与其相连的其他数字部件将其判断为不同的判断,有的判断到“1”有的判断到“0”,有的也进入了亚稳态,数字部件就会逻辑混乱。在复位电路中产生亚稳态可能会导致复位失败。

怎么减少亚稳态的发生

怎么降低亚稳态发生的概率成了FPGA设计需要重视的一个注意事项。

使用异步信号时,好的设计都会对异步信号进行同步处理,同步一般采用多级D触发器级联处理,如图3-6所示,采用两级D触发器对异步信号进行同步处理。

详解异步时钟域和亚稳态

图3-6 经过两级触发器同步

还有一种方法是用异步FIFO缓存。

最后一种不可忽略的措施是异步复位,同步释放。

复位情况下的亚稳态常常是由恢复时间和移除时钟不满足造成的,因此最常用的处理方式是采用异步复位、同步释放的方法。采用第二级寄存器输出作为全局复位信号输出。

异步复位处理程序示例如下。

详解异步时钟域和亚稳态

详解异步时钟域和亚稳态

案例:亚稳态导致通信异常

FPGA开发中,遇到最多的就是异步时钟域了。

检查初学者的代码,发现最多的就是这类问题,异步时钟域同步化是FPGA设计者最基本的技能。

很多初学者没有进行同步化处理,设计的程序也能工作。但是工作时间长的话,就会出现不稳定的现象,或者出现瞬间的不稳定。从外面现象上没有表现出来,比如CPU通过FPGA读取外部存储器(存储的为图像数据或者模拟量参数)在某一瞬间发生数据读取错误,但是CPU判断不出来,还是认为正确。

还有一种情况,就是高低温试验,很多试验出问题后,回去查代码发现都是由异步时钟域没有同步引起的。

笔者经历的一个负面案例是:将一个64 kHz的电信号转换为2 MHz的光模块信号,最高速率才2 MHz,2 MHz是64的32倍;但就是这个程序,笔者用2 MHz时钟首先监测64 kHz信号,将其中的有效数据提出来,然后用2 MHz的速度发送出去;程序调试好之后,基本通信十几秒肯定就会出错,最后发现是对输入的64 kHz信号没有进行2 MHz同步化,同步两拍后,连续工作几天都没有出错。

请慎重对待异步时钟域的问题!

前方高能,请注意了

这是一个神奇的圈子,这里不仅有最优质的资源,还有其他的惊喜在等待着你,让我们一探究竟,看看到底还有什么!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多