跨時鐘域同步的核心是要解決不同時鐘域之間所產生的亞穩態問題。
跨時鐘域同步分爲多bit同步和單bit同步。
1、多bit跨時鐘域同步
對於多bit數據的跨時鐘域同步通常有兩種方法:二進制計數值格雷碼打兩拍法和異步FIFO法。
具體來說,對於格雷碼打兩拍法而言,首先需要同步的信號是一個二進制計數值,將此值在時鐘域A轉換爲格雷碼,再將此格雷碼在時鐘域B打兩拍完成同步,此法主要是由於如果直接將二進制數打兩拍至下一時鐘域時,由於二進制計數的下一個值會出現多個位同時改變產生毛刺引發亞穩態問題,而格雷碼計數只有一位改變,不會產生亞穩態問題。其框圖如下:
圖1 二進制計數器的格雷碼跨時鐘域多bit同步
二進制計數器格雷碼跨時鐘域同步只針對二進制計數器而言,用於特定的場合,如異步FIFO的設計中。較一般的情況,對於多bit的跨時鐘域同步通常使用異步FIFO來完成,異步FIFO跨時鐘域同步是一種比較行之有效的處理方式,此處不再細說。
2、單bit跨時鐘域同步
按照信號的用途將單bit跨時鐘域同步器分爲:電平同步器、邊沿檢測器和脈衝同步器。
-
電平同步器
所謂電平同步器,顧名思義是將有用的電平信號同步至另一時鐘域,電平信號需要在原時鐘域保持至少兩個時鐘週期。其同步方法是將信號經過兩個D觸發器,即打兩拍。其Verilog代碼如下:
-
邊沿檢測器
邊沿檢測器的原理是在電平同步器的輸出加一個觸發器(由於第一級觸發器可能存在亞穩態現象),利用二三級觸發器結果判斷信號是上升沿還是下降沿。其Verilog代碼如下:
-
脈衝同步器
脈衝同步器的作用是檢測原時鐘域的脈衝並在新時鐘域產生一個新的脈衝。簡單的脈衝同步器設計步驟爲:
將脈衝信號在原時鐘域轉換爲電平信號;
將電平信號通過打兩拍同步至另一時鐘域;
在新的時鐘域中進行邊沿檢測,產生新的脈衝信號。
以上是較爲簡單的脈衝同步器,此脈衝同步器對於某些情況下是不可靠的,若要可靠的完成脈衝的同步,可以引入握手機制。具體的握手機制如下:
若源時鐘域脈衝來臨,且同步器處於空閒狀態,則向同步器發出同步請求;
同步請求信號到達目的時鐘域,目的時鐘域產生應該信號表示同步完成;
源時鐘域檢測到應答信號後清楚請求信號;
目標時鐘域檢測到源時鐘域請求信號清除後清除應答信號;
同步器回到空閒狀態,進行下一個脈衝的同步;
Verilog如下: