亚稳态及跨时钟域问题

一、时钟源

根据时钟源在数字设计模块中位置的不同,可以将时钟源分为外部时钟源和内部时钟源。

1. 外部时钟源

外部时钟源主要包括RC/LC 振荡电路和无源/有源晶体振荡器。

RC/LC 振荡电路利用正反馈或负反馈电路来产生周期性变化的时钟信号。此类时钟源电路简单,频率变化范围大,但工作频率较低,稳定度不高。

无源/有源晶体振荡器利用石英晶体的压电效应(压力和电信号可以相互转换)来产生谐振信号。此类时钟源频率精度高,稳定性好,噪声低,温漂小。有源晶振中,往往还加入了压控或温度补偿,时钟的相位和频率都有较好的特性。但电路实现相对复杂,频带较窄,频率基本不能调节。

2. 内部时钟源

内部时钟源主要为锁相环(PLL, Phase Locked Loop)。
锁相环利用外部输入的参考信号控制环路内部振荡信号的频率和相位,实现输出信号频率对输入信号频率的自动跟踪,通过反馈通路将信号倍频到一个较高的固定频率。
在这里插入图片描述
一般晶振由于工艺与成本原因,做不到很高的频率,利用 PLL 电路就可以实现稳定且高频的时钟。因此,数字系统往往会采用外部晶振输入、内部 PLL 进行倍频的方案。再根据设计需求进行时钟分频或时钟切换。

二、同步时钟和异步时钟

1. 同步时钟

数字设计中,一般认为,频率相同或频率比为整数倍、相位相同或相位差固定的两个时钟为同步时钟。或者理解为,时钟同源且频率比为整数倍的两个时钟为同步时钟。 因为时钟同源就保证了时钟相位差是固定的。以下情况下的时钟可以认为是同步时钟:

同源同频同相位

此类时钟频率和相位均相同,是同步的。 时钟间数据传输只要满足正常的建立时间和保持时间即可,不需要特殊的同步设计。

同源同频不同相位

两个时钟同频但不同相位时,只要相位差保持固定,也可以认为是同步的。固定的相位差可以理解为同源时钟下两个时钟因路径不同而导致的偏移。 因此只要保证在两个时钟间传输的数据信号延迟,固定的控制在合理范围内,就不会导致时序问题。
在这里插入图片描述

同源不同频但存在整数倍分频比

此情况一般为一个时钟是另一个时钟的分频,即便存在相位差也是固定的。比如当单 bit 信号从慢时钟域传递到快时钟域时,因为同源,只要满足建立时间和保持时间,快时钟域总会采集到从慢时钟域传递来的信号。
在这里插入图片描述

2. 异步时钟

时钟相位关系不可控的时钟为异步时钟。以下情况下的时钟可以认为是异步时钟:

不同源

由两个不同的时钟源产生的两个时钟是异步的,这是最常见的异步时钟。 即便两个时钟频率相同,但是也不能保证每次上电后两者的相位或相位差是相同的,所以信号间的传输与时钟关系也是不确定的。

没有固定的相位关系

此时两个时钟间相位差也可能会有多个,例如同源的 7MHz 时钟和 3MHz 时钟,他们之间也会出现多个相位差,时序也不好控制。 一般情况下也需要当异步时钟处理。

另外,如果信号在快时钟域翻转速率过快,慢时钟域可能不会安全的采集到从快时钟域传来的信号,这也可以认为是异步问题。

三、时钟域

所谓时钟域(clock domain),就是同一个时钟驱动的区域。这里的驱动,是指时钟刷新D触发器的事件,体现在verilog中就是always的边沿触发信号。

1. 单时钟域

单时钟域数字系统指只有一个时钟的数字系统。
在这里插入图片描述
在单时钟域系统中,数据的发送和接收为同一个时钟。

2. 多时钟域

多时钟域数字系统指一个数字系统中有两个或两个以上的时钟。
在这里插入图片描述
在多时钟域系统中,数据的发送和接收可能为不同的时钟。若launch和capture两个时钟是同步时钟就是同步时钟域; 若launch和capture两个时钟是异步时钟就是异步时钟域。在这种情况下可能存在跨时钟域的问题。

四、亚稳态

1. 什么是亚稳态

