【FPGA】几种时序问题的常见解决方法-------3

清明小长假过去了,同学来了,这几天潇洒了几天,陪同学逛真的是累的哼哧哼哧的。今天写一下时许问题常见的跨时钟域的亚稳态问题。

----------------------------------------------------------------------------------------

先说明一下亚稳态问题:

    D触发器的原理图和程序:

【FPGA】几种时序问题的常见解决方法-------3_第1张图片

D触发器有个明显的特征就是建立时间(setup time)和保持时间(hold time)

【FPGA】几种时序问题的常见解决方法-------3_第2张图片

参照上图的下方,如果输入信号在建立时间和保持时间发生变化,则可能产生亚稳态,如果在时钟上升沿也就是D触发器采样期间,输入点评判断为1则输出为1,如果是0则输出为0,另外一种情况就是在时钟上升沿时,D在发生变化,在中间思考跳转很久,但不知道Dinput跳到0还是1(此状态出现概率非常低,但会出现)到下一个时钟还没有思考好是0还是1,没有出现稳定状态,这就是亚稳态。[1]

总结:在FPGA系统中,如果数据传输中不满足触发器的Tsu和Th不满足,或者复位过程中复位信号的释放相对于有效时钟沿的恢复时间(recovery time)不满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态,在这段时间里Q端在0和1之间处于振荡状态,而不是等于数据输入端D的值。这段时间称为决断时间(resolution time)。经过resolution time之后Q端将稳定到0或1上,但是稳定到0或者1,是随机的,与输入没有必然的关系。[2]

    总结亚稳态问题产生场景:1)跨时钟域的信号传输,由于源信号时钟与目的信号时钟的相移未知,可能导致保持时间和建立时间条件不满足,从而产生亚稳态现象。2)异步信号,最常见的为异步复位信号,由于异步信号不与触发器同步时钟同步,所以可能导致保持时间和建立时间条件不满足,产生亚稳态现象。

    (建立时间保持时间条件:数据在建立时间和保持时间保持稳定)

    ---------------------------------------------------------------------------------------------

    亚稳态导致的后果:

    一般情况下亚稳态产生的后果为产生不可预知的数据,或者在前面所述亚稳态第三种情况可能导致系统崩溃。在数据表现方面来说会产生毛刺、突变等现象。影响系统后续的逻辑判断和程序整体运行走向。

    一般FPGA的建立时间和保持时间加起来为1ns左右,所以可以根据概率论来计算亚稳态产生的概率,也就是同步时钟周期的倒数。

--------------------------------------------------------------------------------------------------------

亚稳态的串扰,也就是D触发器处于震荡状态时会影响后续触发器的状态,一般来说如果震荡状态不超过同步时钟周期,也就不会串扰下一个触发器导致下一个触发器也产生振荡,一般工程上来讲串两至三个触发器基本就可以保证不串扰。(是可能不串扰,不是一定不串扰,串扰的可能性很小)

--------------------------------------------------------------------------------------------------------------

    针对上述的亚稳态问题,常见的解决方法:

    1)通过对异步信号边沿提取实现异步信号同步处理,在边沿提取过程中也要防止亚稳态串扰,进行多寄存器缓存减小亚稳态串扰的可能性。

    2)通过FIFO实现异步信号同步处理。

    3)对于异步时钟通过异步复位同步释放的方法实现亚稳态大可能的消除:

        异步复位,同步释放就是对异步复位时钟进行两次或两次以上缓存,尽可能的减少亚稳态信号进入到系统内部。

always @ (posedge clk, negedge rst_async_n)  
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  

assign rst_sync_n = rst_s2;   
endmodule 

在进行异步复位同步释放的时候一定能够要进行至少两次缓存,这样才能保证亚稳态串扰的可能性大大降低。(上述代码为两次缓存)


-----------------------------------------------------------------------------------------------------------------

[1]http://blog.chinaaet.com/yuwoo/p/5100017267

[2]http://blog.chinaunix.net/uid-25553717-id-3286143.html

你可能感兴趣的:(FPGA)