亞穩態的產生機理、消除辦法 (能夠理解爲何打拍)

亞穩態的產生機理、消除辦法  (能夠理解爲何打拍)

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變爲高電平是受時鐘控制的,也就是所說的同步釋放。同步釋放避免了異步復位可能產生的不知足復位恢復時間的狀況。綜上所述,異步復位同步釋放機制解決了異步復位和同步復位固有的缺陷,所以將這種方法做爲系統復位是極好的選擇。
相關文章
相關標籤/搜索