基于VHDL的異步FIFO設(shè)計(jì)
3 解決問題的方法
3.1 同步寄存器
當(dāng)信號(hào)在不相關(guān)或者異步時(shí)鐘域傳輸時(shí),在新的時(shí)鐘域使用這個(gè)信號(hào)之前必須進(jìn)行同步,比如異步FIFO的讀指針被同步到寫時(shí)鐘域或?qū)懼羔槺煌降阶x時(shí)鐘域。新時(shí)鐘域里的第一個(gè)寄存器的作用就是一個(gè)同步寄存器。同步裝置中寄存器到寄存器路徑上的時(shí)序裕量可以為亞穩(wěn)態(tài)信號(hào)提供穩(wěn)定時(shí)間。由兩個(gè)寄存器組成的二級(jí)同步鏈如圖3所示,它大大的提高了系統(tǒng)的平均無故障工作時(shí)間(MTBF),減少了信號(hào)傳輸過程中亞穩(wěn)態(tài)問題的風(fēng)險(xiǎn)。此外,可以通過三級(jí)同步進(jìn)一步增加MTBF值,但在實(shí)際中很少需要。本文引用地址:http://www.ex-cimer.com/article/178738.htm
3.2 格雷碼(Gray code)計(jì)數(shù)器
設(shè)計(jì)異步FIFO的原則是安全可靠地把數(shù)據(jù)從一個(gè)時(shí)鐘域傳輸?shù)搅硪粋€(gè)時(shí)鐘域。如果用一個(gè)相對(duì)于計(jì)數(shù)器時(shí)鐘是異步的時(shí)鐘來取樣計(jì)數(shù)器的值,就要考慮計(jì)數(shù)器的每一位在哪個(gè)范圍內(nèi)變化,每一位都有機(jī)會(huì)同時(shí)發(fā)生變化,比如從FFFF變化到0000,這時(shí)每個(gè)單獨(dú)的位都處于亞穩(wěn)態(tài)。這種變化意味著讀數(shù)有可能是0000~FFFF之間的任意一個(gè)值。這種情況下FIFO將無法正常工作,于是設(shè)計(jì)一個(gè)格雷碼來表示的計(jì)數(shù)器,
因?yàn)楦窭状a是最小距離碼,相鄰的碼元只有1位不同,它可以避免因延遲不一致而引起的毛刺現(xiàn)象。
計(jì)數(shù)器由觸發(fā)器組和累加器組成,處理格雷碼計(jì)數(shù)器的辦法為:將格雷碼轉(zhuǎn)換為二進(jìn)制碼元,然后加1,再將它轉(zhuǎn)換回格雷碼并存儲(chǔ),這是解決產(chǎn)生N位格雷碼算法棘手問題的一個(gè)辦法。異步FIFO的寫地址和讀地址由格雷碼計(jì)數(shù)器來實(shí)現(xiàn)計(jì)數(shù),讀/寫指針均用格雷碼來表示,格雷碼計(jì)數(shù)器指針原理如圖4所示,當(dāng)FIFO非空或者非滿時(shí),讀指針或者寫指針實(shí)現(xiàn)加1操作。
3.3 一種新穎的設(shè)計(jì)方法產(chǎn)生空滿標(biāo)志
空滿標(biāo)志位是通過比較讀/寫指針來判斷的,空滿標(biāo)志的判斷方法:對(duì)于二進(jìn)制地址來說,如果RAM大小為M,那么它需要的地址位寬度為N=log2 M。假設(shè)雙口RAM大小是8 B,所需尋址地址位寬度是3 b。如果讀/寫指針均用3位來表示的話,那么當(dāng)讀/寫指針相等時(shí),無法判別是讀時(shí)針追上了寫時(shí)針造成讀空還是寫時(shí)針追上了讀時(shí)針造成寫滿,這樣就無法正確判斷空、滿標(biāo)志。為了方便的區(qū)分空、滿,讀/寫指針各增加1位,取地址指針寬度為log2M+1,尋址中沒有使用的最高位地址標(biāo)記為MSB,即讀/寫指針為N+1位,尋址范圍為2n。表1為格雷碼表示的4位地址指針。
評(píng)論