亚稳态原因:
首先看一下D触发器
在时钟信号的上升沿时刻,D触发器将D端口的数据存储并输出在Q端口。
在实际的D触发器中:
D端口的数据在时钟上升沿的前Tsu时间和时钟上升沿之后的Th时间内数据必须保持稳定。否则D触发器的输出不能快速的到达一个稳定状态。
为什么会出现这种情况呢?
这是由于D触发器原件本身的电路结构导致的。
所以在时钟上升沿之前和之后的一定时间内,都不能发生变化,如果发生变化就会导致D触发器的输出不能达到一个新的稳态,D触发器的输出就会发生震荡,在震荡一段时间后就会达到新的稳态。但新的稳态就不能保证是0还是1,结果是随机的。如下图:
芯片工艺的不同导致震荡的程度不同,还由温度,干扰,辐射,等等一系列的因素。
如果时钟频率过高,震荡就会传到下一级D触发器,下一级触发器的输出也会震荡。
UART串口接收是异步信号,那为什么异步信号会更容易导致亚稳态呢?
那什么是异步信号呢?
异步信号就是信号的驱动端或者是发送方不是与信号的接收端由同一个时钟域的时钟驱动,那么这个信号什么时候发生变化完全就是未知的,是不可控的。所以该数据有更大的概率在D触发器的数据窗口期发生变化,所谓的数据窗口期就是上面讲的D端口的数据在时钟上升沿的前Tsu时间和时钟上升沿之后的Th时间,所以信号在数据窗口期发生变化,就会可能导致接收的D触发器发生亚稳态。
总结就是,异步信号和D触发器不是工作在同一个时钟域,就有更大的概率在数据窗口期发生变化,就跟容易导致D触发器出现亚稳态。
危害:
看下面这个电路
D0在数据窗口期发生变化,导致输出出现亚稳态,导致输出经过dff1和dff2后还没有稳定下来,导致dff1和dff2都进入了亚稳态。导致在一段时间内dff1和dff2的输出不一致。
看下面这个例子
假设 Q1 Q2分别是FIFO的2个写使能信号,那么Q1作为写使能就会从D1开始写,而Q2作为写使能就会从D2开始写,从而丢失了D1数据。
如何解决亚稳态呢?
非常简单 就是用2个级联的D触发器,打2拍,将异步信号转同步信号,将同步后的信号拿来使用。
对于工作时钟频率越高时,可以使用3级或者4级来降低亚稳态现象。
总结: