信號在進行跨時鍾傳輸時,同步是不可避免的。
慢時鍾域信號同步到快時鍾域時,一般的做法都是打兩拍(單bit傳輸)
module time_dff (
通過電路圖很容易就能理解程序的書寫。
首先有個問題:為什么在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信號。至此一次握手結束。