1. 程式人生 > 其它 >時鐘切換電路(無毛刺)——clock switching glitch free

時鐘切換電路(無毛刺)——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 switchingglitch-free