亚稳态是指触发器违背了建立时间和保持时间,无法在某个规定时间内达到一个确定的状态, 在这种情况下无法预测该触发器的输出电平(不确定是 0 还是 1),也无法预测何时输出才能够稳定下来(通常情况下,一个时钟、或者两个时钟的时间之内可以返回稳态)。在这里插入图片描述
由于产生亚稳态后,寄存器Q端输出在稳定下来之前可能是毛刺、振荡、固定的某一电压值。在信号传输中产生亚稳态就会导致与其相连其他数字部件将其作出不同的判断,有的判断到“1”有的判断到“0”,有的也进入了亚稳态,数字部件就会逻辑混乱。

2. 如何解决亚稳态

故障间隔平均时间MTBF(Mean Time Between Failure)是衡量一个产品(尤其是电器产品)的可靠性指标。
亚稳态不能从根本上消除,但是可以通过采取一定的初始使其对电路造成的影响降低。
在这里插入图片描述
其中,C1和C2代表器件的相关的常数,器件的建立时间和保持时间越小,C2越小,MTBF就越大。所以可以通过更快的触发器,来减少亚稳态发生的概率
如果要增大寄存器从时钟沿上升触发后的时序余量时间,则可以通过减少两个寄存器之间的延时Tdata。因此,最好不要在两个寄存器之间添加任何逻辑

以上方法不改变数字设计电路,下面介绍如何改变设计来解决跨时钟域导致的亚稳态问题。

五、跨时钟域问题

1. 单bit数据传输

1)频率相等,相位差固定

当launch和capture clock频率相等,相位差固定时,有可能出现亚稳态,但只需要满足建立、保持时间即可消除。

2)频率不同

高频采低频(电平同步器+边沿同步器)

当capture clock的频率大于launch clock的频率时,有可能出现亚稳态,不可能出现漏采,但可能会采到冗余信号。
在这里插入图片描述
在时钟域B下的脉冲信号pulse_b在时钟域A看来,是一个很宽的“电平”信号,保持多个clk_a的时钟周期,所以一定能被clk_a采到。
经验设计打两拍(电平同步器)。第一拍将输入信号同步化,同步化后的输出可能带来建立/保持时间的冲突,产生亚稳态。需要再寄存一拍,减少亚稳态带来的影响。
在这里插入图片描述
但是当capture clock的频率大于launch clock的频率时,虽然不可能出现漏采,但可能会采到冗余信号。因此,一般会用边沿同步器来剔除冗余信号。如下图所示,前面两级用于同步,后一级用于边沿检测。
在这里插入图片描述
一般来说两级是最基本要求,如果是高频率设计,则需要增加寄存级数来大幅降低系统的不稳定性。也就是说采用多级触发器来采样来自异步时钟域的信号,级数越多,同步过来的信号越稳定。

低频采高频(电平同步器+脉冲同步器)

当capture clock的频率小于launch clock的频率时,有可能出现亚稳态,还可能出现漏采。
在这里插入图片描述
pulse_a至少维持一个clk_b的周期才能保证快的A域信号可以在慢的B域的时钟上升沿采集到;但是对于脉冲信号,宽度又没有那么够,又如何能保证它被采集到呢?
一般会采用脉冲同步器。将原时钟域下的脉冲信号,转化为电平信号(异或门或选择器),再进行同步,同步之后,再把新时钟域下的电平信号转化为脉冲信号(边沿检测的原理)。这样就从快时钟域取出一个单时钟宽度脉冲,在慢时钟域建立新的单时钟宽度脉冲。
在这里插入图片描述

需要注意的是因为 “打两拍是为了在单bit传输时尽可能的防止亚稳态的传递但是不能保证采样数据的正确性。这种“采样的正确性如何保证”需要根据信号的具体类型、目的及应用场景等来进行具体的讨论。比如trigger Signal,一个用来开机、启动的脉冲信号。它没什么数据信息量,早一个clk、晚一个clk都ok,反正能起作用就行。因此唯一要保证的是,原始异步脉冲信号至少保持2T!(保证打两拍后,能sample到有效信号)。如下图所示:
a)中,异步data持续2T;FF1 采样到亚稳态时,FF2在下一cycle 对亚稳态的采样是0;但再过一个cycle最终sample到了正确的data值1。
b)中,异步data持续2T;FF1 采样到亚稳态时,FF2在下一cycle 对亚稳态的采样是1;但再过一个cycle最终sample到了正确的data值1。
在这里插入图片描述

