亚稳态
亚稳态是电平介于高低电平之间的一种暂时状态。在同步系统中,当寄存器的信号无法满足建立时间和保持时间时,输出端的信号就可能出现亚稳态。在异步系统中,亚稳态并非一定在建立时间和保持时间无法满足时出现。
受噪声、温度、电压纹波等因素的影响,多数情况下,信号在经过一段时间(受工作条件影响)后会从亚稳态回到一个稳定的状态,然而具体逻辑电平的值是不可预知的(0或1)。
下图以滚球模型形式介绍了寄存器输出的三种可能状态。
亚稳态发生时,寄存器输出信号存在0、1、亚稳态三种可能,可能会导致下级电路出现不可预测的故障行为。不从根本上遏制亚稳态的传输,会增大系统故障概率。
平均故障时间与故障概率
平均故障时间
衡量两次亚稳态导致系统故障的平均时间可以用平均故障时间(MTBF, mean time before failure)表示,
M T B F = e t M E T / C 2 C 1 f c l k 1 f c l k 2 MTBF=\frac {e^{t_{MET} / C_2}} {C_1 f_{clk1} f_{clk2}} MTBF=C1fclk1fclk2etMET/C2
其中 C 1 C_1 C1 C 2 C_2 C2为与工艺、工作条件相关的常量, f c l k 1 f_{clk1} fclk1 f c l k 2 f_{clk2} fclk2为进行同步的两个时钟的时钟频率, t M E T t_{MET} tMET是同步链中所有寄存器输出信号时序裕量之和。由于指数关系,增加 T m e t T_{met} Tmet(提高同步链每级的时序裕量、增加同步链的级数)可以显著提高平均故障时间。
除上述因素外,数据的翻转频率也会影响故障时间,翻转频率越高,故障概率越高。(稳定数据跨时钟传输不易出现亚稳态)
故障概率
如上图,单比特长电平信号的跨时钟域传输通常采用两级触发器同步器,经过两级触发器处理,亚稳态传输到下游触发器后继续输出亚稳态的概率会减小。两级触发器同步出现亚稳态的故障概率是平均故障时间的倒数:
q f a i l u r e = 1 M T B F q_{failure}=\frac {1} {MTBF} qfailure=MTBF1
若设计中存在多个独立的跨时钟域信号,则系统的故障概率为:
Q f a i l u r e = ∑ q f a i l u r e = ∑ 1 M T B F Q_{failure}=\sum q_{failure} = \sum \frac {1} {MTBF} Qfailure=∑qfailure=∑MTBF1
系统的平均故障时间为:
M T B F s y s = 1 ∑ 1 M T B F MTBF_{sys}=\frac 1 {\sum \frac {1} {MTBF}} MTBFsys=∑MTBF11
消除跨时钟域过程的亚稳态
单比特长脉冲、慢时钟到快时钟信号同步
1. 时序逻辑信号同步
亚稳态主要在不同时钟域交界处出现,以下图为例,在某时钟上升沿处,D1的输入端已经建立稳定的逻辑电平,则c1能够正确输出结果;D2的输入端在时钟上升沿后稳定,则c2会比c1落后一个时钟周期,D3在时钟沿上升沿附近跳变,则c3会出现一个亚稳态。
为了减少亚稳态发生的概率,通常采用多级触发器组成同步链 的方式,如下图所示,这种方式可以显著增加平均故障时间。
对于上两张图所示的跨时钟多径信号传输(clk1时钟域下信号a在clk2的扇出大于1),c1、c2、c3对于同一输入b可能产生不同的采样结果,因此对于多径信号传输最好采用先对跨时钟信号同步,再将同步后的信号分发 的方式。
2. 组合逻辑信号同步
组合逻辑各输入信号的时序弧和传输延时存在差异,使得组合逻辑输出端可能出现窄脉冲或毛刺,从而具有更高的信号的翻转率,更短寄存器同步链的故障时间,更高的故障概率。
为了解决组合逻辑的问题,可以采用在源时钟域先采样寄存再同步 的方式,能够显著消除毛刺、窄脉冲,降低输出信号的翻转率。
单比特短脉冲、快时钟到慢时钟信号同步
1. 延长脉冲宽度的同步
如下几幅图所示,短、脉冲信号从快时钟同步到慢时钟时,可能出现信号丢失。
clk1的整个脉冲落在clk2的一个时钟周期内,会出现信号丢失。
clk1的整个脉冲正好落在clk2的一个完整时钟周期,由于信号变化出现在时钟沿附近,容易引起亚稳态,若亚稳态未因此输出信号从旧数据变到新数据,同样会出现信号丢失。
通常情况下,只有当clk1的整个脉冲宽度达到clk2的1.5倍时钟周期时,才能保证脉动信号不被遗漏。
2. 带反馈的同步
采用延长脉动宽度的同步方式依赖于clk1与clk2的周期关系,不具有广泛适用性和可移植性。如下图所示的采用反馈信号的同步方式更具有广泛适用性。
当信号b从低电平翻转到高电平后,clk2对信号b进行两级触发器同步采样得到信号d,clk1通过两级触发器同步采样得到ack2,当ack2的值与a相同为高电平时,同步一定完成,此时信号b返回低电平,再次等到ack2返回低电平,完成一次脉冲信号的传输。
这种采用反馈信号的方式能够保证不会出现信号丢失,然而反馈信号的引入会带来额外的延时,导致操作周期较长。
多比特信号同步
由于亚稳态在传输过程中行为的随机性,多比特数据传输可能存在一个周期的不定态,以下图为例。信号s0, s1通过两级触发器从clk1同步到clk2的信号d0,d1。
当{s0, s1}信号从{1'b0, 1'b1}变到{1'b1, 1'b0}时,{d0, d1}信号在从{1'b0, 1'b1}变到{1'b1, 1'b0}的过程中还可能出现一个周期的{1'b0, 1'b0}或{1'b1, 1'b1}状态。
因此,通常多比特信号的同步需要引入额外的单比特信号作为有效信号。
对于数据流场景,设计没有额外的时间传递同步有效信号,需要使用存储器件处理并行数据的跨时钟域转换,在FPGA上,并行多比特数据的跨时钟域转换需要用到FIFO或DPRAM(Dual Port RAM)。无论哪种方式,都需要保证源时钟域的带宽不高于目的时钟域的带宽,这样才能防止信号丢失。
1. FIFO
采用FIFO进行数据同步还需要确保突发的数据写入量不会导致FIFO溢出,否则除了信号丢失外,还可能导致写指针跑飞。
如下图所示,FIFO的Almost Full / Almost Empty信号在处理跨时钟域情景时能够提供灵活的FIFO控制方式。
下面列举了三种依靠Almost Full / Almost Empty信号握手进行读写异步FIFO,进行数据同步的方式。
A. 慢写入、快读出
这种方式持续写入数据,在Almost Full有效时开始读出数据,直到Almost Empty有效后结束读数据,依次往复。
B. 快写入、慢读出
这种方式持续读出数据,在Almost Empty有效时开始写入数据,直到Almost Full有效后结束写数据,依次往复。
C. 等速传输
这种方式不依赖Almost Full / Almost Empty信号,保证FIFO不会溢出或读空,这种无握手的等速传输一般不如依赖Almost Full / Almost Empty信号可靠。
2. DPRAM
在使用时与FIFO类似,不过需要设计异步时钟间握手信号的产生、同步方式、地址、控制信号的产生。可参考牛客网异步FIFO设计习题如何将DPRAM设计为异步FIFO。