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