有哪些技術(shù)方法可以處理FPGA跨時(shí)鐘域問題?
以下內(nèi)容中,小編將對(duì)FPGA跨時(shí)鐘域處理技術(shù)方法進(jìn)行著重介紹和闡述,希望本文能幫您增進(jìn)對(duì)FPGA跨時(shí)鐘域處理技術(shù)方法的了解,和小編一起來看看吧。
一、FPGA跨時(shí)鐘域處理技術(shù)方法一
1、跨時(shí)鐘域之間不能存在組合邏輯。 跨時(shí)鐘域本身就容易產(chǎn)生亞穩(wěn)態(tài),如果在跨時(shí)鐘域之間存在組合邏輯會(huì)大大增加競(jìng)爭(zhēng)冒險(xiǎn)出現(xiàn)的概率。 這一點(diǎn)在實(shí)際設(shè)計(jì)中通常會(huì)因?yàn)榇中亩鴮?dǎo)致設(shè)計(jì)異常,如下邊代碼中的S_clr_flag_a_all信號(hào),就是在擴(kuò)展時(shí)不小心使用了組合邏輯,這種情況下由于競(jìng)爭(zhēng)冒險(xiǎn),會(huì)導(dǎo)致跨時(shí)鐘域后的b信號(hào)出現(xiàn)一個(gè)clk的異常電平。
此時(shí)的跨時(shí)鐘域電路為:
正確的處理方法是使用時(shí)序邏輯進(jìn)行擴(kuò)展:
正確的電路為:
2、跨時(shí)鐘域信號(hào)要集中在一個(gè)位置跨時(shí)鐘域,然后再使用,不能分別跨時(shí)鐘域處理。
如下圖,a時(shí)鐘域的a信號(hào)要在b信號(hào)內(nèi)的b和b2兩個(gè)位置使用,正確的處理如下:
錯(cuò)誤的處理方式如下,這種處理方式下,由于b和b2分別做的跨時(shí)鐘域,由于時(shí)鐘抖動(dòng)、走線路徑的原因,會(huì)導(dǎo)致b和b2不同步,如果該信號(hào)是一個(gè)關(guān)鍵的控制信號(hào),會(huì)導(dǎo)致系統(tǒng)異常,要注意避免這種情況的發(fā)生。
二、FPGA跨時(shí)鐘域處理技術(shù)方法二
將ADC采樣的數(shù)據(jù)寫入RAM時(shí),需要產(chǎn)生RAM的寫地址,但我們讀出RAM中的數(shù)據(jù)時(shí),肯定不是一上電就直接讀取,而是要等RAM中有ADC的數(shù)據(jù)之后才去讀RAM。這就需要100MHz的時(shí)鐘對(duì)RAM的寫地址進(jìn)行判斷,當(dāng)寫地址大于某個(gè)值之后再去讀取RAM。
在這個(gè)場(chǎng)景中,其實(shí)很多人都是使用直接用100MHz的時(shí)鐘于RAM的寫地址進(jìn)行打兩拍的方式,但RAM的寫地址屬于多bit,如果單純只是打兩拍,那不一定能確保寫地址數(shù)據(jù)的每一個(gè)bit在100MHz的時(shí)鐘域變化都是同步的,肯定有一個(gè)先后順序。如果在低速的環(huán)境中不一定會(huì)出錯(cuò),在高速的環(huán)境下就不一定能保證了。所以更為妥當(dāng)?shù)囊环N處理方法就是使用格雷碼轉(zhuǎn)換。
對(duì)于格雷碼,相鄰的兩個(gè)數(shù)間只有一個(gè)bit是不一樣的(格雷碼,在本文中不作詳細(xì)介紹),如果先將RAM的寫地址轉(zhuǎn)為格雷碼,然后再將寫地址的格雷碼進(jìn)行打兩拍,之后再在RAM的讀時(shí)鐘域?qū)⒏窭状a恢復(fù)成10進(jìn)制。這種處理就相當(dāng)于對(duì)單bit數(shù)據(jù)的跨時(shí)鐘域處理了。
對(duì)于格雷碼與十進(jìn)制互換的代碼,僅提供給大家作參考:
代碼使用的是函數(shù)的形式,方便調(diào)用,op表示編碼或者譯碼,WADDRWIDTH和RADDRWIDTH表示位寬。
最后,小編誠心感謝大家的閱讀。你們的每一次閱讀,對(duì)小編來說都是莫大的鼓勵(lì)和鼓舞。希望大家對(duì)FPGA跨時(shí)鐘域處理技術(shù)方法都已經(jīng)有了初步的認(rèn)識(shí),最后的最后,祝大家有個(gè)精彩的一天。