一、亚稳态
1.定义
亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态引时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。
2.亚稳态产生的原因
在FPGA系统中,如果数据传输中不满足触发器的Tsu和Th,或者复位过程中复位信号的释放相对于有效时钟沿的恢复时间(recovery time)不满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态,在这段时间里Q端在0和1之间处于振荡状态,而不是等于数据输入端D的值,这段时间称为决断时间(resolution time)。经过resolution time之后Q端将稳定到0或1上,但是稳定到0或者1,是随机的,与输入没有必然的关系。
建立时间(Tsu:set up time):
是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间,如果建立时间不够,数据将不能在这个时钟上升沿被稳定的打入触发器,Tsu就是指这个最小的稳定时间。
保持时间(Th:hold time):
是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间,如果保持时间不够,数据同样不能被稳定的打入触发器,Th就是指这个最小的保持时间。
3.为什么触发器要满足建立时间和保持时间?
因为触发器内部数据的形成是需要一定的时间的,如果不满足建立和保持时间,触发器将进入亚稳态,进入亚稳态后触发器的输出将不稳定,在0和1之间变化,这时需要经过一个恢复时间,其输出才能稳定,但稳定后的值并不一定是你的输入值。这就是为什么要用两级触发器来同步异步输入信号。这样做可以防止由于异步输入信号对于本级时钟可能不满足建立保持时间而使本级触发器产生的亚稳态传播到后面逻辑中,导致亚稳态的传播。
(比较容易理解的方式)换个方式理解:需要建立时间是因为触发器的D段像一个锁存器在接受数据,为了稳定的设置前级门的状态需要一段稳定时间;需要保持时间是因为在时钟沿到来之后,触发器要通过反馈来所存状态,从后级门传到前级门需要时间。
4.为什么两级触发器可以防止亚稳态传播?
亚稳态是指触发器无法在某个规定的时间段内到达一个可以确认的状态。两级触发器可防止亚稳态传播的原理:假设第一级触发器的输入不满足其建立保持时间,它在第一个脉冲沿到来后输出的数据就为亚稳态,那么在下 一个脉冲沿到来之前,其输出的亚稳态数据在一段恢复时间后必须稳定下来,而且稳定的数据必须满足第二级触发器的建立时间,如果都满足了,在下一个脉冲沿到 来时,第二级触发器将不会出现亚稳态,因为其输入端的数据满足其建立保持时间。
5.解决亚稳态的方法:
1 降低系统时钟频率
2 用反应更快的 FF
3 引入同步机制,防止亚稳态传播(可以采用前面说的加两级触发器)。
4 改善时钟质量,用边沿变化快速的时钟信号
二、可能出现亚稳态的场合
在同步系统中,输入总是与时钟同步,因此寄存器的 setup time 和 hold time 是满足的,一般情况下是不会发生亚稳态情况的。亚稳态一般是发生在跨时钟传输和异步信号采集中以及复位电路中:
(1)在跨时钟传输中,由于时钟之间存在相移,因此当源寄存器发出数据之后,无法确定在什么时间段到达目的寄存器,因此也不能保证满足目的寄存器的 setup time 和 hold time 要求。
(2)在异步信号采集当中,由于异步信号可以在任何时间点到达目的寄存器,因此也无法满足目的寄存器的setup time和hold time 时间。
(3) 复位电路分为两类,异步复位电路和同步复位电路,都可能出现亚稳态,只不过同步复位电路出现亚稳态的概率较低。
单比特跨时钟域产生的亚稳态
图里就是典型的单比特跨时钟域产生的亚稳态处理方式,通过两级寄存器获得正确的信号电平.
因为真实的信号有上升和下降沿,如果在后一个时钟域的有效沿来临时,与之对应的输入数据Din建立时间或者保持时间不满足,那么这个寄存器(称之为寄存器1号)的输出Ds就是难以预测的未定值.
从T0到未定值结束的持续时间我们叫做resolution time.我们把这个时钟上升沿时刻记为T0.
因为1号的未定输出Ds变化在T0之后,所以2号寄存器并不会在T0时刻取到未定值.那么假如在T0之后的下一个上升沿,命名为T1,来临之前,1号的输出Ds能够稳定,那么2号就能得到稳定的输入并且产生稳定的输出Dout.
注意,只是稳定的信号,并非正确的信号,因为亚稳态稳定后的信号是随机的.等到T1的时候,1号的输入再次取样,之后T1才会有正确的输出.
假若在T1上升沿来临之时,1号的输出还在不稳定状态,那么这个不稳定状态将会延续,也就是说Dout也会变成不稳定状态.在这种情况下,亚稳态就会向后传递,传递的后果取决于系统的健壮性.
异步信号采集
当数据在目的寄存器Tsu-Th时间窗口发生变化(正常情况下到达目的寄存器后不能发生变化),也即当数据的建立时间或者保持时间不满足时,就可能发生亚稳态现象。如图所示:
由图可知,当产生亚稳态后Tco时间后会有Tmet(决断时间)的振荡时间段,当振荡结束回到稳定状态时为“0”或者“1”,这个是随机的。因此,会对后续电路判断造成影响;
复位电路的亚稳态
异步复位电路
在复位电路设计中,复位信号基本都是异步的,常用异步复位电路Verilog描述如下:
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) a <= 1’b0;
else a <= b;
end
综合出来复位电路模型如图所示:
如图所示,为复位电路复位时序图。如果异步复位信号的撤销时间在Trecovery(恢复时间)和Tremoval(移除时间)之内,那势必造成亚稳态的产生,输出在时钟边沿的Tco后会产生振荡,振荡时间为Tmet(决断时间),最终稳定到“0”或者“1”,就会可能造成复位失败;
同步复位电路的亚稳态
在复位电路中,由于复位信号是异步的,因此,有些设计采用同步复位电路进行复位,并且绝大多数资料对于同步复位电路都认为不会发生亚稳态,其实不然,同步电路也会发生亚稳态,只是几率小于异步复位电路。
如下面verilog代码对同步复位电路的描述:
always @(posedge clk)
begin
if(!rst_n) a <= 1’b0;
else a <= b;
end
综合出硬件电路如图所示:
当输入端Din为高电平,而且复位信号的撤销时间在clk的Tsu和Th内时候,亚稳态就随之产生了。如图时序所示,当复位撤销时间在clk的Tsu和Th内,输入数据为“1”,通过和输入数据相与后的数据也在clk的Tsu和Th内,因此,势必会造成类似异步信号采集的亚稳态情况;
亚稳态产生概率以及串扰概率
亚稳态发生概率
由上面分析得知,系统亚稳态发生的都是由于clk的Tsu和Th不满足,又或者是复位信号的移除和恢复时间不满足。常用FPGA器件的Tsu+Th约等于1ns,复位移除和恢复时间相加约等于1ns。
当异步信号不是一组数据,或者信号量较少,那就需要对异步信号进行同步处理,例如对一个异步脉冲信号进行采集,只要脉冲信号变化发生在时钟Tsu和Th窗口内,那就很可能会产生亚稳态,亚稳态产生的概率大概为:
概率 = (建立时间 + 保持时间)/ 采集时钟周期
由公式可以看出,随着clk频率的增加,亚稳态发生的几率是增加的;
例如,为系统采用100M时钟对一个外部信号进行采集,采集时钟周期为10ns,那采集产生亚稳态的概率为:1ns/10ns = 10%
同理采用300M时钟对一个外部信号进行采集,那产生亚稳态的概率为:1ns/3.3ns = 30%
如果采用三相相位差为120°的时钟对一个外部信号进行采集,那产生亚稳态的概率接近90%
所以在异步信号采集过程中,要想减少亚稳态发生的概率:
(1) 降低系统工作时钟,增大系统周期,亚稳态概率就会减小;
(2) 采用工艺更好的FPGA,也就是Tsu和Th时间较小的FPGA器件;
亚稳态的串扰概率
使用异步信号进行使用的时候,好的设计都会对异步信号进行同步处理,同步一般采用多级D触发器级联处理,如图所示,采用三级D触发器对异步信号进行同步处理 。
这种模型大部分资料都说的是第一级寄存器产生亚稳态后,第二级寄存器稳定输出概率为90%,第三极寄存器稳定输出的概率为99%,如果亚稳态跟随电路一直传递下去,那就会另自我修护能力较弱的系统直接崩溃。接下来我们分析这种串扰的概率问题;
如图所示为一个正常第一级寄存器发生了亚稳态,第二级、第三极寄存器消除亚稳态时序模型
由上图可以看出,当第一个寄存器发生亚稳态后,经过Tmet的振荡稳定后,第二级寄存器能采集到一个稳定的值。但是为什么第二级寄存器还是可能会产生亚稳态呢?
由于振荡时间Tmet是受到很多因素影响的,所以Tmet时间又长有短,所以当Tmet时间长到大于一个采集周期后,那第二级寄存器就会采集到亚稳态。如图所示:
由上图可知,第二级也是一个亚稳态,所以在这种情况下,亚稳态产生了串扰,从第一级寄存器传到了第二级寄存器,同样也可能从第二级寄存器串扰到第三级寄存器。这样会让设计逻辑判断出错,产生亚稳态传输,可能导致系统死机奔溃;
亚稳态振荡时间Tmet
亚稳态震荡时间Tmet关系到后级寄存器的采集稳定问题,Tmet影响因素包括:器件的生产工艺、温度、环境以及寄存器采集到亚稳态离稳定态的时刻等。甚至某些特定条件,如干扰、辐射等都会造成Tmet增长;
三、常用对亚稳态消除有三种方式:
(1) 对异步信号进行同步处理;
(2) 采用FIFO对跨时钟域数据通信进行缓冲设计;
(3) 对复位电路采用异步复位、同步释放方式处理;
1.对异步信号进行同步提取边沿(参考上篇检测边沿博客)
在异步通信或者跨时钟域通信过程中,最常用的就是对异步信号进行同步提取边沿处理。
这种边沿提取方式对于一个稳定的系统是不合适的,例如:当第一级寄存器采集到亚稳态,那势必造成sig_nsyn_p输出亚稳态,这样就会对采用sig_nsyn_p的信号进行判断的电路造成影响,甚至判断出错误的值。
根据上面的亚稳态产生概率,如果在100M时种下那第一级寄存器产生亚稳态的概率约为10%,随着系统采集频率升高,那产生亚稳态的概率也会随之上升。因此,在进行异步信号跨频提取边沿时候,一般采用多进行一级寄存器消除亚稳态,可能在系统稳定性要求高的情况下,采用更多级寄存器来消除亚稳态,如程序所示,即为采用4级寄存器消除亚稳态,相应的边沿信号产生的时间就晚了两个时钟周期。
input sig_nsyn;
wire sig_nsyn_p;
reg[3:0] sig_nsyn_r;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) sig_nsyn_r <= 2’d0;
else sig_nsyn_r <= { sig_nsyn_r [2::0], sig_nsyn };//输入信号左移
end
assign sig_nsyn_p = sig_nsyn_r[2] & ~sig_nsyn_r[3];//检测上升沿
2.FIFO进行异步跨频数据处理
当数据流从一个时钟域到另一个时钟域的时候,绝大多数情况下都采用FIFO来作为中间缓冲,采用双时钟对数据缓冲,就可以避免亚稳态的发生;
3.异步复位,同步释放 (参考第一篇复位的博客)
对于复位情况下的亚稳态,常常是由于恢复时间和移除时钟不满足造成的,因此,最常用的处理方式是采用异步复位、同步释放。采用第二级寄存器输出作为全局复位信号输出。