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