简谈FPGA学习中亚稳态现象

说起亚稳态,首先我们先来了解一下什么叫做亚稳态。亚稳态现象:信号在无关信号或者异步时钟域之间传输时导致数字器件失效的一种现象。

接下来主要讨论在异步时钟域之间数据传输所产生的亚稳态现象,以及如何降低亚稳态现象发生的概率(只能降低,不能消除),这在FPGA设计(尤其是大工程中)是非常重要的。

亚稳态的产生:所有的器件都定义了一个信号时序要求,只有满足了这个要求,才能够正常的在输入端获取数据,在输出端输出数据。正常的数据传递是:在触发时钟沿前必须有一小段时间(Tsu)用来稳定输入信号(0 or 1),触发时钟沿之后需要有一小段特定的时间(Th)再次稳定一下,最后再经过一个特定的始终到输出延时(Tco)后才有效。如果数据的传递过程违反了这个时间约束,那么寄存器输出就会出现亚稳态,此时输出的诗句是不稳定的(在0和1之间游荡)。但是这种现象并不是绝对的,但是我们在实际设计中应当尽量避免这种现象。

同步时钟系统由于是同步的,没有两个异步的触发信号对信号的输入输出干扰,所以亚稳态的几率很小。

异步时钟系统:先举个例子,如下:

always @(posedge clk or negedge rst_n)
begin
if(!rstn)
m<=1;
else
m<=0;
end
这是异步的,rst_n的触发和clk的触发各自不相干(造成的亚稳态概率较高)。

always @(posedge clk)
begin
if(!rst_n)
m<=1;
else
m<=0;
end
这是同步的,rst_n在clk上升沿的时候才产生影响,此时造成的亚稳态概率低很多。

异步时钟系统充分的利用了寄存器的端口,无需增加另外的资源,但是亚稳态的概率相对高;

同步时钟系统少用了clk复位端口,额外消耗了了资源,但是降低了亚稳态的发生概率。

上述异步例子中,如果clk上升沿时,rst-n=0,那么执行m<=1;但是rst_n和clk变化的时间差很短,不满足稳态时间要求的就会相互干扰,造成亚稳态的发生。当然有的人会认为同步似乎也会产生这种影响,但是相对而言几率小得多。

在此前提下,在特权同学的书中,提出了异步复位,同步释放的电路概念。(电路网上好多),该电路目的:既不解决了同步复位的资源消耗问题,也极大的降低了异步复位的亚稳态风险。

异步复位:当rst_n= 0 时,一个clk的上升沿,输出的rstn_out=0,实现了异步复位功能(当然这在只有一个寄存器的一级缓冲下也能实现),重点在于同步释放环节。

同步释放:当rst_n在clk上升沿后很短的时间内回归1,那么就会造成前一级的亚稳态的出现,其实后一级也出现了,但是如果rst_n被认为任然是0,那么输出也就是0,如果被认为是1,rstn_out接受的是前一级的上一个输出值(还是0),这就是同步释放的由来,完美解决问题。

这仅是本人学习初学FPGA的学习笔记,仅供参考。

文章转载自: http://blog.chinaaet.com/luhui/p/5100057029