参考资料
《正点原子逻辑设计指南 V1.9》中关于亚稳态的描述不如优快云上的清楚,《亚稳态的产生机理、消除办法》https://blog.youkuaiyun.com/gordon_77/article/details/79483119
亚稳态的概念
亚稳态的原因:如果数据传输中不满足触发器的Tsu和Th不满足,或者复位过程中复位信号的释放相对于有效时钟沿的恢复时间(recovery time)不满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态,在这段时间里Q端在0和1之间处于振荡状态,而不是等于数据输入端D的值。这段时间称为决断时间(resolution time)。经过resolution time之后Q端将稳定到0或1上,但是稳定到0或者1,是随机的,与输入没有必然的关系。
亚稳态的危害:由于产生亚稳态后,寄存器Q端输出在稳定下来之前可能是毛刺、振荡、固定的某一电压值。在信号传输中产生亚稳态就会导致与其相连其他数字部件将其作出不同的判断,有的判断到“1”有的判断到“0”,有的也进入了亚稳态,数字部件就会逻辑混乱。在复位电路中产生亚稳态可能会导致复位失败。怎么降低亚稳态发生的概率成了FPGA设计需要重视的一个注意事项。
Tsu为建立时间:是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间,如果建立时间不够,数据将不能在这个时钟上升沿被稳定的打入触发器,Tsu就是指这个最小的稳定时间。
Th为保持时间:是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间,如果保持时间不够,数据同样不能被稳定的打入触发器,Th就是指这个最小的保持时间。
Tco为输出时间:是触发器在clk时钟上升沿到来之后需多长的时间才能稳定输出的的时间。
Tmet:亚稳态输出恢复到稳定状态所需的超出Tco的额外时间称为稳定时间,即经过这段时间,亚稳态变成稳态了。
如果数据传输中不满足触发器的Tsu和Th,就会造成数据不稳定,从而导致亚稳态。
亚稳态一般是发生在异步电路设计中,同步电路中也会有,但是不常见。
下图为 两个不同时钟的 寄存器的示意图 ,寄存器 B采样可能采样到寄存器 A输出的任意状态,包括 Q的信号跳变沿 。
但是寄存器的 D端信号需要满足建立时间 Tsu和保持时间 Th要求,否则就会出现 Q端采样到不确定的值的状态,就是俗称的亚稳态。
由图可知,当产生亚稳态后Tco时间后会有Tmet(决断时间)的振荡时间段,当振荡结束回到稳定状态时为“0”或者“1”,这个是随机的。因此,会对后续电路判断造成影响。
采样时采样到不同的电平状态(因为信号跳变沿 是 一个 信号 上升的过程,时钟在信号跳变沿采样会采样到不同的电平),那么 会 导致不同决断时间 决断时间 指的是最终逻辑从不确定值到为 0或者为 1的持续时间。
亚稳态是一个不稳定的状态,这个状态可能会很快迁移到逻辑 1或者逻辑 0的状态。如 下图 所示:绿色表示亚稳态。
说白了,异步电路设计就是要解决亚稳态的问题。异步电路设计一般有几个方法:
⚫ 单 bit信号:直接多级寄存器同步法,一般采用 2-3级寄存器进行同步处理 ,这个 2-3级寄存器也称作同步器,在 ASIC设计中,一般都有提供专用的同步器库,因为同步器要求多级寄存器位置靠的越近越好,靠的越近,亚稳态消失的概率就越大 。 FPGA设计中,直接使用 2-3级寄存器进行同步处理 即可。
⚫ 多 bit信号:异步 FIFO或者使用多次握手同步方法。 在握手协议中,异步的 REQ/ACK也 需要使用 单 bit同步技术进行同步处理,异步 FIFO也是如此。
亚稳态计算
系统亚稳态发生的都是由于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器件;
消除亚稳态的方法
有亚稳态产生,我们就要对亚稳态进行消除,常用对亚稳态消除有三种方式:
(1)对异步信号进行同步处理;
(2)采用FIFO对跨时钟域数据通信进行缓冲设计;
(3) 对复位电路采用异步复位、同步释放方式处理。
总结来说,采用异步复位、同步释放的方法是最优解,但也要根据实际情况进行分析。
这个电路图就是理解异步复位、同步释放的关键了。这里的复位信号直接接到D触发器的异步清零端,也就不存在同步复位中复位信号必须要大于时钟周期才能被检测到的局限。这就是异步复位的意思。同时,reset_out变为高电平是受时钟控制的,也就是所说的同步释放。同步释放避免了异步复位可能产生的不满足复位恢复时间的情况。综上所述,异步复位同步释放机制解决了异步复位和同步复位固有的缺陷,因此将这种方法作为系统复位是极好的选择。
always @ (posedge clk or negedge rst_async_n) begin if (!rst_async_n) begin rst_s1 <= 1'b0; rst_s2 <= 1'b0; end else begin rst_s1 <= 1'b1; rst_s2 <= rst_s1; end end assign rst_sync_n = rst_s2; always @ (posedge clk or negedge rst_sync_n ) begin if (rst_sync_n == 1'b0) y <= 1'b0 ; else y <= b ; end