Verilog 跨時鐘域傳輸:慢到快

2022-05-20 14:34 更新

理論上講,快時鐘域的信號總會采集到慢時鐘域傳輸來的信號,如果存在異步可能會導(dǎo)致采樣數(shù)據(jù)出錯,所以需要進行同步處理。此類同步處理相對簡單,一般采用延遲打拍法,或延遲采樣法。

延遲打拍法

最常用的同步方法是雙級觸發(fā)器緩存法,俗稱延遲打拍法。異步信號從一個時鐘域進入另一個時鐘域之前,將該信號用兩級觸發(fā)器連續(xù)緩存兩次,可有效降低因為時序不滿足而導(dǎo)致的亞穩(wěn)態(tài)問題。電路示意圖如下。


一般設(shè)計中使用兩級觸發(fā)器進行緩存即可滿足設(shè)計時序需求。大量實驗表明,三級觸發(fā)器緩存可解決 99% 以上的此類異步時序問題。

兩級觸發(fā)器延遲打拍并檢測信號上升沿的 Verilog 描述如下:

module delay_clap(
    input       clk1,  //異步慢時鐘
    input       sig1,  //異步信號

    input       rstn,  //復(fù)位信號
    input       clk2,  //目的快時鐘域市政
    output      sig2); //快時鐘域同步后的信號

   reg [2:0]    sig2_r ;   //3級緩存,前兩級用于同步,后兩節(jié)用于邊沿檢測
   always @(posedge clk2 or negedge rstn) begin
     if (!rstn) sig2_r  <= 3'b0 ;
     else       sig2_r  <= {sig2_r[1:0], sig1} ;  //緩存
   end
   assign sig2 = sig2_r[1] && !sig2_r[2] ; //上升沿檢測

延遲采樣法

此方法主要針對多位寬的數(shù)據(jù)傳輸。

例如當(dāng)兩個異步時鐘頻率比為 5 時,可以先用延遲打拍的方法對數(shù)據(jù)使能信號進行 2 級打拍緩存,然后再在快時鐘域?qū)β龝r鐘域的數(shù)據(jù)信號進行采集。

該方法的基本思想是保證信號被安全采集的時刻,而不用同步多位寬的數(shù)據(jù)信號,可節(jié)省部分硬件資源。

利用打拍的方法進行延遲采樣的 Verilog 描述如下。

//同步模塊工作時鐘為 100MHz 的模塊
//異步數(shù)據(jù)對來自工作時鐘為 20MHz 的模塊
module delay_sample(
    input               rstn,
    input               clk1,
    input [31:0]        din,
    input               din_en,

    input               clk2,
    output [31:0]       dout,
    output              dout_en);

   //sync din_en
   reg [2:0]    din_en_r ;
   always @(posedge clk2 or negedge rstn) begin
     if (!rstn) din_en_r  <= 3'b0 ;
     else       din_en_r  <= {din_en_r[1:0], din_en} ;
   end
   wire din_en_pos = din_en_r[1] && !din_en_r[2] ;

   //sync data
   reg [31:0]           dout_r ;
   reg                  dout_en_r ;
   always @(posedge clk2 or negedge rstn) begin
      if (!rstn)
        dout_r         <= 'b0 ;
      else if (din_en_pos)
        dout_r         <= din ;
   end
   //dout_en delay
   always @(posedge clk2 or negedge rstn) begin
      if (!rstn)        dout_en_r      <= 1'b0 ;
      else              dout_en_r      <= din_en_pos ;
   end
   assign       dout    = dout_r ;
   assign       dout_en = dout_en_r ;

endmodule

該方法時序結(jié)果圖如下所示。

顯然,在 clk2 時鐘域,t2 時刻對數(shù)據(jù)進行采樣緩存比 t1 時刻要安全的多。


但如果慢時鐘域沒有數(shù)據(jù)使能信號 din_en, 或數(shù)據(jù)使能信號一直有效,此時在快時鐘域?qū)?shù)據(jù)使能信號進行上升沿檢測的方法將會失效。因為數(shù)據(jù)使能信號一直有效,除了第一個數(shù)據(jù),快時鐘域?qū)o法檢測到后繼數(shù)據(jù)的傳輸時刻。

解決方法就是,在快時鐘域?qū)β龝r鐘信號的邊沿進行檢測。

如果兩個時鐘的頻率相差較小,可能還需要對數(shù)據(jù)進行延遲緩存,以保證采集到的是當(dāng)拍時鐘的數(shù)據(jù);如果兩個時鐘的頻率相差較大,數(shù)據(jù)采樣時刻可以通過計數(shù)的方法獲得,而不用對數(shù)據(jù)進行緩存。

利用計數(shù)延遲采樣的方法對慢時鐘邊沿進行檢測的 Verilog 描述如下。

//同步模塊工作時鐘為 100MHz 的模塊
//異步數(shù)據(jù)對來自工作時鐘為 999KHz 的模塊
module delay_cnt_sample(
    input               rstn,
    input               clk1,
    input [31:0]        din,
    input               din_en,

    input               clk2,
    output [31:0]       dout,
    output              dout_en);

   //4級緩存:3級用于打拍同步,一級用于邊沿檢測
   reg [3:0]    edge_r ;
   always @(posedge clk2 or negedge rstn) begin
     if (!rstn) edge_r  <= 3'b0 ;
     else       edge_r  <= {edge_r[3:0], clk1} ;
   end
   wire edge_pos = edge_r[2] && !edge_r[3] ;

   //延遲計數(shù)器,檢測到慢時鐘上升沿時開始計數(shù)
   reg [5:0] cnt ;
   always @(posedge clk2 or negedge rstn) begin
      if (!rstn)                cnt <= 6'h3f ;
      else if (edge_pos && din_en)
                                cnt <= 6'h0 ;
      else if (cnt != 6'h3f)    cnt <= cnt + 1'b1 ;
   end

   //數(shù)據(jù)同步
   reg [31:0]           dout_r ;
   reg                  dout_en_r ;
   always @(posedge clk2 or negedge rstn) begin
      if (!rstn)
        dout_r         <= 'b0 ;
      else if (din_en && cnt == 47) //大約在慢時鐘周期中間時刻采樣
        dout_r         <= din ;
   end
   //數(shù)據(jù)使能信號較數(shù)據(jù)采樣時刻延遲一個周期輸出
   always @(posedge clk2 or negedge rstn) begin
      if (!rstn)        dout_en_r      <= 1'b0 ;
      else if (din_en && cnt==48)
                        dout_en_r      <= 1'b1 ;
      else              dout_en_r      <= 1'b0 ;
   end
   assign       dout    = dout_r ;
   assign       dout_en = dout_en_r ;

endmodule

頻率相差較大的數(shù)據(jù)同步采樣結(jié)果圖如下。

由圖可知,快時鐘采樣時刻在慢時鐘周期中央時刻左右,此時是非常安全的。


點擊這里下載源碼


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號