数字电路中的亚稳态产生原因和处理方法

最近在异步FIFO设计中,遇到了对跨时钟信号的同步处理,主要是为了降低亚稳态出现的概率。因此这篇文章主要讲一下亚稳态出现原因以及处理办法。

(一)亚稳态的出现原因

亚稳态主要是指触发器在某一段时间内不能达到一个确定的状态。一个触发器一旦进入亚稳态状态,则无法预测触发器的输出电平,也无法预测什么时候可以稳定在某个确定的电平上,此时触发器的输出端Q在较长时间内处于振荡状态,不等于输入端D。这段时间称作决断时间(resolution time)。经过resolution time之后,输出端Q将会稳定在某个电平上,但是这个稳定之后的电平与输入端D是没有关系的。

亚稳态出现的主要原因是因为触发器无法满足setup time或者hold time。亚稳态在在输出稳定下来之前有可能是毛刺、振荡、固定的某一电平值,因此会导致逻辑误判;并且在没有稳定下来之前,输出在0-1之间的值还会使得下一级电路进入亚稳态状态。逻辑误判可以通过一些设计技巧进行改善(grey编码),但是亚稳态的传输会扩大故障,难以处理。

只要系统中存在异步元件,则亚稳态是没有办法避免的,亚稳态通常发生在异步信号检测、跨时钟传输和复位电路当中。下面做一个详细的说明。

在同步系统中,输入总是与时钟同步,因此寄存器的setup time和hold time是满足
的,一般情况下是不会发生亚稳态情况的。亚稳态一般是发生在跨时钟传输和异步信号采集中以及复位电路中:

(1)在跨时钟传输中,由于时钟之间存在相移,因此当源寄存器发出数据之后,无法确定在什么时间段到达目的寄存器,因此也不能保证满足目的寄存器的setup time 和hold time要求。

(2)在异步信号采集当中,由于异步信号可以在任何时间点到达目的寄存器,因此也无法满足目的寄存器的setup time和hold time 时间。

(3) 复位电路分为两类,异步复位电路和同步复位电路。分别介绍一下:

a.异步复位电路:异步复位电路的verilog编码如下:

always @(posedge clk or negedge rst)
begin
if(!rst) dout<=0;
else dout<=din;
end

综合出来的电路如下图所示:

如果rst信号的撤销在Trecovery和Tremoval之内,那势必会产生亚稳态。输出会在时钟边沿的Tc2q时间之后产生振荡,在Tmet时间之后稳定在某个电平上,而Tmet时间就是决断时间,这样的话就会造成复位失败。整个过程如下图所示:

b.同步复位电路:其verilog实现如下:
always @(posedge clk)
begin
if(!rst) dout<=0;
else dout<=din;
end

该代码综合出来的硬件电路如下图所示:

当输入端din为高电平的时候,复位信号的撤销正好位于setup 和 hold之间,那么与din相与之后的信号也在clk信号的setup和hold之间,亚稳态肯定也随之产生。这种情况下的同步复位是失败的。整个过程如下图所示:

(二)对亚稳态的处理

对亚稳态的情形一般有三种处理方法:

a.对异步信号进行同步处理

b.采用FIFO对跨时钟信号进行缓冲设计

c.对复位信号采用异步复位、同步处理的方法

这三种处理方法其实本质上都是在进行同步处理, 也就是运用同步器进行处理。而同步器的一般设计方法就是把将两个触发器级联,第一个触发器看做预处理器,主要是对数据进行缓冲,使得数据在传入第二个触发器之前稳定下来。

以上就是亚稳态的相关知识。

文章来源:正在努力的ICer的博客