跨时钟域学习记录(一)

亚稳态

亚稳态是电平介于高低电平之间的一种暂时状态。在同步系统中,当寄存器的信号无法满足建立时间和保持时间时,输出端的信号就可能出现亚稳态。在异步系统中,亚稳态并非一定在建立时间和保持时间无法满足时出现。

受噪声、温度、电压纹波等因素的影响,多数情况下,信号在经过一段时间(受工作条件影响)后会从亚稳态回到一个稳定的状态,然而具体逻辑电平的值是不可预知的(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。

相关推荐
南宫生1 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__1 小时前
Web APIs学习 (操作DOM BOM)
学习
ThreeYear_s3 小时前
基于FPGA 的4位密码锁 矩阵键盘 数码管显示 报警仿真
fpga开发·矩阵·计算机外设
数据的世界014 小时前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐4 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
OopspoO6 小时前
qcow2镜像大小压缩
学习·性能优化
A懿轩A6 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
居居飒7 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
kkflash37 小时前
提升专业素养的实用指南
学习·职场和发展
1 9 J8 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法