簡體   English   中英

脈沖和電平信號的時鍾域交叉

[英]Clock Domain Crossing for Pulse and Level Signal

對於脈沖,我們使用脈沖同步器,對於電平信號,我們使用2-flop同步器但是如果信號可以是脈沖或電平行為怎么辦。 有沒有辦法同步?

是的,您可以,但解決方案需要基於輸入脈沖相對於輸出時鍾的寬度。

當輸出時鍾非常慢並且您有脈沖時,您需要添加一個在輸入時鍾域中運行的內聯脈沖展寬器。 拉伸由下面的stretch_out的位寬定義,並且“MUST”大於輸出clk域上的一個時鍾。

reg [3:0] stretch_out;
always @ (posedge inclk)
begin 
   stretch_out <= in_signal ? 4'b1111 : {stretch_out[2:0],1'b0}; 
end

現在您可以使用雙翻轉同步器。

reg [1:0] out_sync;
always @ (posedge outclk)
begin 
    out_sync <= {out_sync[0],stretch_out[3]};
end

這應該將來自快域的電平和脈沖同步到慢域。

唯一的問題是,你將增加的不只是通常的兩個翻牌延遲。

您可以使用目標域中的信號進行異步設置,使用雙觸發器進行同步,然后檢測上升沿。 應該適用於短脈沖和長脈沖。

// Prevent DRC violations if using scan
wire in_signal_n = scan_mode ? 1'b1 : !signal_in;

// Following code creates a flop with both async setb and resetb
reg sig_n_async;
always @ ( posedge outclk or negedge reset_n or negedge in_signal_n)
  if (!reset_n)
    sig_n_async <= 0;
  else if (!in_signal_n)
    sig_n_async <= 1;
  else
    sig_n_async <= 0;


// Synchronizer
reg [1:0] out_sync;
always @ (posedge outclk or negedge reset_n)
  if (!reset_n)
    out_sync <= 0;
  else
    out_sync <= {out_sync[0],sig_n_async};


// Rising edge
reg out_sync_del;
always @ (posedge outclk or negedge reset_n)
  if (!reset_n)
    out_sync_del <= 0;
  else
    out_sync_del <= out_sync[1];

wire signal_out = out_sync[1] & !out_sync_del;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM