目录
背景介绍?
什么是亚稳态?
分析亚稳态的来源及如何解决?
参考文献?
产生电路误操作的原因主要有:竞争与冒险(产生毛刺、非预期的值),建立时间和保持时间违规(亚稳态等)等。
关于竞争和险象(冒险)的博文已经写了很多:
组合逻辑中的竞争与险象问题(一)
组合逻辑中的竞争与险象问题(二)
组合逻辑中的竞争与险象问题(三)
组合逻辑中的竞争与险象问题(四)
组合逻辑中的竞争与险象问题(五)
这五部曲详细的讲解了竞争和险象问题,竞争和险象可能导致毛刺,防止毛刺发生的策略,简单说来有:
1、输出信号使用寄存器消除毛刺
2、.采用格雷码消除毛刺
3、卡诺图消除毛刺(添加冗余逻辑)
这篇博文不是讲解组合逻辑中的毛刺消除方法的文章,这里告一段落。
本博文旨在总结稳态和亚稳态的问题。
如果触发器的输入电压采样时间过短,即时序不够,则触发器需要花很长时间来实现输出逻辑达到标准电平,也就是说,电路处于中间态的时间变长,使得电路“反应”迟钝,这就是“亚稳态”。(例如输入信号在时钟有效沿的建立时间和保持时间之间改变了,导致不满足触发器的建立时间或保持时间,导致输出有一段时间的不稳定态,就是亚稳态。)
一个触发器一旦进入亚稳态状态,则无法预测触发器的输出电平,也无法预测什么时候可以稳定在某个确定的电平上,此时触发器的输出端Q在较长时间内处于振荡状态,不等于输入端D。稳定之前的这段时间称作决断时间(resolution time)。经过resolution time之后,输出端Q将会稳定在某个电平上,但是这个稳定之后的电平与输入端D是没有关系的。
在同步系统中,如果触发器的建立时间和保持时间不满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后比较长的一段时间内处于不确定的状态,在这段时间中Q端会出现毛刺,振荡或者固定在某一电压值,而不一定等于数据输入端D的值。这段时间成为决断时间。亚稳态实质是介于“0”和“1”电平之间的一个状态。
亚稳态是触发器的一个固有特性,正常采样也会有一个亚稳态时间。当建立时间和保持时间满足时,触发器会经历采样,亚稳态后,进入一个正确的状态。
这句话值得斟酌,亚稳态是触发器的固有特性,是触发器需要经历的过程,但是正常采样,即使会有一个亚稳态时间,但是亚稳态后,会进入一个正确的状态。于此对比,也即是非正常采样时的亚稳态之后的固定电平不一定是一个正确的状态。
亚稳态是复杂时序电路中无法避免的现象,设计电路时首先要减少亚稳态发生的概率,其次要使系统对产生的错误不敏感。
前者靠同步来实现,后者需要根据不同的设计应用采取不同的处理办法。
下面这部分内容参考自博文:
https://blog.csdn.net/iamsarah/article/details/76222650
https://blog.csdn.net/u013895726/article/details/61200818
只要系统中存在异步元件,则亚稳态是没有办法避免的,亚稳态通常发生在异步信号检测、跨时钟传输和复位电路当中。下面做一个详细的说明。
在同步系统中,输入总是与时钟同步,因此寄存器的setup time和hold time是满足的,一般情况下是不会发生亚稳态情况的。(首先在同步逻辑中只要STA分析过了正常是不会遇到亚稳态问题的。由于在同步逻辑中STA分析以及保证了每个触发器都能满足自己的建立时间以及保持时间。)亚稳态一般是发生在跨时钟传输和异步信号采集中以及复位电路中:
(1)在跨时钟传输中,由于时钟之间存在相移,因此当源寄存器发出数据之后,无法确定在什么时间段到达目的寄存器,因此也不能保证满足目的寄存器的setup time 和hold time要求。
下面就解释为什么在异步逻辑中会发生亚稳态 :
上图所示是简单的在二个时钟域之间的信号传播。由慢时钟域到块时钟域的过程。
上图所示的时序图中可以看到 时钟沿之间的时钟间隔为dC。在这种情况之下可以发现数据的传播能够满足快时钟域的建立时间以及保持时间的要求。
上图所示在此种相位关系的情况下,快时钟沿很难满足建立时间的要求。 由于异步时钟的不确定性所以造成在异步逻辑下很容易出现亚稳态。
信号在不同时钟域之间传递,模型所示由慢时钟域传递到块时钟域。由于异步时钟,所以对于快时钟域而言慢时钟具有不可预测性,如下图所示: (重复第二种情况,但貌似更清晰。)
造成在第二个触发器的Dout输出端输出高电平与低电平之间的一个不稳定状态(亚稳态)。该实例传递信号为单比特信号,对快时钟域的影响一般在捕获数据不正确、寄存器无法正常操作以及也会出现异步复位产生的那些问题。对于多比特数据而言(一般在数据采集,用作数据总线),造成采集数据错误。
亚稳态对于数字电路的危害是很大的,我们一般在数字电路的设计中需要尽可能的避免亚稳态的发生。首先向大家介绍一个经典的同步电路: (https://blog.csdn.net/u013895726/article/details/61918516)
该同步电路基本实现方式就是使用本地时钟将异步输入信号打入本地触发器链中(一般使用二个触发器足够)。如上图所示:Din进入Clock2时钟域的第一个触发器后再进入后一级触发器,后一级触发器输出进入组合逻辑中。
至于为什么双触发器可以用作同步器呢?下面就来解释这个问题:
我们将触发器链的第一个触发器称为FF1第二个称为FF2…..第N个称为FFn。
异步信号Din进入本地时钟域的FF1的D端,由于是异步信号,存在亚稳态的风险(产生亚稳态是由一定概率的),输出是非高非低的一个中间态。此时亚稳态传递到后面的电路,但是亚稳态信号不能够长期保持,亚稳态信号最终自己会变成稳态信号。这时有FF2,在下一个时钟上升沿采集FF1的输出,相当与给出一个时钟周期让亚稳态信号恢复成稳态信号的恢复时间。FF2采集到恢复成为稳态的信号输出。
但靠二级触发器也能不能完全避免亚稳态的发生,以上提到亚稳态信号总会由亚稳态自己变成稳态,但是这个时间不是完全确定的。所以只能说双触发器搭建的同步电路只能一定程度上避免亚稳态的发生(不过经过概率计算,双触发器号称将亚稳态发生的概率减少到了几年发生一次)。不过根据以上分析可以很明显发现触发器链越长发生亚稳态的概率越低,二级触发器之间完全不能有组合逻辑且二级触发器的物理路径越近越好。
一般系统使用二级触发器做同步化处理已经是足够。但注意双触发器作为同步器只能用在单比特数据的传递中。原因很简单,因为同步器输出只能保证是一个稳态不能不能保证是一个确定的值。故多比特数据使用同步器还是会出现乱码的情况。对于多比特数据的操作一般使用异步FiFO。
上图时序反应了时钟双触发器的同步电路最终输出一个稳定的信号。
其实避免亚稳态的发生主要就是避免异步信号的时钟,使用双触发器同步电路的精华就是将异步信号同步化操作。
(2)在异步信号采集当中,由于异步信号可以在任何时间点到达目的寄存器,因此也无法满足目的寄存器的setup time和hold time 时间。
(3) 复位电路分为两类,异步复位电路和同步复位电路。分别介绍一下:
同步复位以及异步复位,以及异步复位,同步释放(撤离)我也有专门的博文讲解:关于复位问题的解惑笔记
先给出异步复位的RTL电路:
如果rst_n信号的撤销在Trecovery和Tremoval之内,那势必会产生亚稳态。输出会在时钟边沿的Tco时间之后产生振荡,在Tmet时间之后稳定在某个电平上,而Tmet时间就是决断时间,这样的话就会造成复位失败。整个过程如下图所示:
更进一步理解异步电路带来的亚稳态问题,我们进一步讨论:
首先介绍恢复时间和去除时间:(参考博文:https://blog.csdn.net/gtkknd/article/details/52792141)
恢复时间(Recovery Time)是指异步控制信号(如寄存器的异步清除和置位控制信号)在“下个时钟沿”来临之前变无效的最小时间长度。这个时间的意义是,如果保证不了这个最小恢复时间,也就是说这个异步控制信号的解除与“下个时钟沿”离得太近(但在这个时钟沿之前),没有给寄存器留有足够时间来恢复至正常状态,那么就不能保证“下个时钟沿”能正常作用,也就是说这个“时钟沿”可能会失效。
去除时间(Removal)是指异步控制信号(如寄存器的异步清除和置位控制信号)在“有效时钟沿”之后变无效的最小时间长度。这个时间的意义是,如果保证不了这个去除时间,也就是说这个异步控制信号的解除与“有效时钟沿”离得太近(但在这个时钟沿之后),那么就不能保证有效地屏蔽这个“时钟沿”,也就是说这个“时钟沿”可能会起作用。
换句话来说,如果你想让某个时钟沿起作用,那么你就应该在“恢复时间”之前是异步控制信号变无效,如果你想让某个时钟沿不起作用,那么你就应该在“去除时间”过后使控制信号变无效。如果你的控制信号在这两种情况之间,那么就没法确定时钟沿是否起作用或不起作用了,也就是说可能会造成寄存器处于不确定的状态。而这些情况是应该避免的。所以恢复时间和去除时间是应该遵守的。
下图为示意图:
再给一幅图,比较建立时间和保持时间、恢复时间和去除时间:(https://blog.csdn.net/u014703817/article/details/53405657)
亚稳态的主要来源是异步逻辑,那么分情况来看:(https://blog.csdn.net/u013895726/article/details/61918516)
1:异步复位通常会存在亚稳态的隐患
如下图所示,复位信号与时钟信号没有任何关系,不在同一时钟域中,显然复位信号与时钟信号是异步关系,异步复位逻辑。
以上介绍了恢复时间以及移除时间的概念,下面用时序图分析,异步复位的危害:
上图这种情况,可见,复位信号的无效状态(高电平无效)在恢复时间之外,即满足恢复时间的要求,留给寄存器足够长的时间恢复正常状态。
在上如所示中,复位信号能够满足Recovery信号的要求,接着给出一种违反恢复时间的时序图:
Recovery违例,(复位无效状态离时钟上升沿太近,触发器来不及恢复正常状态)在这种情况下,由上图明显看出来,触发器会进入亚稳态。
同步复位:
直接给出同步复位的RTL电路:
当输入端din为高电平的时候,复位信号的撤销正好位于setup 和 hold之间,那么与din相与之后的信号也在clk信号的setup和hold之间,亚稳态肯定也随之产生。这种情况下的同步复位是失败的。整个过程如下图所示:
对亚稳态的情形一般有三种处理方法:
a.对异步信号进行同步处理
b.采用FIFO对跨时钟信号进行缓冲设计
c.对复位信号采用异步复位、同步处理的方法(异步复位,同步撤离见博文:关于复位问题的解惑笔记)
这三种处理方法其实本质上都是在进行同步处理, 也就是运用同步器进行处理。而同步器的一般设计方法就是把将两个触发器级联,第一个触发器看做预处理器,主要是对数据进行缓冲,使得数据在传入第二个触发器之前稳定下来。
高性能FPGA系统——时序设计与分析
李锐博恩的博客
数字电路中的亚稳态产生原因和处理方法
更多参考文献在文章中已经给出。