2. 多bit数据传输

FIFO(First in First Out)是一种先进先出的数据缓冲器,通常用于接口电路的数据缓存。与普通存储器的区别是没有外部读写地址线,可以使用两个时钟分别进行读和写操作。
FIFO常见的参数:
FIFO宽度:一次读写数据的数据位;
FIFO深度:可以存储多少个N位的数据(FIFO宽度为N);
空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow);
满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow);
读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据;
写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据;
写指针:总是指向下一个将要被写入的单元,复位时,指向第 1 个单元(编号为 0);
读指针:总是指向当前要被读出的数据,复位时,指向第 1 个单元(编号为 0)。
FIFO设计的关键在于产生可靠的FIFO读写指针和生成FIFO“空”/“满”状态标志。
当读写指针相等时,表明FIFO为空;当读写指针再次相等时,表明FIFO为满,这种情况发生在,当写指针转了一圈,折回来(wrapped around)又追上了读指针。
为了区分到底是满状态还是空状态,可以采用以下方法:
在指针中添加一个额外的位(extra bit),当写指针增加并越过最后一个FIFO地址时,就将写指针这个未用的MSB加1,其它位回零。对读指针也进行同样的操作。此时,对于深度为2n的FIFO,需要的读/写指针位宽为(n+1)位,如对于深度为16的FIFO,需要采用5bit的计数器,00000~10000、10001~11111,MSB作为折回标志位,而低4位作为地址指针。
如果两个指针的MSB不同,说明写指针比读指针多折回了一次;如r_addr=00000,而w_addr = 10000,为满;如果两个指针的MSB相同,则说明两个指针折回的次数相等。其余位相等,说明FIFO为空;
但是这个办法主要用于同步FIFO判断空满。

因为将一个二进制的计数值从一个时钟域同步到另一个时钟域的时候很容易出现问题,因为采用二进制计数器时所有位都可能同时变化,在同一个时钟沿同步多个信号的变化会产生亚稳态问题。而使用格雷码只有一位变化,因此在两个时钟域间同步多个位不会产生问题。所以需要一个二进制到gray码的转换电路,将地址值转换为相应的gray码,然后将该gray码同步到另一个时钟域进行对比,作为空满状态的检测。
格雷码域判断空与满:
对于“空”的判断依然依据二者完全相等(包括MSB);
而对于“满”的判断,如下图,由于gray码除了MSB外,具有镜像对称的特点,当读指针指向7,写指针指向8时,除了MSB,其余位皆相同,不能说它为满。因此不能单纯的只检测最高位了,在gray码上判断为满必须同时满足以下3条:
1. wptr和同步过来的rptr的MSB不相等,因为wptr必须比rptr多折回一次;
2. wptr与rptr的次高位不相等,如上图位置7和位置15,转化为二进制对应的是0111和1111,MSB不同说明多折回一次,111相同代表同一位置;
3. 剩下的其余位完全相等。
在这里插入图片描述
对于二进制码来说,用最高位用来判断读空和写满,而对于格雷码来说是要用高两位来判断读空和写满。
在双时钟 FIFO 结构中,写端口和读端口分别有独立的时钟,所有与写相关的信号都是同步于写时钟 wrclk 的,所有与读相关的信号都是同步于读时钟 rdclk 的。
双时钟 FIFO 的一个典型应用就是异步数据的收发,所谓异步数据是指数据的发送端和接收端分别使用不同的时钟域。在写时钟域下将数据放入缓存区,读时钟域下将数据读取出来。使用双时钟 FIFO 能够将不同时钟域中的数据同步到所需的时钟域系统中。
在这里插入图片描述
如果单比特信号从高频时钟域同步到低频时钟域,如果只采用打拍的方式,会出现数据漏采的情况,所以一般使用脉冲同步或者握手信号的方式实现信号的同步。但是多比特信号如果经过跨时钟域处理时,一般会进行格雷码的编码,然后进行打拍处理,或者使用FIFO进行数据的同步。

总结

亚稳态与设计可靠性有非常密切的关系,因此,要减小亚稳态发生的概率,并降低系统对亚稳态错误的敏感程度来提高系统的稳定性、可靠性。

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值