時鍾切換電路(無毛刺)——clock switching glitch free


0.引言

隨着越來越多的多頻時鍾被應用在今天的芯片中,尤其是在通信領域中,經常需要在芯片運行時切換時鍾線的源時鍾。這通常是通過在硬件中復用兩個不同的頻率時鍾源,並通過內部邏輯控制多路選擇器選擇線來實現的。

這兩個時鍾頻率可能彼此完全無關聯,或者它們可以是彼此之間存在倍數的關系。在這兩種情況下,都有可能在切換時在時鍾線上產生毛刺(glitch)。時鍾線上的毛刺對整個系統來說是十分危險的,因為它可以被一些寄存器解釋為捕獲時鍾邊緣(滿足建立時間等),而其他寄存器忽略此毛刺,則整個系統數據出現混亂。

本文將會介紹兩種時鍾切換方法,分別對應兩種情況,第一種時兩個時鍾源的頻率呈倍數關系,第二種是兩個時鍾源完全沒有關系。

1.時鍾切換的毛刺問題

切換電路:

 

圖1:實時時鍾切換

 

   電路語言描述:

 assign outclk = (clk1 & select) | (~select & clk0);

  當SELECT變化時,可能會由於從當前時鍾源的輸出立即切換到下一個時鍾源而引起毛刺。當前時鍾(Current Clock)是當前SELECT選擇的時鍾源,而下一個時鍾(Next Clock)是對應於新SELECT值的時鍾源。

 

圖2:實時時鍾切換時序

  仿真結果:

 

圖3:實時時鍾切換仿真

 

 

   圖2中的時序圖和圖3的仿真結果顯示了當SELECT控制信號發生變化時,輸出時鍾如何產生毛刺(glitch)。這種切換導致的問題是切換控制信號(SELECT)可以相對於源時鍾的任何時間發生改變(本質是SELECT信號完全異步),從而產生了切斷輸出時鍾或在輸出處產生毛刺的潛在可能。SELECT控制信號最有可能是由兩個源時鍾中的任一個驅動的寄存器生成的,這意味着它要么與兩個時鍾具有已知的時序關系,要么這兩個時鍾是彼此的倍數,或者如果源時鍾不存在任何的關系,則它可能與至少一個時鍾異步。

  在不知道這些時鍾的頻率或相位關系的情況下,需要避免在任一時鍾的高狀態期間進行切換。固定延遲可用於引起兩個源時鍾的開始和停止時間之間的間隔,但僅當兩個時鍾源之間存在固定關系時可以使用。它不能在輸入頻率未知或時鍾不相關的情況下使用。

2.相關時鍾切換的毛刺避免Glitch protection for related clock sources

  在圖4中給出了防止時鍾切換導致輸出毛刺的解決方案,其中兩個時鍾源頻率成倍數關系。在每個時鍾源的選擇路徑中插入下降沿觸發的D觸發器。在時鍾的下降沿上用寄存器寄存一下SELECT控制信號,以及僅在其他時鍾被取消選擇之后才啟用選擇(既先屏蔽舊時鍾,然后在開啟新時鍾),從而在輸出端防止毛刺的產生。

  在時鍾的下降沿處寄存SELECT信號,保證在任意一個時鍾處於高電平時,時鍾輸出(CLOCK_OUT)中不發生變化,從而防止對輸出時鍾進行切割(Chopping)。從一個時鍾選擇到另一個時鍾的反饋使得在開始下一個時鍾的傳播之前必須等待當前時鍾的取消,從而避免任何毛刺的產生。

 

圖5:相關時鍾無毛刺切換電路

 

