1. 应用背景
1.1亚稳态发生原因
在FPGA系统中,如果数据传输中不满足触发器的Tsu和Th不满足,或者复位过程中复位信号的释放相对于有效时钟沿的恢复时间(recovery time)不满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态,在这段时间里Q端在0和1之间处于振荡状态,而不是等于数据输入端D的值。这段时间称为决断时间(resolution time)。经过resolution time之后Q端将稳定到0或1上,但是稳定到0或者1,是随机的,与输入没有必然的关系。
1.2亚稳态发生场合
只要系统中有异步元件,亚稳态就是无法避免的,亚稳态主要发生在异步信号检测、跨时钟域信号传输以及复位电路等常用设计中。
1.3亚稳态危害
由于产生亚稳态后,寄存器Q端输出在稳定下来之前可能是毛刺、振荡、固定的某一电压值。在信号传输中产生亚稳态就会导致与其相连其他数字部件将其作出不同的判断,有的判断到“1”有的判断到“0”,有的也进入了亚稳态,数字部件就会逻辑混乱。在复位电路中产生亚稳态可能会导致复位失败。怎么降低亚稳态发生的概率成了FPGA设计需要重视的一个注意事项。
2. 理论分析
2.1信号传输中的亚稳态
在同步系统中,输入信号总是系统时钟同步,能够达到寄存器的时序要求,所以亚稳态不会发生。亚稳态问题通常发生在一些跨时钟域信号传输以及异步信号采集上。
它们发生的原因如下:
(1)在跨时钟域信号传输时,由于源寄存器时钟和目的寄存器时钟相移未知,所以源寄存器数据发出数据,数据可能在任何时间到达异步时钟域的目的寄存器,所以无法保证满足目的寄存器Tsu和Th的要求;
(2)在异步信号采集中,由于异步信号可以在任意时间点到达目的寄存器,所以也无法保证满足目的寄存器Tsu和Th的要求;
当数据在目的寄存器Tsu-Th时间窗口发生变化,也即当数据的建立时间或者保持时间不满足时,就可能发生亚稳态现象。如图3.1所示。
由图可知,当产生亚稳态后Tco时间后会有Tmet(决断时间)的振荡时间段,当振荡结束回到稳定状态时为“0”或者“1”,这个是随机的。因此,会对后续电路判断造成影响。
2.2亚稳态产生概率以及串扰概率
在实际的FPGA电路设计中,常常人们想的是怎么减少亚稳态对系统的影响,很少有人考虑怎么才能减少亚稳态发生几率,以及亚稳态串扰的概率问题。
2.2.1 亚稳态发生概率
由上面分析得知,系统亚稳态发生的都是由于clk的Tsu和Th不满足,又或者是复位信号的移除和恢复时间不满足。常用FPGA器件的Tsu+Th约等于1ns,复位移除和恢复时间相加约等于1ns。
当异步信号不是一组数据,或者信号量较少,那就需要对异步信号进行同步处理,例如对一个异步脉冲信号进行采集,只要脉冲信号变化发生在时钟Tsu和Th窗口内,那就很可能会产生亚稳态,亚稳态产生的概率大概为:
概率 = (建立时间 + 保持时间)/ 采集时钟周期 (公式2-1)
由公式2-1可以看出,随着clk频率的增加,亚稳态发生的几率是增加的。
例如,为系统采用100M时钟对一个外部信号进行采集,采集时钟周期为10ns,那采集产生亚稳态的概率为:1ns/10ns = 10%
同理采用300M时钟对一个外部信号进行采集,那产生亚稳态的概率为:1ns/3.3ns = 30%
如果采用三相相位差为120°的时钟对一个外部信号进行采集,那产生亚稳态的概率接近90%
所以在异步信号采集过程中,要想减少亚稳态发生的概率:
(1) 降低系统工作时钟,增大系统周期,亚稳态概率就会减小;
(2) 采用工艺更好的FPGA,也就是Tsu和Th时间较小的FPGA器件;
2.2.2 亚稳态的串扰概率
使用异步信号进行使用的时候,好的设计都会对异步信号进行同步处理,同步一般采用多级D触发器级联处理,如图3.6所示,采用三级D触发器对异步信号进行同步处理。
图2.6 三级寄存器同步
这种模型大部分资料都说的是第一级寄存器产生亚稳态后,第二级寄存器稳定输出概率为90%,第三极寄存器稳定输出的概率为99%,如果亚稳态跟随电路一直传递下去,那就会另自我修护能力较弱的系统直接崩溃。接下来我们分析这种串扰的概率问题。
如图2.7所示为一个正常第一级寄存器发生了亚稳态,第二级、第三极寄存器消除亚稳态时序模型。
图2.7 三级寄存器消除亚稳态
由上图可以看出,当第一个寄存器发生亚稳态后,经过Tmet的振荡稳定后,第二级寄存器能采集到一个稳定的值。但是为什么第二级寄存器还是可能会产生亚稳态呢?
由于振荡时间Tmet是受到很多因素影响的,所以Tmet时间又长有短,所以当Tmet时间长到大于一个采集周期后,那第二级寄存器就会采集到亚稳态。如图2.8所示。
图2.8 二级寄存器亚稳态
由上图可知,第二级也是一个亚稳态,所以在这种情况下,亚稳态产生了串扰,从第一级寄存器传到了第二级寄存器,同样也可能从第二级寄存器串扰到第三级寄存器。这样会让设计逻辑判断出错,产生亚稳态传输,可能导致系统死机奔溃。
2.2.3 亚稳态振荡时间Tmet
亚稳态震荡时间Tmet关系到后级寄存器的采集稳定问题,Tmet影响因素包括:器件的生产工艺、温度、环境以及寄存器采集到亚稳态离稳定态的时刻等。甚至某些特定条件,如干扰、辐射等都会造成Tmet增长。
3 异步复位同步释放
在前面介绍亚稳态的常见情况中,第二种是对异步信号的采集,本文以复位信号为例来说明这种情况。
3.1.复位目的:
对一个芯片来说,复位的主要目的是使芯片电路进入一个已知的,确定的状态。主要是触发器进入确定的状态。在一般情况下,芯片中的每个触发器都应该是可复位的.
复位可以使电路从确定的初始状态开始运行
复位可以使电路从错误状态回到可以控制的确定状态
3.2.同步复位:
当reset信号为active的时候,寄存器在下一个时钟沿到来之后被复位,时钟沿到来之前寄存器还是保持其之前的值。由于只受时钟沿的出发,因此亚稳态的概率会小很多。
Q:同步复位电路也会产生亚稳态吗
A:当复位信号的撤销时间在建立时间和保持时间以内时,也会产生亚稳态。
如下面verilog代码对同步复位电路的描述。
综合出硬件电路如图3.4所示。
图3.4 同步复位电路
在此,我们不讨论同步复位的消耗资源问题,只讨论同步复位的亚稳态产生情况。
当输入端Din为高电平,而且复位信号的撤销时间在clk的Tsu和Th内时候,亚稳态就随之产生了。如图3.5时序所示,当复位撤销时间在clk的Tsu和Th内,输入数据为“1”,通过和输入数据相与后的数据也在clk的Tsu和Th内,因此,势必会造成类似异步信号采集的亚稳态情况。
3.3.异步复位:
当reset信号为active的时候,寄存器立刻被复位,与时钟沿到来与否没有关系
异步复位的亚稳态:当异步复位信号的撤销时间在Trecovery(恢复时间)和Tremoval(移除时间)之间时,输出结果就会出现亚稳态,造成复位失败
recovery time和removal time都是检查异步信号(reset或preset或set)的释放沿,释放沿必须在时钟沿前面提前recovery time释放,或者在时钟沿后removal time之后释放。
由于异步复位信号与时钟无必然联系,两者都是独立的,所以复位信号的释放将有一定的概率导致电路出现亚稳态。但是复位信号的建立是不会产生亚稳态的。
在复位电路设计中,复位信号基本都是异步的,常用异步复位电路Verilog描述如下:
综合出来复位电路模型如图3.2所示:
图3.2 异步复位电路模型
如图3.3所示,为复位电路复位时序图。如果异步复位信号的撤销时间在Trecovery(恢复时间)和Tremoval(移除时间)之内,那势必造成亚稳态的产生,输出在时钟边沿的Tco后会产生振荡,振荡时间为Tmet(决断时间),最终稳定到“0”或者“1”,就会可能造成复位失败。
3.4.异步复位同步释放:
(1)异步复位,同步释放的含义
所谓异步复位同步释放,就是在rst_n信号为低时,立刻进行复位,即复位信号与时钟相互独立;而rst_n信号由低到高释放时,为了防止亚稳态的出现,将rst_n信号用DFF向后延一周期,外部复位信号不会在出现释放时与clk信号竞争,整个系统将与全局时钟clk信号同步
(2)异步复位,同步释放的优点
避免复位信号释放的时候造成亚稳态问题
只要复位信号一有效,电路就处于复位状态,与时钟沿无关
有效捕捉复位,即使是短脉冲复位也不会丢失
有明确的复位撤销行为。复位的撤离是同步信号,因此有良好的的撤离时序和足够的恢复时间。
代码如下所示:其实就是将复位信号打两拍。用1与复位信号本质是一样的。只用考虑复位信号撤销时的亚稳态情况即可。
4 跨时钟域数据同步
下面讨论跨时钟域的第一种情况,也就是进行数据传输。分为单bit和多bit
4.1 单bit跨时钟与
4.1.1电平同步
打两拍
优点:
1、可以解决亚稳态
2、可以是实现慢到快时钟
缺点:
1、不能是实现快到慢,会导致采不到
2、clk2的频率要是clk1的1.5倍
4.1.2 边沿同步
特点:
1、适用于慢到快时钟
2、使输出的脉冲宽度和第二个时钟的宽度一致
4.1.3脉冲同步
对这个电路的理解:在原时钟域做了一个翻转电路,实际上就是将脉冲信号转变为电平信号,也就是展宽。然后将电平信号同步过去,之后再做一个边沿同步,将电平信号转换为脉冲信号。这种适用于需要同步的脉冲比较短,用于从快时钟域向慢时钟域传输。
特点:
1、可以实现快到慢时钟域。
2、输入脉冲的最小间隔必须等于两个新时钟的时钟周期。
4.1.4双握手法
原理
回顾上脉冲同步器基本设计原理:
(1)源时钟域脉冲转换为源时钟域电平信号;
(2)对单bit电平信号进行打拍的异步处理;
(3)在目的时钟域中进行脉冲还原。
从以上设计原理中,我们可以发现该同步器的控制传递是单向的,即仅从源时钟域到目的时钟域,目的时钟域并没有状态反馈。假设存在如下应用:
- 源时钟域中的第一个脉冲和第二个脉冲间隔过短,第一个脉冲未完成同步,第二脉冲又将状态清空,导致最终脉冲同步丢失。
要解决以上同步问题,需要引入异步握手机制,保证每个脉冲都同步成功,同步成功后再进行下一个脉冲同步。握手原理如下:
sync_req: 源时钟域同步请求信号,高电平表示当前脉冲需要同步;
sync_ack: 目的时钟域应答信号,高电平表示当前已收到同步请求;
完整同步过程分为以下4个步骤:
(1) 同步请求产生;当同步器处于空闲(即上一次已同步完成)时,源同步脉冲到达时产生同步请求信号sync_req;
(2) 同步请求信号sync_req同步到目的时钟域,目的时钟域产生脉冲信号并将产生应答信号sync_ack;
(3) 同步应答信号sync_ack同步到源时钟域,源时钟域检测到同步应答信号sync_ack后,清除同步请求信号;
(4) 目的时钟域检测到sync_req撤销后,清除sync_ack应答;源时钟域将到sync_ack清除后,认为一次同步完成,可以同步下一个脉冲。
实际上就是做了一些判断,然后对两个同步信号做了跨时钟域处理。
可以根据下图做一个粗浅的理解
4.2 多bit同步
格雷码 异步fifo Dmux等这些都较为常见也比较容易理解,就不再赘述。
下面讲述一下利用握手信号进行多bit传输的过程。
FIFO可用于在不同的时钟域之间进行数据包的传输,但是在一些应用中,需要在不同时钟域之间进行少量数据的传输。FIFO占用的硬件资源较大,此时可以考虑使用握手同步机制。
以下是握手同步机制的工作步骤:
●用后缀_t表示数据发送端,用后缀_r表示数据接收端。发送端时钟用tclk表示,接收端时钟用rclk表示;
●当需要发送的数据准备好后,发送端将t_rdy信号置为有效;
●在t_rdy有效期间,t_data必须保持稳定;
●接收端在rclk时钟域内采用双同步器同步t_rdy控制信号,并把同步后的信号命名为t_rdy_rclk;
●接收端在发现t_rdy_rclk信号有效时,t_data已经安全地进入了rclk时钟域内,使用rclk对其进行采样,可以得到t_data_rclk。由于数据已经在rclk域进行了正确采样,所以此后在rclk域使用该数据是安全的;
●接收端将r_ack信号置为1;
●发送端通过双同步器在tclk时钟域内同步r_ack信号,同步后的信号命名为r_ack_tclk;
●以上所有步骤被称为“半握手”。这是因为发送端在输出下一个数据之前,不会等到r_ack_tclk被置为0;
●半握手机制工作速度快,但是使用半握手机制时需要谨慎,一旦使用不当,会导致操作错误;
●从低频时钟域向高频时钟域传输数据时,半握手机制较为适用,这是由于接收端可以更快地完成操作。然而,如果从高频时钟域向低频时钟域传输数据,则需要采用全握手机制;
●当r_ack_tclk为高电平时,发送端将t_rdy置为0;
●当t_rdy_rclk为低电平时,接收端将r_ack置为0;
●当发送端发现r_ack_tclk为低电平后,全握手过程结束,发送端可以发送新的数据;
●显然,全握手过程耗时较长,数据传输速率较慢。然而,全握手机制稳定可靠,可以在两个任意频率的时钟域内安全地进行数据传输。
下图所示为全握手机制工作波形图:
下面是一段采用全握手机制的同步桥代码,代码中采用的信号命名方式与以上讲述中略有不同,但整体思路与以上讲述的一致,可以直接例化此同步桥进行跨时钟域的数据同步:
上面代码的思路与使用握手信号进行单bit同步相似,只是在单bit中最终在目的时钟域中使用的数据是用电平转换得到的脉冲,这里使用的数据是直接同步过来的。
5 总结
对这部分知识的梳理关键在于每种方法的适用情况,以及对电路结构的理解。
电平同步和边沿同步是比较基础的。脉冲同步是两者的组合。由于脉冲同步可能发生脉冲变化过快,因此又引入了双握手法。双握手法不仅可以同步单bit,还可以同步多bit。当需要同步少量多bit数据时,适用异步fifo会占用较多的硬件资源,用一些轻巧的方法更合适,此时就选用双握手法。
双握手法是一种很安全的同步方法,但是需要占用过多时钟,一般常用与从快时钟域向慢时钟域同步的过程。脉冲同步也是由快时钟域向慢时钟域同步的方法,可以理解为先将脉冲展宽,同步,然后还原脉冲。电平同步和边沿同步一般可用于慢时钟域向快时钟域的同步。
异步复位同步释放其实就是做了一个打拍处理,这种情况的亚稳态只可能发生在复位信号的撤销上,而不会发生在异步信号的建立上。