摘要:FIFO經常應用于從一個時鐘域傳輸數據到另一個異步時鐘域。為解決異步FIFO設計過程中空滿標志判斷難以及FPGA亞穩(wěn)態(tài)的問題,,提出一種新穎的設計方案,,即利用格雷碼計數器(每次時鐘到來僅有1位發(fā)生改變)表示讀/寫指針,設計二級同步鏈為跨越不同時鐘域的讀/寫指針,,以提供充足的穩(wěn)定時間,,并通過對比格雷碼指針產生空滿標志位。該設計采用VHDL語言進行設計,,利用ALTERA公司的FPGA得以實現,。經驗證進一步表明,模塊化的設計不僅避免了亞穩(wěn)態(tài)的產生,,增大平均無故障工作時間(MBTF),,也使工作效率大為提升。
關鍵詞:FIFO,;異步,;亞穩(wěn)態(tài);格雷碼
先進先出緩存電路讀/寫(FIFO)在大規(guī)模邏輯設計中被廣泛應用,,幾乎每個芯片都要涉及,,同樣在空空導彈的數據傳輸體系中也得以大量應用。FIFO類型可以分為兩種,,第一種為同步FIFO,,即讀/寫時鐘是同步的,這里的同步不僅僅是指讀/寫時鐘為同一個時鐘,,即屬于同一個時終域,。當讀/寫時鐘頻率為倍數關系,即相位關系確定時,,也歸屬同步FIFO的范疇,。另一種為異步FIFO,讀/寫時鐘頻率不成倍數關系或相位關系不確定,,即跨時鐘域,。異步FIFO可以在不同的時鐘域之間快速方便地傳輸實時數據,因此在遙測數據傳輸中,異步FIFO實用性更好,。然而如何正確地產生空滿標志以及如果解決亞穩(wěn)態(tài)問題是異步FIFO設計的難點,。
1 FIFO結構
首先,典型的FIFO結構框圖如圖1所示,。FIFO的數據存儲在具有獨立寫端口和讀端口的RAM中,。讀指針r0_pointer指向下一個將要讀取的位置,寫指針wrpointer指向下一個將要寫入的位置,,每1次寫操作后寫指針加1,,讀操作使讀指針加1,。狀態(tài)產生模塊中,,full和empty表示FIFO讀/寫的臨界狀態(tài)。FIFO設計的關鍵是產生讀/寫地址和空滿標志,??諠M標志是基于引起指針相等的操作。如果是復位或者讀操作引起
讀/寫指針相等,,FIFO認為是空,;如果原因是寫操作,那么FIFO認為是滿,。異步FIFO設計的難點是如何同步跨時鐘域的指針以及空滿標志的產生,。
2 亞穩(wěn)態(tài)
亞穩(wěn)態(tài)是當信號在無關的電路中或異步時鐘域之間傳輸時導致FPGA系統失效的一種現象。包括FPGA在內的所有數字器件的寄存器都定義了信號時序要求,,以保證每一個寄存器都能夠從輸入端獲取數據和在輸出端產生數據,。為了確保可靠的操作,,輸入信號必須在時鐘沿之前穩(wěn)定一段時間(寄存器建立時間tsu),,并且在時鐘沿之后穩(wěn)定一段時間(寄存器保持時間th),然后寄存器輸出經過一個特定的時鐘到輸出延時后有效,。滿足此要求寄存器才可以正確的在輸入端獲取數據在輸出端產生數據,,否則輸出有可能是亞穩(wěn)態(tài)。在亞穩(wěn)態(tài)時,,寄存器的輸出電壓在高低電平之間搖擺,,即輸出將有可能是邏輯0(0 V)或者邏輯1(+5 V),或者是介于0~5 V中間的某個值,。亞穩(wěn)態(tài)產生機制圖如圖2所示,,當建立時間或者保持時間不滿足時序要求時便會產生亞穩(wěn)態(tài)。
在同步系統中,,輸入信號必須總是滿足寄存器時序要求,,所以亞穩(wěn)態(tài)不會發(fā)生。亞穩(wěn)態(tài)問題通常發(fā)生在當一個信號在無關的線路中或異步時鐘域中傳輸。一個寄存器進入亞穩(wěn)態(tài)和從亞穩(wěn)態(tài)進入穩(wěn)態(tài)的時間依賴于制造商的制造工藝和使用環(huán)境,。大部分情況下,,寄存器會很快的進入一個定義的穩(wěn)態(tài)中。在異步FIFO設計中就要避免亞穩(wěn)態(tài)的產生,。
3 解決問題的方法
3.1 同步寄存器
當信號在不相關或者異步時鐘域傳輸時,,在新的時鐘域使用這個信號之前必須進行同步,比如異步FIFO的讀指針被同步到寫時鐘域或寫指針被同步到讀時鐘域,。新時鐘域里的第一個寄存器的作用就是一個同步寄存器,。同步裝置中寄存器到寄存器路徑上的時序裕量可以為亞穩(wěn)態(tài)信號提供穩(wěn)定時間。由兩個寄存器組成的二級同步鏈如圖3所示,,它大大的提高了系統的平均無故障工作時間(MTBF),,減少了信號傳輸過程中亞穩(wěn)態(tài)問題的風險。此外,,可以通過三級同步進一步增加MTBF值,,但在實際中很少需要。
3.2 格雷碼(Gray code)計數器
設計異步FIFO的原則是安全可靠地把數據從一個時鐘域傳輸到另一個時鐘域,。如果用一個相對于計數器時鐘是異步的時鐘來取樣計數器的值,,就要考慮計數器的每一位在哪個范圍內變化,每一位都有機會同時發(fā)生變化,,比如從FFFF變化到0000,,這時每個單獨的位都處于亞穩(wěn)態(tài)。這種變化意味著讀數有可能是0000~FFFF之間的任意一個值,。這種情況下FIFO將無法正常工作,,于是設計一個格雷碼來表示的計數器,
因為格雷碼是最小距離碼,,相鄰的碼元只有1位不同,,它可以避免因延遲不一致而引起的毛刺現象。
計數器由觸發(fā)器組和累加器組成,,處理格雷碼計數器的辦法為:將格雷碼轉換為二進制碼元,,然后加1,再將它轉換回格雷碼并存儲,,這是解決產生N位格雷碼算法棘手問題的一個辦法,。異步FIFO的寫地址和讀地址由格雷碼計數器來實現計數,讀/寫指針均用格雷碼來表示,,格雷碼計數器指針原理如圖4所示,,當FIFO非空或者非滿時,讀指針或者寫指針實現加1操作,。
3.3 一種新穎的設計方法產生空滿標志
空滿標志位是通過比較讀/寫指針來判斷的,,空滿標志的判斷方法:對于二進制地址來說,,如果RAM大小為M,那么它需要的地址位寬度為N=log2 M,。假設雙口RAM大小是8 B,,所需尋址地址位寬度是3 b。如果讀/寫指針均用3位來表示的話,,那么當讀/寫指針相等時,,無法判別是讀時針追上了寫時針造成讀空還是寫時針追上了讀時針造成寫滿,這樣就無法正確判斷空,、滿標志,。為了方便的區(qū)分空、滿,,讀/寫指針各增加1位,,取地址指針寬度為log2M+1,尋址中沒有使用的最高位地址標記為MSB,,即讀/寫指針為N+1位,,尋址范圍為2n,。表1為格雷碼表示的4位地址指針,。
仔細觀察表1并分析數據,一種新穎的判斷空滿標志的方法為:當讀/寫指針的最高位(MSB)不相等且讀/寫指針的次高位不相等,,剩余的N-2位地址相等時,,此時寫指針追上了讀指針,即寫指針比讀指針多轉一圈,,狀態(tài)模塊輸出滿標志,;當讀/寫指針N+1位都相等時,狀態(tài)模塊輸出空標志,。判斷滿標志部分的VHDL代碼:
3.4 異步FIFO總體設計
通過時針比較產生的異步FIFO框圖如圖5所示,。WCLK和RCLK分別為讀時鐘和寫時鐘,wrst_n和rrst_n分別為讀/寫模塊的復位信號,。 rdata為數據輸出端口,,wdata為數據輸入端口。異步FIFO通過讀/寫指針來尋址一個雙口RAM來實現對數據的讀/寫,,雙口RAM的大小為2nB,。讀指針被二級同步鏈到寫時鐘域,然后與寫時針比較產生滿標志,,讀指針產生讀地址raddress,;寫時針被二級同步鏈同步到讀時鐘域,然后與讀時鐘比較產生空標志,,寫指針產生寫地址waddress,。需要注意的是此異步FIFO設計中,,空滿標志是保守的空滿標志,比如滿標志,,當讀時針通過二級同步鏈同步到寫時鐘域且滿足滿標志的條件時,,寫指針停止加1操作,而同步讀指針的過程中,,讀時針則移動到了其他的地址,,同樣的適合于空標志,當輸出空,,滿時,,其實FIFO的真實狀態(tài)是還有空間沒被寫滿或者讀空,這就是保守的空和滿,,而這正保證了FIFO不會向上會向下溢出,,進一步提高了FIFO工作的可靠性。
表2為平均無故障工作時間的對比,,C1和C2依賴于器件工藝,。
4 結語
一個高的平均無故障工作時間表明一個設計是優(yōu)秀的,提高亞穩(wěn)態(tài)的平均無故障工作時間減少信號傳輸中導致亞穩(wěn)態(tài)問題的風險,。本文通過研究FIFO的基本結構以及FPGA亞穩(wěn)態(tài)的產生機理,,提出了利用二級同步鏈和格雷碼計數器指針解決了同步以及空滿狀態(tài)判斷的難題,給出了VHDL軟件代碼,,且該設計已經通過QuartusⅡ的時序仿真驗證,,作為獨立模塊可以應用到需要異步時鐘域傳輸數據的電路中,大大提高異步數據傳輸效率及平均無故障工作時間,。