圖6:相關時鍾無毛刺切換時序

 

   電路語言描述:

  reg     out1;
  reg     out0;
  always @(negedge clk1 or negedge rst_n)begin
      if(rst_n == 1'b0)begin
          out1 <= 0;
      end
      else begin
          out1 <= ~out0 & select;
      end
  end
  ​
  ​
  always @(negedge clk0 or negedge rst_n)begin
      if(rst_n == 1'b0)begin
          out0 <= 0;
      end
      else begin
          out0 <= ~select & ~out1;
      end
  endassign outclk = (out1 & clk1) | (out0 & clk0);

  圖6顯示了SELECT信號從0到1的轉換時,首先在CLK0的下降沿時停止了CLK0的輸出,然后在CLK1的下降沿處的開始輸出CLK1時鍾到OUT CLOCK。

  仿真結果:

  亞穩態問題:

  在該電路中,有三個時序路徑需要特別考慮:SELECT控制信號到兩個下降沿觸發觸發器中的任一個、DFF0輸出到DFF1的輸入以及DFF1的輸出到DFF0的輸入。如果在這三個路徑中的任何一個信號與目標觸發器時鍾的捕獲邊緣(這里是下降沿)同時變化,那么該寄存器的輸出可能變為亞穩態,這意味着它可能進入理想的“1”和理想的“0”之間的狀態。時鍾多路復用器和另一觸發器的使能反饋可以對亞穩態進行不同的解釋。因此在異步接口中,需要把兩個觸發器的捕獲邊沿和SELECT信號的變換沿(SELECT信號的上升沿)分開,避免亞穩態的產生。這可以容易地通過使用適當的多周期保持約束或最小延遲約束(時序約束)來實現,因為兩個時鍾之間的時序關系是已知的。

3.時鍾容錯

  在芯片啟動時間,兩個觸發器DFF0和DFF1都應該重置為“0”狀態,使得時鍾中的任何一個都不被作為初始傳播。通過在“零”狀態下啟動觸發器,將容錯建立在時鍾切換中。

  假設其中一個時鍾由於啟動時的故障而沒有切換。如果與故障時鍾相關聯的觸發器已在“1”狀態啟動,則它將阻止選擇其他時鍾作為下一個時鍾,並且由於缺少運行時鍾,其自身狀態不可改變。通過以“零”狀態啟動兩個觸發器,即使其中一個源時鍾未運行,仍然能夠將另一個好的時鍾傳播到開關的輸出,保證輸出時鍾的穩定。

4.非相關時鍾切換的毛刺避免Glitch protection for unrelated clock sources

  上述避免時鍾切換輸出處的毛刺的方法需要兩個時鍾源彼此的倍數關系,使得用戶可以避免信號與任一時鍾域異步。 但在該實現中沒有處理異步信號的機制(上面的辦法只是通過時序約束解決異步的問題,並沒有真正解決異步的問題)。這引出了實現具有同步器電路的時鍾切換的第二種方法,以避免由異步信號引起的潛在的亞穩態。 當兩個時鍾源彼此完全無關時,異步發送的源頭可以是SELECT信號或從一個時鍾域到另一個時鍾域的反饋。

  第二種方法是針對兩個異步時鍾源的切換,這個方法是在第一種方法的基礎上,在選擇路徑上再插入一個上升沿觸發D觸發器,這是為了針對對兩個異步時鍾源產生的反饋信號以及異步信號SELECT,對選擇信號進行同步處理,這樣即使是兩個異步的時鍾源進行切換,也可以避免亞穩態的產生。同步器只是兩級觸發器,其中第一級通過鎖定數據來幫助穩定數據,然后將數據傳遞到下一級,由電路的其余部分解釋。

 

圖7:非相關時鍾切換毛刺避免電路

 

圖8:非相關時鍾切換毛刺避免時序

   電路語言描述:

reg clk0_f , clk0_ff;
reg clk1_f , clk1_ff;

always@(posedge clk0 or negedge rst_n)begin
    if (rst_n == 1'b0)
        clk0_f <= 1'b0;
    else
        clk0_f <= (~select) & (~clk1_ff);
end
always@(negedge clk0 or negedge rst_n)begin
    if (rst_n == 1'b0)
        clk0_ff <= 1'b0;
    else
        clk0_ff <= clk0_f;
end

always@(posedge clk1 or negedge rst_n)begin
    if (rst_n == 1'b0)
        clk1_f <= 1'b0;
    else
        clk1_f <= (select) & (~clk0_ff);
end
always@(negedge clk1 or negedge rst_n)begin
    if (rst_n == 1'b0)
        clk1_ff <= 1'b0;
    else
        clk1_ff <= clk1_f;
end

assign clk_out = (clk0_ff & clk0) | (clk1_ff & clk1);

  仿真電路:

 

 

  仿真結果:

 

圖9:非相關時鍾切換毛刺避免仿真結果

  仿真結果十分明顯。

 5.結論

  通過使用本文中介紹的方法,可以通過非常小的開銷來避免在時鍾源之間切換時在時鍾線上產生毛刺的危險。 這些技術完全可擴展,可以擴展到時鍾切換兩個以上的時鍾。 對於多個時鍾源,每個時鍾源的選擇信號將通過所有其他源的反饋啟用。

 

參考:https://www.eetimes.com/techniques-to-make-clock-switching-glitch-free/ Techniques to make clock switching glitch-free

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM