跨時鐘域處理是 FPGA 設計中經(jīng)常遇到的問題,而如何處理好跨時鐘域間的數(shù)據(jù),可以說是每個 FPGA 初學者的必修課。如果是還在校生,跨時鐘域處理也是面試中經(jīng)常常被問到的一個問題。
這里主要介紹三種跨時鐘域處理的方法,這三種方法可以說是 FPGA 界最常用也最實用的方法,這三種方法包含了單 bit 和多 bit 數(shù)據(jù)的跨時鐘域處理,學會這三招之后,對于 FPGA 相關(guān)的跨時鐘域數(shù)據(jù)處理便可以手到擒來。
這里介紹的三種方法跨時鐘域處理方法如下:
打兩拍;
異步雙口 RAM;
格雷碼轉(zhuǎn)換。
01
方法一:打兩拍
大家很清楚,處理跨時鐘域的數(shù)據(jù)有單 bit 和多 bit 之分,而打兩拍的方式常見于處理單 bit 數(shù)據(jù)的跨時鐘域問題。
打兩拍的方式,其實說白了,就是定義兩級寄存器,對輸入的數(shù)據(jù)進行延拍。
應該很多人都會問,為什么是打兩拍呢,打一拍、打三拍行不行呢?
先簡單說下兩級寄存器的原理:兩級寄存是一級寄存的平方,兩級并不能完全消除亞穩(wěn)態(tài)危害,但是提高了可靠性減少其發(fā)生概率??偟膩碇v,就是一級概率很大,三級改善不大。
data 是時鐘域 1 的數(shù)據(jù),需要傳到時鐘域 2(clk)進行處理,寄存器 1 和寄存器 2 使用的時鐘都為 clk。假設在 clk 的上升沿正好采到 data 的跳變沿(從 0 變 1 的上升沿,實際上的數(shù)據(jù)跳變不可能是瞬時的,所以有短暫的跳變時間),那這時作為寄存器 1 的輸入到底應該是 0 還是 1 呢?這是一個不確定的問題。所以 Q1 的值也不能確定,但至少可以保證,在 clk 的下一個上升沿,Q1 基本可以滿足第二級寄存器的保持時間和建立時間要求,出現(xiàn)亞穩(wěn)態(tài)的概率得到了很大的改善。
如果再加上第三級寄存器,由于第二級寄存器對于亞穩(wěn)態(tài)的處理已經(jīng)起到了很大的改善作用,第三級寄存器在很大程度上可以說只是對于第二級寄存器的延拍,所以意義是不大的。
02
方法二:異步雙口 RAM
處理多 bit 數(shù)據(jù)的跨時鐘域,一般采用異步雙口 RAM。假設我們現(xiàn)在有一個信號采集平臺,ADC 芯片提供源同步時鐘 60MHz,ADC 芯片輸出的數(shù)據(jù)在 60MHz 的時鐘上升沿變化,而 FPGA 內(nèi)部需要使用 100MHz 的時鐘來處理 ADC 采集到的數(shù)據(jù)(多 bit)。在這種類似的場景中,我們便可以使用異步雙口 RAM 來做跨時鐘域處理。
先利用 ADC 芯片提供的 60MHz 時鐘將 ADC 輸出的數(shù)據(jù)寫入異步雙口 RAM,然后使用 100MHz 的時鐘從 RAM 中讀出。對于使用異步雙口 RAM 來處理多 bit 數(shù)據(jù)的跨時鐘域,相信大家還是可以理解的。當然,在能使用異步雙口 RAM 來處理跨時鐘域的場景中,也可以使用異步 FIFO 來達到同樣的目的。
03
方法三:格雷碼轉(zhuǎn)換
我們依然繼續(xù)使用介紹第二種方法中用到的 ADC 例子,將 ADC 采樣的數(shù)據(jù)寫入 RAM 時,需要產(chǎn)生 RAM 的寫地址,但我們讀出 RAM 中的數(shù)據(jù)時,肯定不是一上電就直接讀取,而是要等 RAM 中有 ADC 的數(shù)據(jù)之后才去讀 RAM。這就需要 100MHz 的時鐘對 RAM 的寫地址進行判斷,當寫地址大于某個值之后再去讀取 RAM。
在這個場景中,其實很多人都是使用直接用 100MHz 的時鐘與 RAM 的寫地址進行打兩拍的方式,但 RAM 的寫地址屬于多 bit,如果單純只是打兩拍,那不一定能確保寫地址數(shù)據(jù)的每一個 bit 在 100MHz 的時鐘域變化都是同步的,肯定有一個先后順序。如果在低速的環(huán)境中不一定會出錯,在高速的環(huán)境下就不一定能保證了。所以更為妥當?shù)囊环N處理方法就是使用格雷碼轉(zhuǎn)換。
對于格雷碼,相鄰的兩個數(shù)間只有一個 bit 是不一樣的(格雷碼,在本文中不作詳細介紹),如果先將 RAM 的寫地址轉(zhuǎn)為格雷碼,然后再將寫地址的格雷碼進行打兩拍,之后再在 RAM 的讀時鐘域?qū)⒏窭状a恢復成 10 進制。這種處理就相當于對單 bit 數(shù)據(jù)的跨時鐘域處理了。
對于格雷碼與十進制互換的代碼,僅提供給大家作參考:
代碼使用的是函數(shù)的形式,方便調(diào)用,op 表示編碼或者譯碼,WADDRWIDTH 和 RADDRWIDTH 表示位寬。
審核編輯黃昊宇
-
FPGA
+關(guān)注
關(guān)注
1629文章
21736瀏覽量
603419 -
時鐘域
+關(guān)注
關(guān)注
0文章
52瀏覽量
9536
發(fā)布評論請先 登錄
相關(guān)推薦
評論