簡介
在實際的邏輯設計中,單個的時鐘域內的設計是很容易滿足時序要求的。然而,在實際的工程中基本沒有實用的設計是隻依靠單時鐘就能實現的。所以需要考慮在多時鐘領域內如何處理信號,以保證可以得到穩定的設計。多時鐘域的信號處理,屬於邏輯開發中比較基礎的問題。
多時鐘域
一般對於如下兩種情況,我們都認爲屬於跨時鐘域:
- 時鐘頻率不同
- 時鐘頻率相同,相位不同
- 違背建立時間和保持時間
- 產生亞穩態(其本質是違背建立時間和保持時間)
跨時鐘域的處理方法
分模塊設計
在處理跨時鐘域問題的時候,首先需要將按照工程中所用到的時鐘劃分模塊,儘量只做到一個模塊只使用一個時鐘。但是這不是絕對的,比如信號可以以clk1寫入到buffer,然後以clk2從buffer中讀取數據。最常用的的跨時鐘域的方法是使用同步器,爲了使靜態時序分析(STA)變得簡單,一般不推薦大於三級的同步器設計。一般的經驗值爲二級同步器即可滿足時序要求。
需要同步的信號
我們可以把所有需要同步的信號分成兩大類:
- 控制信號(單bit)
- 數據信號(多bit)
單bit控制信號的傳輸
一個處於clk1時鐘域的異步信號,不能直接送給時鐘域爲clk2的觸發器,這樣會造成時鐘域clk2亞穩態的概率。爲了避免這樣的情況發生,常常採用多級同步器的輸出信號來取代異步信號。多級同步器,即將多個觸發器串聯起來組成的同步電路,見下圖所示:
上圖爲兩級同步器,以及時序電路圖
需要說明的是,同步器並不能確實地降低出現亞穩態的可能性,但更多的同步器確實能進一步降低出現亞穩態的可能性。如果在特別高速的電路中,所使用的同步器就比較多。但即使是這樣,我們仍推薦在簡單的設計中使用多級同步器來做控制信號的同步。多級同步器的缺點也很明顯,即同步器使電路不可避免地產生硬件資源的開銷,並且增加了電路的整體延時。
那麼,需要多少級同步器才能解決同步的問題呢?在有些情況下,第一級同步器的輸出信號從亞穩態進入穩定狀態,僅僅需要一個時鐘週期是不夠的(主要體現在高時鐘頻率條件下,或一些特殊情況下),也就意味着第二級同步器的輸出依然是不穩定的狀態,那麼在設計的過程中,必須使用三級同步器電路。多級同步器,在電路上的體現只是串聯了一個觸發器。以下的時序圖說明了使用三級同步器的必要性。
數據信號的傳輸
上面簡單的介紹了單bit控制信號的同步,那麼對於多bit的數據信號,經常所使用的方法爲如下三種:
- 使用RAM
- 使用異步FIFO
- 使用握手信號