2016-06-28 56 views

回答

0

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

當輸出時鐘非常慢,並且您有脈衝時,您需要添加一個在輸入時鐘域中運行的內聯脈衝展寬器。拉伸由下面的stretch_out的位寬定義,並且「必須」大於輸出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 

這應該將電平和脈衝從快速域同步到慢速域。

唯一的問題是,你將增加的不僅僅是你通常的兩個觸發延遲。

0

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

// 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;