亚稳态的产生机理、消除办法 (能够理解为何打拍)

亚稳态的产生机理、消除办法  (能够理解为何打拍)

https://blog.csdn.net/gordon_77/article/details/79483119异步

 

1. 应用背景

1.1         亚稳态发生缘由

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

1.2         亚稳态发生场合

      只要系统中有异步元件,亚稳态就是没法避免的,亚稳态主要发生在异步信号检测、跨时钟域信号传输以及复位电路等经常使用设计中。设计

1.3         亚稳态危害

      因为产生亚稳态后,寄存器Q端输出在稳定下来以前多是毛刺、振荡、固定的某一电压值。在信号传输中产生亚稳态就会致使与其相连其余数字部件将其做出不一样的判断,有的判断到“1”有的判断到“0”,有的也进入了亚稳态,数字部件就会逻辑混乱。在复位电路中产生亚稳态可能会致使复位失败。怎么下降亚稳态发生的几率成了FPGA设计须要重视的一个注意事项。3d

2. 理论分析

2.1         信号传输中的亚稳态

     在同步系统中,输入信号老是系统时钟同步,可以达到寄存器的时序要求,因此亚稳态不会发生。亚稳态问题一般发生在一些跨时钟域信号传输以及异步信号采集上。blog

它们发生的缘由以下:token

(1)在跨时钟域信号传输时,因为源寄存器时钟和目的寄存器时钟相移未知,因此源寄存器数据发出数据,数据可能在任什么时候间到达异步时钟域的目的寄存器,因此没法保证知足目的寄存器Tsu和Th的要求;资源

(2)在异步信号采集中,因为异步信号能够在任意时间点到达目的寄存器,因此也没法保证知足目的寄存器Tsu和Th的要求;rem

 

 

当数据在目的寄存器Tsu-Th时间窗口发生变化,也即当数据的创建时间或者保持时间不知足时,就可能发生亚稳态现象。如图2.1所示。
                         
                                                                  图 2.1  亚稳态产生示意图
       由图可知,当产生亚稳态后Tco时间后会有Tmet(决断时间)的振荡时间段,当振荡结束回到稳定状态时为“0”或者“1”,这个是随机的。所以,会对后续电路判断形成影响。

 

2.2         复位电路的亚稳态

2.2.1    异步复位电路

在复位电路设计中,复位信号基本都是异步的,经常使用异步复位电路Verilog描述以下:get

always @(posedge clk or negedge rst_n)input

begin

       if(!rst_n) a <= 1’b0;

       else         a <= b;

end

 

 

综合出来复位电路模型如图2.2所示:
                     
                                                   图 2.2  异步复位电路模型

 

如图2.3所示,为复位电路复位时序图。若是异步复位信号的撤销时间在Trecovery(恢复时间)和Tremoval(移除时间)以内,那势必形成亚稳态的产生,输出在时钟边沿的Tco后会产生振荡,振荡时间为Tmet(决断时间),最终稳定到“0”或者“1”,就会可能形成复位失败。
                             
                                                                 图2.3  异步复位时序
 

2.2.1.1 恢复和去除时间(Recovery and Removal Time)

恢复时间(Recovery Time)是指异步控制信号(如寄存器的异步清除和置位控制信号)在“下个时钟沿”来临以前变无效的最小时间长度。这个时间的意义是,若是保证不了这个最小恢复时间,也就是说这个异步控制信号的解除与“下个时钟沿”离得太近(但在这个时钟沿以前),没有给寄存器留有足够时间来恢复至正常状态,那么就不能保证“下个时钟沿”能正常做用,也就是说这个“时钟沿”可能会失效。

去除时间(Removal)是指异步控制信号(如寄存器的异步清除和置位控制信号)在“有效时钟沿”以后变无效的最小时间长度。这个时间的意义是,若是保证不了这个去除时间,也就是说这个异步控制信号的解除与“有效时钟沿”离得太近(但在这个时钟沿以后),那么就不能保证有效地屏蔽这个“时钟沿”,也就是说这个“时钟沿”可能会起做用。

 

换句话来讲,若是你想让某个时钟沿起做用,那么你就应该在“恢复时间”以前是异步控制信号变无效,若是你想让某个时钟沿不起做用,那么你就应该在“去除时间”事后使控制信号变无效。若是你的控制信号在这两种状况之间,那么就无法肯定时钟沿是否起做用或不起做用了,也就是说可能会形成寄存器处于不肯定的状态。而这些状况是应该避免的。因此恢复时间和去除时间是应该遵照的。

2.2.2    同步复位电路的亚稳态

     在复位电路中,因为复位信号是异步的,所以,有些设计采用同步复位电路进行复位,而且绝大多数资料对于同步复位电路都认为不会发生亚稳态,其实否则,同步电路也会发生亚稳态,只是概率小于异步复位电路。

以下面verilog代码对同步复位电路的描述。

always @(posedge clk)

begin

       if(!rst_n) a <= 1’b0;

       else         a <= b;

end

 

综合出硬件电路如图2.4所示。
                         
                                                                                图2.4  同步复位电路

在此,咱们不讨论同步复位的消耗资源问题,只讨论同步复位的亚稳态产生状况。

 

      当输入端Din为高电平,并且复位信号的撤销时间在clk的Tsu和Th内时候,亚稳态就随之产生了。如图3.5时序所示,当复位撤销时间在clk的Tsu和Th内,输入数据为“1”,经过和输入数据相与后的数据也在clk的Tsu和Th内,所以,势必会形成相似异步信号采集的亚稳态状况。
                            
                                                                     图2.5  同步复位电路时序图

2.3         亚稳态产生几率以及串扰几率

      在实际的FPGA电路设计中,经常人们想的是怎么减小亚稳态对系统的影响,不多有人考虑怎么才能减小亚稳态发生概率,以及亚稳态串扰的几率问题。

2.3.1    亚稳态发生几率

      由上面分析得知,系统亚稳态发生的都是因为clk的Tsu和Th不知足,又或者是复位信号的移除和恢复时间不知足。经常使用FPGA器件的Tsu+Th约等于1ns,复位移除和恢复时间相加约等于1ns。

      当异步信号不是一组数据,或者信号量较少,那就须要对异步信号进行同步处理,例如对一个异步脉冲信号进行采集,只要脉冲信号变化发生在时钟Tsu和Th窗口内,那就极可能会产生亚稳态,亚稳态产生的几率大概为:

                                              几率 = (创建时间 + 保持时间)/ 采集时钟周期                                                                            (公式3-1)

      由公式3-1能够看出,随着clk频率的增长,亚稳态发生的概率是增长的。

      例如,为系统采用100M时钟对一个外部信号进行采集,采集时钟周期为10ns,那采集产生亚稳态的几率为:1ns/10ns = 10%

      同理采用300M时钟对一个外部信号进行采集,那产生亚稳态的几率为:1ns/3.3ns = 30%

      若是采用三相相位差为120°的时钟对一个外部信号进行采集,那产生亚稳态的几率接近90%

     因此在异步信号采集过程当中,要想减小亚稳态发生的几率:

  (1) 下降系统工做时钟,增大系统周期,亚稳态几率就会减少;

  (2) 采用工艺更好的FPGA,也就是Tsu和Th时间较小的FPGA器件;

2.3.2    亚稳态的串扰几率

     使用异步信号进行使用的时候,好的设计都会对异步信号进行同步处理,同步通常采用多级D触发器级联处理,如图2.6所示,采用三级D触发器对异步信号进行同步处理。

                             
                                                                                 图2.6  三级寄存器同步

      这种模型大部分资料都说的是第一级寄存器产生亚稳态后,第二级寄存器稳定输出几率为90%,第三极寄存器稳定输出的几率为99%,若是亚稳态跟随电路一直传递下去,那就会另自我修护能力较弱的系统直接崩溃。接下来咱们分析这种串扰的几率问题。

     如图2.7所示为一个正常第一级寄存器发生了亚稳态,第二级、第三极寄存器消除亚稳态时序模型。

                              
                                                                  图2.7 三级寄存器消除亚稳态

  由上图能够看出,当第一个寄存器发生亚稳态后,通过Tmet的振荡稳定后,第二级寄存器能采集到一个稳定的值。可是为何第二级寄存器仍是可能会产生亚稳态呢?

 

     因为振荡时间Tmet是受到不少因素影响的,因此Tmet时间又长有短,因此当Tmet时间长到大于一个采集周期后,那第二级寄存器就会采集到亚稳态。如图2.8所示。
                        
                                                                         图2.8  二级寄存器亚稳态
      由上图可知,第二级也是一个亚稳态,因此在这种状况下,亚稳态产生了串扰,从第一级寄存器传到了第二级寄存器,一样也可能从第二级寄存器串扰到第三级寄存器。这样会让设计逻辑判断出错,产生亚稳态传输,可能致使系统死机奔溃。

2.3.3    亚稳态振荡时间Tmet

      亚稳态震荡时间Tmet关系到后级寄存器的采集稳定问题,Tmet影响因素包括:器件的生产工艺、温度、环境以及寄存器采集到亚稳态离稳定态的时刻等。甚至某些特定条件,如干扰、辐射等都会形成Tmet增加。

3. 应用分析

有亚稳态产生,咱们就要对亚稳态进行消除,经常使用对亚稳态消除有三种方式:

(1)       对异步信号进行同步处理;

(2)       采用FIFO对跨时钟域数据通讯进行缓冲设计;

(3)       对复位电路采用异步复位、同步释放方式处理。

3.1.1    对异步信号进行同步提取边沿

