文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.183185
中文引用格式: 牛博,趙宏亮. 一種高可靠性高速可編程異步FIFO的設計[J].電子技術應用,2019,45(7):36-39,43.
英文引用格式: Niu Bo,Zhao Hongliang. Design of high reliability and high speed programmable asynchronous FIFO[J]. Application of Electronic Technique,2019,45(7):36-39,43.
0 引言
在現(xiàn)代的大規(guī)模ASIC設計中,常常涉及多時鐘系統(tǒng)控制方式,這樣就會產(chǎn)生不同時鐘域數(shù)據(jù)傳輸?shù)膯栴}。比較好的解決方案就是使用異步FIFO(First In First Out)來實現(xiàn)不同時鐘域數(shù)據(jù)傳輸?shù)木彌_[1-2]。這是因為,異步FIFO只按指針的遞增順序寫入數(shù)據(jù),并以同樣的順序讀出數(shù)據(jù),不需要外部讀寫地址線,使用起來非常簡單,這樣既可以使相異時鐘域數(shù)據(jù)傳輸?shù)臅r序要求變得寬松,也提高了它們之間的傳輸效率。因此,異步FIFO在網(wǎng)絡通信和數(shù)字信息處理等領域都有著廣泛的應用[3-6]。而高性能異步FIFO的研究也就成為了大規(guī)模集成電路設計領域的研究熱點之一,并取得了很多研究成果[7-10]。
例如,文獻[7]中,采取了比較同步指針的方法來降低亞穩(wěn)態(tài)出現(xiàn)的可能,這樣做確實保證了比較時兩個指針都是同步的,但是在進行大容量FIFO設計時,讀、寫指針的位數(shù)很多,同步模塊會使用大量的寄存器,這樣會大大增加設計成本,降低工作效率。而且該論文提到的設計方案在進行空滿判斷時,增加了一個地址位來標識讀寫指針的相對位置,這樣做不僅占用了過多的邏輯資源,還降低了FIFO控制系統(tǒng)的可移植性。文獻[8]中提到了一種通過判斷格雷碼前兩位來劃分存儲區(qū)間,進而判斷空滿的方法,但是由于這種判斷區(qū)間的劃分方式是通過硬件的形式實現(xiàn)的,可編程性不好。本設計為了滿足一款國產(chǎn)FPGA的芯片設計需求,在保證高可靠性的前提下,進一步增強了異步FIFO的可編程性,提出了一種基于格雷碼的、可以對近空滿示警閾值進行編程的異步FIFO,并且結合異步指針比較的方法提出了一種新的空滿判斷標準,進而提高了電路的工作速度和效率,最終設計出了一種具有高可靠性、高速及可編程性的高性能異步FIFO電路結構。
1 所提出的異步FIFO系統(tǒng)結構
所提出的異步FIFO設計思路是,在傳統(tǒng)FIFO模塊的基礎上,通過對電路結構和狀態(tài)判斷依據(jù)的改進和優(yōu)化,實現(xiàn)可靠性、可編程性和速度上的突破。傳統(tǒng)的FIFO主要具有讀、寫和空滿判斷的功能,它不需要外部讀寫地址線,這樣使用起來非常簡單,因此它只能順序寫入數(shù)據(jù),順序地讀出數(shù)據(jù),不能像普通存儲器那樣可以由地址線決定讀取或寫入某個指定的地址。本設計中增加了近空滿示警功能,使用者可以對FIFO進行編程設置示警閾值,并且增加了近空和近滿指示位來提示FIFO的狀態(tài),增加了FIFO的可編程性。FIFO模塊的系統(tǒng)結構圖如圖1所示。
整個FIFO可以劃分成四種模塊:存儲模塊、指針產(chǎn)生模塊、指針比較模塊和標志位產(chǎn)生模塊。r_clk為讀時鐘;w_clk為寫時鐘;data_in為寫入數(shù)據(jù);data_out為讀出數(shù)據(jù);ale_num為近空示警閾值;alf_num為近滿示警閾值;r_ptr為讀指針;w_ptr為寫指針;al_empty為近空標志;al_full為近滿標志;empty為空標志;full為滿標志;alr_ptr為近空指針;alw_ptr為近滿指針。
雙端口SRAM具有兩個完全獨立的讀、寫端口,使用時可以選定一個端口寫入data_in,另一個端口讀出data_out,這樣讀操作和寫操作互相獨立,比較適合用來實現(xiàn)FIFO的功能。在圖1中可以看出,一個FIFO可以分成讀時鐘域和寫時鐘域兩個完全相互獨立的時鐘域。寫指針模塊根據(jù)w_clk產(chǎn)生w_ptr并且在w_ptr上疊加alf_num產(chǎn)生alw_ptr,w_ptr一方面會控制存儲模塊將data_in寫入,寫入的數(shù)據(jù)將由r_ptr控制讀出,另一方面w_ptr和alw_ptr進入指針比較模塊與讀指針產(chǎn)生的r_ptr和alr_ptr進行比較,比較的結果進入標志位產(chǎn)生模塊進行判斷,產(chǎn)生空、滿、近空和近滿標志位,如果FIFO讀空,則停止e_ptr,如果寫滿,則停止w_ptr。
在以上的系統(tǒng)設計中不難看出,系統(tǒng)指針間互相比較過程中數(shù)據(jù)的可靠性和空滿判斷過程中系統(tǒng)的精確度制約著系統(tǒng)性能的提升。因此,在第二節(jié)和第三節(jié)中,將分別詳細闡述系統(tǒng)指針比較和空滿判斷的設計方案。
2 系統(tǒng)指針比較的設計方案
在數(shù)據(jù)的傳輸過程中,接收寄存器收到變化的數(shù)據(jù)時,如果數(shù)據(jù)的改變發(fā)生在時鐘觸發(fā)沿,那么會導致接受數(shù)據(jù)出現(xiàn)不穩(wěn)定的狀態(tài),這種狀態(tài)叫做亞穩(wěn)態(tài)。進入亞穩(wěn)態(tài)時,既無法預測該單元的輸出電平,也無法預測何時輸出才能穩(wěn)定在某個正確的電平上。在這個穩(wěn)定期間,將會輸出一些中間級電平,或者可能處于振蕩狀態(tài),并且這種無用的輸出電平可以沿信號通道級聯(lián)式傳播下去。亞穩(wěn)態(tài)的發(fā)生會使得FIFO出現(xiàn)錯誤,讀、寫時鐘采樣的地址指針會與真實的值之間不同,這就導致寫入或讀出的地址錯誤。亞穩(wěn)態(tài)無法徹底消除,只能想辦法將其發(fā)生的概率降到最低。傳統(tǒng)的FIFO電路中為了解決亞穩(wěn)態(tài)問題采取的方法是使用指針同步模塊,經(jīng)過同步的指針之間進行比較就不存在亞穩(wěn)態(tài)的問題了。指針同步模塊一般采用圖2中所示的結構。假設clk1與clk2為異步時鐘,當data1的改變發(fā)生在B2的觸發(fā)沿處時,data2就有可能出現(xiàn)一個亞穩(wěn)態(tài),但是,這時B3捕獲和發(fā)送的是上一個沒有出現(xiàn)亞穩(wěn)態(tài)時的數(shù)據(jù),在下一個clk2時鐘觸發(fā)沿到來時,data2很可能已經(jīng)趨于穩(wěn)定,變?yōu)榇_定值0或者1,這樣的話B3就是對一個確定值進行捕獲。當然,data2也有可能無法在一個時鐘周期中穩(wěn)定,但是data3出現(xiàn)亞穩(wěn)態(tài)的概率被極大地降低了。
使用比較同步指針的方法雖然可靠性高,但是當FIFO的數(shù)據(jù)深度很大時,指針一般都有很多位,這就需要對每一位都進行同步,極大地增加了寄存器的使用數(shù)量,增加了設計成本。
針對這種情況可以考慮使用格雷碼指針。格雷碼在相鄰的兩個碼元之間只由一位變換(二進制碼在很多情況下是很多碼元在同時變化)。這就會避免指針變動的時候發(fā)生亞穩(wěn)態(tài)現(xiàn)象。在寫地址和讀地址傳輸前,為了提高數(shù)據(jù)的穩(wěn)定性,采用格雷碼替換二進制碼進行計數(shù)。這樣的話就可以不使用指針同步模塊,采取比較異步指針的方法,將兩個異步指針直接進行比較,然后把比較后得出的標志位同步到想要的時鐘域即可。本設計中指針產(chǎn)生模塊的原理圖如圖3所示。
二進制指針產(chǎn)生模塊的基本原理就是一個二進制加法計數(shù)器,每有一個時鐘上升沿來臨,它都會在之前輸出數(shù)值的基礎上加一,這樣可以產(chǎn)生一個逐步累加的二進制指針,這個二進制指針進入半加器與近空滿示警閾值相加產(chǎn)生一個用于近空滿比較二進制指針,最后,這兩種指針都會被格雷碼產(chǎn)生模塊轉化為格雷碼指針輸出。設計中使用格雷碼是為了降低亞穩(wěn)態(tài)出現(xiàn)的概率,節(jié)省邏輯開銷,降低設計成本;對指針類型進行擴充,增加了近空滿示警閾值和近空滿指針,是為了提升FIFO的可編程性。
3 空滿判斷的設計方案
由于FIFO的功能需要一邊讀一邊寫,因此實際上FIFO的容量并不等于同SRAM存儲器陣列的實際容量,而是取決于讀指針和寫指針的相對速度。FIFO模塊正確使用的初始狀態(tài)一定是寫指針在讀指針之前,這樣可以保證讀出的內容都是經(jīng)過寫入的數(shù)據(jù),經(jīng)過一段時間的讀寫后,如果由于讀指針追趕上了寫指針而致使讀寫指針相同,說明存儲其中的數(shù)據(jù)被讀空,再進行下去會讀出錯誤的數(shù)據(jù);如果是寫指針追趕上了讀指針,則說明存儲器被寫滿,再進行下去則會使未讀出的數(shù)據(jù)被重寫。以上兩種情況是一定要避免的,所以如何判斷空滿狀態(tài),關系到FIFO的精確度和可靠性。
傳統(tǒng)的做法是增加一位地址位來表示讀寫指針的相對位置,由于這種方法增加了一位地址位,使FIFO地址位的數(shù)量與SRAM地址位數(shù)量不同,降低了FIFO控制器的可移植性,而且增加的這一位地址位實際上增加了不必要的邏輯開銷??紤]到設計中提到的FIFO增添了近空滿示警標志位,所以可以借助近示警標志位來產(chǎn)生空滿標志位。其狀態(tài)判斷原理如圖4所示。
近空滿示警標志位產(chǎn)生的原理是,將讀寫指針加上一個二進制數(shù)作為示警的閾值,這樣就有了四種不同的指針,分別為讀、寫指針和近空滿讀寫指針,使用這四種指針相互比較就能得出想要的結果。在FIFO使用過程中,如果近空滿讀指針等于寫指針,說明讀指針的速度比寫指針速度快,近空滿示警信號指示FIFO近空,這時只需要注意FIFO被讀空,一旦讀寫指針相等就可以判斷FIFO讀空;如果近空滿寫指針等于讀指針,則說明寫指針的速度快,應指示近滿,F(xiàn)IFO只存在寫滿的風險,一旦讀寫指針相等即判斷FIFO寫滿。這種空滿判斷方法借助了示警標志位,不需要增加額外的指針位,提高了邏輯利用率和FIFO控制器的可移植性,而且這樣做不需要對方向位進行運算,提升了運行速度。
4 仿真驗證
本設計基于UMC 28 nm標準CMOS工藝,采用全定制方法進行電路設計。使用Hspice軟件進行了電路仿真驗證。仿真結果表明,提出的異步FIFO在1 V的標準電壓下,最高工作頻率為666.6 MHz,功耗為7.1 mW。具體仿真結果如圖5所示。
對近空、空標志位進行驗證時,使用的讀時鐘周期為1.5 ns(666.6 MHz),寫時鐘周期為2.5 ns(400 MHz),近空示警閾值設置為17,一共用到了9位二進制地址,按照格雷碼的規(guī)律變化。仿真結果如圖5(a)所示。圖中r_ptr為讀指針信號,w_ptr為寫指針信號,均以3位十六進制數(shù)的形式表示;empty為讀空信號(高有效);al_empty為近空信號(低有效)??梢钥闯?,當讀寫指針相等時讀空信號有效,并且近空信號提前17個讀周期示警FIFO快要讀空。
對近滿、滿標志位進行驗證時,使用的讀時鐘周期為2.5 ns(400 MHz),寫時鐘周期為1.5 ns(666.6 MHz),近空示警閾值設置為15,一共用到了9位二進制地址,按照格雷碼的規(guī)律變化。仿真結果如圖5(b)所示。圖中w_ptr為寫指針信號,r_ptr為讀指針信號,均以3位十六進制數(shù)的形式表示;full為寫滿信號(高有效);al_full為近滿信號(低有效)。可以看出,當讀寫指針相等時寫滿信號有效,并且近滿信號提前15個寫周期示警FIFO快要讀空。
5 結論
在傳統(tǒng)FIFO結構的基礎上,通過對電路結構和狀態(tài)判斷依據(jù)的改進和優(yōu)化,提出了一種高性能異步FIFO電路結構。基于UMC 28 nm標準CMOS工藝進行電路設計、仿真與驗證。仿真結果表明,提出的異步FIFO結構具有高可靠性、高速及可編程性等優(yōu)點,能夠滿足國產(chǎn)FPGA芯片研發(fā)的系統(tǒng)需求。
參考文獻
[1] 金大超,冷建偉.異步時鐘域信號同步的實現(xiàn)[J].天津理工大學學報,2017,33(3):40-44.
[2] 劉杰,賽景波.基于DDR2 SDRAM乒乓雙緩沖的高速數(shù)據(jù)收發(fā)系統(tǒng)設計[J].電子器件,2015,38(3):650-654.
[3] 莊洪毅.一種基于FX2與FPGA聯(lián)用實現(xiàn)USB2.0通訊協(xié)議的方法[J].電子測量技術,2017,40(4):78-81.
[4] 馮國富,馬玉齊,陳明,等.一種面向船聯(lián)網(wǎng)的“北斗”異步FIFO多通道模型[J].微電子學與計算機,2017,34(2):1-5.
[5] 吳修英,黃嵩人.浮點型DSP中異步FIFO的研究與設計[J].電子世界,2018,1(69):145-146.
[6] 倪露,鄒學玉.LZW的異步FIFO輸入緩沖設計[J].電子測量技術,2015,38(4):19-23.
[7] 司嵐山,吳海宏,王勇,等.一種大容量異步FIFO的設計與實現(xiàn)[J].微電子學,2013,43(3):405-408.
[8] 李賽,蔣林.OTN中異步FIFO的設計與實現(xiàn)[J].光通信研究,2015,191(5):55-58.
[9] 王齊雙,黃震春,蒲海峰.基于FPGA的異步FIFO的設計方案及性能[J].彈箭與制導學報,2014,34(6):185-189.
[10] 肖靜嫻,戴亞文.基于FPGA的異步FIFO緩存設計[J].電子測量技術,2009,32(11):92-94.
作者信息:
牛 博,趙宏亮
(遼寧大學 物理學院,遼寧 沈陽110036)