只要FPGA設(shè)計中的所有資源不全屬于一個時鐘域,那么就可能存在跨時鐘域問題,因為異步邏輯其實也可以看做一種特殊的跨時鐘域問題。發(fā)生跨時鐘域問題的必要條件是不同時鐘域之間存在信息交互,如果一個FPGA設(shè)計中存在多個時鐘域的話,這幾乎是無法避免的,否則各個時鐘域互不相關(guān),那么就相當(dāng)于把原設(shè)計分解為多個獨立的小設(shè)計,這樣的話FPGA設(shè)計的功能就無法通過協(xié)作來擴展。
那么當(dāng)兩個不同時鐘域之間進行信息交互的時候,到底會存在什么問題呢?
首先介紹亞穩(wěn)態(tài):
觸發(fā)器的建立時間和保持時間在時鐘上升沿左右定義了一個時間窗口,如果觸發(fā)器的數(shù)據(jù)輸入端口上數(shù)據(jù)在這個時間窗口內(nèi)發(fā)生變化(或者數(shù)據(jù)更新),那么就會產(chǎn)生時序違規(guī)。存在這個時序違規(guī)是因為建立時間要求和保持時間要求被違反了,此時觸發(fā)器內(nèi)部的一個節(jié)點(或者要輸出到外部的節(jié)點)可能會在一個電壓范圍內(nèi)浮動,無法穩(wěn)定在邏輯0或者邏輯1狀態(tài)。換句話說,如果數(shù)據(jù)在上述窗口中被采集,觸發(fā)器中的晶體管不能可靠地設(shè)置為邏輯0或者邏輯1對應(yīng)的電平上。所以此時的晶體管并未處于飽和區(qū)對應(yīng)的高或者低電平,而是在穩(wěn)定到一個確定電平之前,徘徊在一個中間電平狀態(tài)(這個中間電平或許是一個正確值,也許不是)。
在 FPGA 設(shè)計 中,如果一個工程包含多個時鐘,正確的時鐘匹配和跨時鐘域處理至關(guān)重要,否則可能會導(dǎo)致亞穩(wěn)態(tài)問題、數(shù)據(jù)損壞或系統(tǒng)錯誤。以下是幾種常見的方法來處理多個時鐘:
1. 確定各個時鐘的關(guān)系
首先,需要分析時鐘之間的關(guān)系:
同步時鐘(有共同的時鐘源,如 PLL 產(chǎn)生的不同時鐘):可以直接在時序約束中定義多時鐘域。異步時鐘(無共同源,例如不同模塊由不同時鐘驅(qū)動):需要跨時鐘域處理。2. 處理多個時鐘的方法
方法 1:使用 PLL / MMCM 進行時鐘同步
適用于多個時鐘頻率相關(guān)的情況(如 100MHz 和 50MHz 來源于同一 200MHz PLL)。
使用 PLL(Phase-Locked Loop)或 MMCM(Mixed-Mode Clock Manager) 生成多個相關(guān)時鐘,并確保它們是同步的。在時序約束(SDC 文件或 XDC 文件)中正確指定多時鐘域。使用 時鐘緩沖器(BUFG, BUFGCE, BUFHCE) 以減少時鐘偏斜(Clock Skew)。方法 2:跨時鐘域信號處理(CDC 處理)
適用于異步時鐘(不同來源)的情況
① 單比特信號:使用雙/多級寄存器同步
用于跨時鐘域的單個信號(如復(fù)位、使能信號等)
原理:使用兩個或多個級聯(lián)的 D 觸發(fā)器(DFF) 進行同步,以消除亞穩(wěn)態(tài)。② 多比特數(shù)據(jù):使用 FIFO 進行數(shù)據(jù)緩沖
適用于異步時鐘域之間的數(shù)據(jù)傳輸
FIFO(First-In-First-Out 緩沖器) 具有獨立的 寫時鐘 & 讀時鐘,適用于跨時鐘域傳輸數(shù)據(jù)。例子:寫端口 用 clk_A 作為時鐘,寫入數(shù)據(jù)。讀端口 用 clk_B 作為時鐘,讀取數(shù)據(jù)。FPGA 里常用的 FIFO:Xilinx: xpm_fifo_asyncIntel (Altera): scfifo③ 跨時鐘域握手機制(Handshake)
適用于小數(shù)據(jù)量但需高可靠性的跨時鐘通信
雙時鐘握手協(xié)議:發(fā)送方等待接收方的 ack 信號,確保數(shù)據(jù)已被正確接收。Gray Code(格雷碼):用于跨時鐘域的 地址傳輸,避免跳變時數(shù)據(jù)錯誤。3. 時序約束(Timing Constraints)
在 FPGA 設(shè)計中,必須正確設(shè)置多時鐘的時序約束,否則可能會導(dǎo)致不穩(wěn)定的行為。
處理時鐘域跨越問題的方法
1. 同步器
雙邊沿觸發(fā)器同步器:將異步信號轉(zhuǎn)換為與目標(biāo)時鐘對齊的雙邊沿觸發(fā)器信號。
三態(tài)同步器:通過三態(tài)門實現(xiàn)信號跨域同步。
2. 握手協(xié)議:使用握手協(xié)議確保數(shù)據(jù)在跨越時鐘域傳輸時的正確性,如使用握手信號來控制數(shù)據(jù)的有效性和接收階段。
3. FIFO緩沖區(qū):在不同時鐘域之間使用FIFO緩沖區(qū)進行數(shù)據(jù)傳輸,以平衡不同時鐘頻率帶來的速度不匹配。
4. 時鐘插補:使用時鐘插補技術(shù),通過插入額外的時鐘周期來調(diào)整不同時鐘域之間的時序關(guān)系,緩解時鐘域跨越問題。
5. 異步FIFO:異步FIFO可以在不同時鐘域之間進行高效的數(shù)據(jù)傳輸,通過自適應(yīng)的方式解決不同時鐘頻率之間的速度差異。
6. 嚴(yán)格的規(guī)范約束:制定嚴(yán)格的時序分析和布線規(guī)則,避免設(shè)計中出現(xiàn)時序失真,減少時鐘域跨越問題的可能性。
應(yīng)用舉例
串口通信:處理串口數(shù)據(jù)傳輸時,需要處理串口接收和處理時鐘信號的時鐘域跨越問題。
多核處理器:在多核處理器系統(tǒng)中,不同核心的時鐘頻率可能不同,需要處理時鐘域跨越問題。
深度學(xué)習(xí)加速器:在人工智能領(lǐng)域的FPGA設(shè)計中,處理神經(jīng)網(wǎng)絡(luò)計算單元與整體時鐘域的同步問題。
時鐘域跨越問題是復(fù)雜FPGA設(shè)計中常見的挑戰(zhàn)之一,需要仔細設(shè)計和有效的解決方案來確保系統(tǒng)的穩(wěn)定性和正確性。通過合理的設(shè)計和采用適當(dāng)?shù)募夹g(shù)手段,可以有效地處理時鐘域跨越問題,提高FPGA系統(tǒng)的可靠性和性能。
在實際應(yīng)用中,工程師需要深入理解各種時鐘域跨越問題的原因和可能導(dǎo)致的后果,結(jié)合具體的設(shè)計需求和約束條件選擇合適的解決方案。同時,進行嚴(yán)格的時序分析、仿真驗證和布局布線規(guī)劃也是避免時鐘域跨越問題的重要步驟。