異步電路中,不同時鍾域下的信號同步--慢時鍾域到快時鍾域和快時鍾域到慢時鍾域


信號在進行跨時鍾傳輸時,同步是不可避免的。

慢時鍾域信號同步到快時鍾域時,一般的做法都是打兩拍(單bit傳輸)

module time_dff (

    clk_a,clk_b,rst,d_in,d_out
);
    input clk_a;
    input clk_b;
    input rst;
    input d_in;
    output d_out;
    reg d_in_1;
    reg d_out_2;
    reg d_out_1;
    always @(posedge clk or negedge rst) begin
        if(!rst) begin
            d_in_1 <= 1'b0;
        end
        else begin
            d_in_1 <= d_in;
        end
    end
    always @(posedge clk or negedge) begin
        if(!rst) begin
            d_out_1 <= 1'b0;
            d_out_2 <= 1'b0;
        end
        else begin
            d_out_1 <= d_in_1;
            d_out_2 <= d_out_1;
        end
    end
    assign d_out = d_out_2;
endmodule

通過電路圖很容易就能理解程序的書寫。

  首先有個問題:為什么在clk_a時鍾域內需要打一拍? 因為不能直接將組合邏輯的輸出做兩級同步,需要將組合邏輯的輸出通過原始時鍾打

一拍后載進行兩級同步。

  還有一個問題:為什么要打兩拍,而不是打三拍或者是打一拍?首先打一拍很簡單,首先在clk_b時鍾域內,當從clk_a過來的信號不滿足b時

鍾域第一個寄存器的建立保持時間,則會出現亞穩態,因此一拍肯定是不行的。但是可以確定的是,第一拍出來的信號是滿足第二個寄存器的建立

保持時間,可將出現亞穩態的幾率大大降低。因為第二拍已經對亞穩態的出現進行較大的改善,此時再進行第三拍,實際上也是對第二拍的延續。

又因為亞穩態並不能完全消除,只能降低其發生概率,所以一拍概率很大,二拍提高可靠性,降低其發生概率,三拍改善不大。

  當針對與多bit慢時鍾域同步到快時鍾域:加入交互信號(添加使能信號,對使能信號進行兩級同步)

當快時鍾域脈沖信號同步到慢時鍾域時:

解決方法1:拓寬快時鍾域的脈沖信號

  1、如果兩個時鍾頻率相差不大,如下電路。即快時鍾域脈沖信號時間間隔必須大於clk_b的時鍾周期

具體代碼實現:https://www.cnblogs.com/shadow-fish/p/13514353.html

2、如果clk_a頻率比clk_b頻率大於2倍小於3倍,則需要在拓展脈沖電路中多加一級寄存器,同時將或門換成三輸入與門,使輸入信號脈寬

拓展3倍。clk_a頻率為clk_b的4倍,則打4拍,延遲3個clk_a時鍾周期。

解決方式2:

  握手交互,額外添加一個保持寄存器和握手信號,將快時鍾域的信號同步到慢時鍾域,然后將同步后的信號通過另一個同步器返回到快時鍾域

作為應答信號,這種方法具有相當大的延遲。具體握手流程:當數據發出,快時鍾域產生一個req請求信號,經過兩級同步后到達慢時鍾域,向慢時

鍾域表明數據已經准備好,可以進行讀取,讀取接結束后慢時鍾域會產生一個確認信號ack,經過兩級同步后告訴快時鍾域,數據已經讀取完了,當

快時鍾域檢測到同步過來的有效ack信號后,拉低req信號,而后慢時鍾域檢測到同步過來的無效req信號,也會拉低ack信號。至此一次握手結束。

詳細代碼鏈接:https://www.cnblogs.com/shadow-fish/p/13526345.html


免責聲明!

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



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