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