在异步通讯或者跨时钟域通讯过程当中,最经常使用的就是对异步信号进行同步提取边沿处理。对一个异步信号进行提取上升沿一般采用程序清单 4.1所示。

程序清单 4.1 双极寄存器提取边沿

input      sig_nsyn;

wire        sig_nsyn_p;

reg[1:0]   sig_nsyn_r;

always @(posedge clk or negedge rst_n)

begin

       if(!rst_n) sig_nsyn_r <= 2’d0;

       else         sig_nsyn_r <= { sig_nsyn_r [0], sig_nsyn };

end

 

assign     sig_nsyn_p = sig_nsyn_r[0] & ~sig_nsyn_r[1];

       这种边沿提取方式对于一个稳定的系统是不合适的,例如:当第一级寄存器采集到亚稳态,那势必形成sig_nsyn_p输出亚稳态,这样就会对采用sig_nsyn_p的信号进行判断的电路形成影响,甚至判断出错误的值。

根据3.3.1小节的亚稳态产生几率,若是在100M时种下那第一级寄存器产生亚稳态的几率约为10%,随着系统采集频率升高,那产生亚稳态的几率也会随之上升。所以,在进行异步信号跨频提取边沿时候,通常采用多进行一级寄存器消除亚稳态,可能在系统稳定性要求高的状况下,采用更多级寄存器来消除亚稳态,如程序清单 4.2所示,即为采用4级寄存器消除亚稳态,相应的边沿信号产生的时间就晚了两个时钟周期。

程序清单 4.2 多级寄存器提取边沿信号

input      sig_nsyn;

wire        sig_nsyn_p;

reg[3:0]   sig_nsyn_r;

always @(posedge clk or negedge rst_n)

begin

       if(!rst_n) sig_nsyn_r <= 2’d0;

       else         sig_nsyn_r <= { sig_nsyn_r [2::0], sig_nsyn };

end

 

assign     sig_nsyn_p = sig_nsyn_r[2] & ~sig_nsyn_r[3];

3.1.2    FIFO进行异步跨频数据处理

当数据流从一个时钟域到另外一个时钟域的时候,绝大多数状况下都采用FIFO来做为中间缓冲,采用双时钟对数据缓冲,就能够避免亚稳态的发生。

3.1.3    异步复位,同步释放

对于复位状况下的亚稳态,经常是因为恢复时间和移除时钟不知足形成的,所以,最经常使用的处理方式是采用异步复位、同步释放。经常使用电路模型如所示。采用第二级寄存器输出做为全局复位信号输出。

程序清单 4.3  异步复位处理

wire        sys_rst_n;

reg [1:0]  rst_r;

always @(posedge clk or negedge rst_n)

begin

       if(!rst_n) rst_r <= 2’d0;

       else         rst_r <= {rst_r[0], 1’b1};

end

assign     sys_rst_n = rst_r[1];

 

经过上面三种方式处理异步信号、异步数据、以及异步复位可有效的提升系统的稳定性。减小亚稳态的产生.
 一般咱们使用复位信号有这几种方式:
(1)异步复位  
always@(posedeg clk or negedge rst_n)

 

(2)同步复位
 module system_ctr (

          input   clk        ,
          input   reset_l    ,
          output  reg   reset_out 
                 );

reg   reset_d   ;
always @ (posedge clk )
begin
    reset_d <= reset_l     ;
    reset_out<= reset_d    ;
end
endmodule
                      
reset_out信号是已经同步过的复位信号,能够直接在其它模块使用。须要注意的是,这个复位信号会延迟几个时钟周期。而且,复位信号必需要大于时钟周期,才能被系统检测到。
(3)异步复位同步释放

reset_out信号是已经同步过的复位信号,能够直接在其它模块使用。须要注意的是,这个复位信号会延迟几个时钟周期。而且,复位信号必需要大于时钟周期,才能被系统检测到。

module test(

 

     input   clk          ,
     input   reset_l      ,
     output  reg   reset_out 
          );

reg   reset_d   ;
always @ (posedge clk or negedge reset_l)
begin
         if(!reset_l)begin
            reset_out  <= 1'b0  ;
            reset_d    <= 1'b0  ;
         end
         else begin
             reset_d   <= 1'b1      ;
             reset_out <= reset_d   ;
         end
end
endmodule
这个电路图就是理解异步复位、同步释放的关键了。这里的复位信号直接接到D触发器的异步清零端,也就不存在同步复位中复位信号必需要大于时钟周期才能被检测到的局限。这就是异步复位的意思。同时,reset_out变为高电平是受时钟控制的,也就是所说的同步释放。同步释放避免了异步复位可能产生的不知足复位恢复时间的状况。综上所述,异步复位同步释放机制解决了异步复位和同步复位固有的缺陷,所以将这种方法做为系统复位是极好的选择。
相关文章
相关标签/搜索