34 / 37 · 概念
時脈域邊界與亞穩態
理解兩級同步器的適用範圍,區分單位元、短脈衝與多位元傳輸。
單元可免費閱讀,註冊課程即可儲存學習進度。
另一時脈的輸入沒有邊緣間距保證
Setup建立時間(setup)是輸入資料在時脈擷取邊緣之前,必須保持穩定的最短時間。若違反此條件,便無法保證儲存結果。 詳細內容、hold保持時間(hold)是輸入資料在時脈擷取邊緣之後,仍必須保持穩定的最短時間。請依上下文區分它與一般的數值保持行為。 詳細內容 要求資料在接收時脈邊緣附近足夠穩定。按鈕或另一獨立時脈域的輸出與接收邊緣關係任意,因此難以永遠保證。
結果可能造成正反器正反器在指定的時脈邊緣儲存輸入,並保持至下一個邊緣。輸入須滿足 setup 與 hold 條件。 詳細內容內部狀態在一段時間內無法迅速決定為 0 或 1,即亞穩態(metastability)。一般 0/1 RTL 模擬不會直接呈現此類比現象。測試波形乾淨,不代表 CDC 安全。
兩級同步器用於維持夠久的單位元
module level_synchronizer (
input logic clk_dst,
input logic rst_dst,
input logic async_level,
output logic synced_level
);
logic first_stage;
always_ff @(posedge clk_dst) begin
if (rst_dst) begin
first_stage <= 1'b0;
synced_level <= 1'b0;
end else begin
first_stage <= async_level;
synced_level <= first_stage;
end
end
endmodule此結構在第一級不穩定時,給它時間在下一級讀取前穩定。功能電路使用最後一級輸出,不直接分接第一級。上述 reset 假設同步於目的時脈。
實際實作須依工具與元件設定同步器同步器讓來自其他時序域的訊號能在接收端時脈下處理。適用於單一位元的多級正反器不能直接套用至多位元資料。屬性、縮短級間配線,並執行 STA、CDC 檢查。寫了兩個暫存器暫存器儲存多個位元的狀態。本課程中的同步暫存器會在時脈邊緣儲存指定的輸入。 詳細內容,並不保證擺放與路徑條件也正確。
非同步輸入進入第一級,功能電路只使用最後一級。級間時間提供穩定機會,但不保證類比亞穩態亞穩態是儲存元件暫時無法穩定為 0 或 1 的類比狀態。同步電路能降低它向後傳播的機率,但無法將發生機率降為零。一定消失。
- 非同步準位: 與目的端時脈的相位無關
- 第一級 FF(可能亞穩): 可能出現亞穩態
- 已同步的正反器: 在目的端的下一個邊緣擷取
- 功能電路: 只使用最後一級
降低失敗機率,但不降到零
一種簡化模型中,平均故障間隔 MTBF 的趨勢如下。
是可穩定的時間, 是元件特性, 為接收時脈頻率, 為非同步輸入切換頻率。實際計算需要各元件常數,不能只靠此式就替任意電路宣稱「安全幾年」。
不同問題不要一律使用同一電路
| 傳送資訊 | 單位元兩級同步是否足夠? | 可考慮的結構 |
|---|---|---|
| 保持夠久的準位 | 滿足機率與延遲要求時可用 | 目的端同步器 |
| 短於目的週期的脈衝 | 脈衝本身可能被漏掉 | 脈衝延長、toggle、handshake |
| 同時具有意義的多位元 | 各位元可能取自不同時間 | 穩定匯流排加握手、非同步 FIFO |
| 機械按鈕 | 接點反覆彈跳是另一問題 | 同步後去彈跳 |
例如 4 位元值由 0111 變為 1000,若逐位元獨立同步,可能短暫看到原本不存在的組合。要保留匯流排一致性,必須設計完整資料與傳送完成之間的關係。
延伸閱讀:MIT OpenCourseWare — Synchronization, Metastability and Arbitration
自己試試看
接收時脈 50 MHz,輸入脈衝寬 5 ns。加入兩級同步器就能宣稱所有脈衝都被偵測嗎?也會一起去除按鈕彈跳嗎?
查看解說
50 MHz 週期是 20 ns。5 ns 脈衝可能在兩個接收邊緣間出現又消失,第一級就漏掉。只增加同步級數不能保證脈衝保留;需要脈衝延長或握手等契約,按鈕彈跳則需另外去彈跳。