叢紅艷,劉 瑛,萬(wàn) 清
(中國(guó)電子科技集團(tuán)公司第58研究所,江蘇 無(wú)錫 214035)
異步FIFO存儲(chǔ)器是一種先進(jìn)先出的電路,使用在時(shí)鐘頻率不同的數(shù)據(jù)接口部分,用來(lái)存儲(chǔ)、緩沖在兩個(gè)異步時(shí)鐘之間的數(shù)據(jù)傳輸。設(shè)計(jì)異步FIFO的關(guān)鍵是產(chǎn)生精確、可靠的“空”和“滿”信號(hào),空滿標(biāo)志主要用于在FIFO出口的入口向外部讀寫邏輯標(biāo)志FIFO的數(shù)據(jù)存儲(chǔ)情況,當(dāng)空標(biāo)志置位時(shí),讀時(shí)鐘域的讀寫邏輯不能繼續(xù)從FIFO讀數(shù)據(jù),否則會(huì)發(fā)生錯(cuò)誤。當(dāng)滿標(biāo)志置位時(shí),寫時(shí)鐘域的讀寫邏輯也不能繼續(xù)向FIFO寫數(shù)據(jù),否則會(huì)發(fā)生溢出。設(shè)計(jì)FIFO關(guān)鍵做到寫滿而不溢出,讀空又不多讀。
本設(shè)計(jì)采用SMIC 40 nm標(biāo)準(zhǔn)數(shù)字單元庫(kù)。首先由memory compiler自動(dòng)生成1024×18存儲(chǔ)器,根據(jù)電路的各項(xiàng)指標(biāo)要求,用Verilog硬件描述語(yǔ)言對(duì)其進(jìn)行RTL仿真,來(lái)實(shí)現(xiàn)配置為18 kB或者36 kB存儲(chǔ)器。對(duì)于18 kB,支持配置4k×4,2k×9,1k×18 FIFO,對(duì)于36 kB支持的配置是8k×4,4k×9,2k×18,1k×36 FIFO;Block RAM的端口A用作FIFO的讀端口,端口B是FIFO的寫端口[4]。NC、DC功能驗(yàn)證成功之后,綜合得出門級(jí)的電路圖,進(jìn)行靜態(tài)時(shí)序分析、版圖的自動(dòng)布局布線、反標(biāo)延時(shí)、后仿真直到流片。
讀寫FIFO使能產(chǎn)生是為了確保FIFO即不多讀又不多寫,采用了自我保護(hù)方式,如圖1所示。
圖1 讀寫使能產(chǎn)生
真正的寫FIFO使能為外部的寫使能和非滿的組合:Assign fi fo_write_allow = fi fo_wr_en&& ! fi fo_full_flag;真正的讀FIFO使能為外部的讀使能和非空的組合:Assign fifo_read_allow = fifo_read_en&& !fi fo_empty_ fl ag。
亞穩(wěn)態(tài)[1,3]是指觸發(fā)器信號(hào)和時(shí)鐘不滿足建立時(shí)間/保持時(shí)間(setup/hold)的基本要求,觸發(fā)器的輸出端將會(huì)達(dá)到一個(gè)不確定的狀態(tài),當(dāng)一個(gè)觸發(fā)器進(jìn)入亞穩(wěn)態(tài)時(shí),無(wú)法預(yù)測(cè)它的輸出電平,也無(wú)法預(yù)測(cè)其輸出何時(shí)才能穩(wěn)定在某個(gè)正確的電平上。在這期間,觸發(fā)器輸出一些中間級(jí)電平,或者可能處于振蕩狀態(tài)。并且這種錯(cuò)誤的輸出電平可以沿信號(hào)通道上的各個(gè)觸發(fā)器級(jí)聯(lián)式傳播下去,當(dāng)一個(gè)信號(hào)跨越某個(gè)時(shí)鐘時(shí),需要對(duì)該信號(hào)進(jìn)行同步,用以防止前級(jí)信號(hào)亞穩(wěn)態(tài)對(duì)后級(jí)信號(hào)產(chǎn)生影響。亞穩(wěn)態(tài)又是不可避免的,下面介紹的方法可以減少其發(fā)生的概率。
(1)對(duì)讀寫地址采用格雷碼
異步FIFO讀、寫指針如果采用二進(jìn)制表示指針,地址增1需要多位進(jìn)行翻轉(zhuǎn),在同一時(shí)鐘延采集多位數(shù)碼會(huì)造成邏輯誤判。而格雷碼編碼的相鄰兩個(gè)碼組之間只有一位不同,因而在計(jì)數(shù)時(shí),格雷碼只有一位發(fā)生改變,這樣與其他碼相比更為可靠,可以有效地減少亞穩(wěn)態(tài)的產(chǎn)生,也允許電路能夠以較少的穩(wěn)定時(shí)間在較高的速度下工作。同時(shí)采用三級(jí)觸發(fā)器來(lái)同步異步輸入信號(hào),信號(hào)同步的目的是為了防止上一級(jí)的亞穩(wěn)態(tài)信號(hào)對(duì)下級(jí)邏輯造成影響。格雷碼模塊延時(shí)3拍的結(jié)構(gòu)如圖2。
格雷碼是一種做加一運(yùn)算時(shí)只變化一位的編碼,表1即為一個(gè)三位格雷碼編碼格式。
圖2 采用格雷碼模塊設(shè)計(jì)延時(shí)3拍
表1 三位格雷碼編碼
可見(jiàn)格雷碼每次只在相鄰位發(fā)生變化,好處是它可避免因線延遲不一致而引起的毛刺現(xiàn)象。
(2)對(duì)讀寫地址采用單步循環(huán)碼
采用Gray碼的設(shè)計(jì)方式,由于其碼長(zhǎng)為2N,決定了這種存儲(chǔ)器的深度一定要為2N-1,使得這種設(shè)計(jì)方式存在局限性。采用單步循環(huán)碼可以設(shè)計(jì)任意深度的異步FIFO,深度不再限制在2N-1。
下面簡(jiǎn)單介紹單步循環(huán)碼[2],當(dāng)它采用4位編碼時(shí),碼的總長(zhǎng)度是12,分為上下兩部分,編碼的前半部分,MSB=0;編碼的下半部分MSB=1,兩部分編碼是反向的,同時(shí)當(dāng)MSB=0時(shí),低N-1位直接作為FIFO地址,當(dāng)MSB=1時(shí),低N-1位的反碼作為FIFO地址,如圖3所示,指針每經(jīng)過(guò)一次存儲(chǔ)循環(huán),F(xiàn)IFO地址完成兩次循環(huán),編碼的相鄰兩個(gè)碼組之間只有一位不同,即從一種狀態(tài)到另一種狀態(tài)的跳轉(zhuǎn)只會(huì)有一位翻轉(zhuǎn),因此具有單步循環(huán)碼的特性。
圖3 單步循環(huán)碼
但是單步循環(huán)碼不足之處是所需要的硬件開(kāi)銷較大,時(shí)序較之Gray碼存儲(chǔ)器也要差一些。因此只有當(dāng)所設(shè)計(jì)存儲(chǔ)器深度需求與2N相差較大時(shí),才會(huì)考慮采用這種設(shè)計(jì),例如,假設(shè)需要存儲(chǔ)深度為20,如果采用Gray碼設(shè)計(jì)不得不設(shè)計(jì)成深度為32的存儲(chǔ)器,而采用這種方式至少可以節(jié)省37%的面積。
最后對(duì)RTL代碼進(jìn)行了綜合,讀寫地址采用單步循環(huán)碼電路和格雷碼電路,性能指標(biāo)對(duì)照表如表2。
表2 不同編碼方式比較
由表2可知,由于采用格雷碼,提高了系統(tǒng)的穩(wěn)定性。但是不可避免的較之單步循環(huán)碼,需要更多的邏輯單元,需要更長(zhǎng)的數(shù)據(jù)傳輸時(shí)間。
空、滿、幾乎空、幾乎滿標(biāo)志設(shè)計(jì)好壞直接影響到整個(gè)異步FIFO的性能???、滿標(biāo)志產(chǎn)生的原則是:當(dāng)整個(gè)異步FIFO被寫滿時(shí)而不會(huì)溢出,當(dāng)整個(gè)異步FIFO被讀空時(shí)而不會(huì)多讀。而要產(chǎn)生精確的幾乎空、幾乎滿標(biāo)志,可以多做幾個(gè)格雷碼的延時(shí)地址,利用這些延時(shí)地址距離遠(yuǎn)近關(guān)系靈活產(chǎn)生特定讀寫間距的幾乎空、幾乎滿標(biāo)志。
(1)空標(biāo)志 fi fo_empty_ fl ag
當(dāng)讀F I F O的格雷碼地址等于寫的格雷碼地址時(shí),fifo_rd_cnt_gray= =fifo_wr_cnt_gray或者下次要讀的格雷碼地址等于格雷碼寫地址next_fifo_rd_cnt_gray= =fifo_wr_cnt_gray;并且正在執(zhí)行讀操作,此時(shí)需要置fifo_empty_flag標(biāo)志有效,其指針如圖4所示。
圖4 讀空時(shí)指針位置
(2)滿標(biāo)志 fi fo_full_ fl ag
當(dāng)寫FIFO的格雷碼地址等于上次讀的格雷碼地址時(shí)fifo_Wt_cnt_gray= =Last_fifo_rd_cnt_gray或者下次要寫的格雷碼地址等于上次讀的格雷碼地址next_fifo_wr_cnt_gray= =Last_fifo_rd_cnt_gray;并且正在執(zhí)行寫操作時(shí)需要置Full標(biāo)志有效,為了避免復(fù)雜的邏輯提高FIFO的整體速度可使用FIFO實(shí)際深度-1,寫滿指針如圖5所示。
圖5 寫滿時(shí)指針位置
(3)幾乎滿 fi fo_alfull_ fl ag
幾乎滿標(biāo)志,通過(guò)格雷碼的延時(shí)3拍的地址,然后利用讀寫格雷碼地址距離遠(yuǎn)近來(lái)產(chǎn)生特定讀寫地址間距,電路圖如圖6所示。
圖6 幾乎滿邏輯電路圖
(4)幾乎空與幾乎滿程序類似,由讀時(shí)鐘產(chǎn)生。幾乎滿和幾乎空如用同一個(gè)時(shí)鐘,那么誤差與兩個(gè)時(shí)鐘的具體大小相關(guān)。例如幾乎滿和幾乎空都是用寫時(shí)鐘得到的,那么幾乎滿比較精確。如果寫時(shí)鐘比讀時(shí)鐘慢,則幾乎空誤差較大,如果寫時(shí)鐘比讀時(shí)鐘快,那么幾乎空的誤差會(huì)比較精確。
本設(shè)計(jì)實(shí)現(xiàn)了一個(gè)規(guī)格可配置的雙時(shí)鐘異步FIFO,隨機(jī)選擇規(guī)格為1k×36的雙時(shí)鐘異步FIFO的verilog前仿,仿真工具采用ncverilog編譯RTL,進(jìn)行數(shù)字前仿真,并進(jìn)行了DC綜合。從仿真波形可以看到,F(xiàn)IFO控制信號(hào)能夠準(zhǔn)確地產(chǎn)生,并且整個(gè)FIFO的工作波形也符合設(shè)計(jì)要求。
仿真1(圖7):寫入空FIFO,寫滿后讀空,然后再寫。整個(gè)FIFO的空、滿、幾乎空、幾乎滿的標(biāo)志位變化。
仿真2(圖8):從滿FIFO中讀空數(shù)據(jù),當(dāng)讀空且在讀使能有效的情況下, fi fo_rd_err_ fl ag有效。
仿真3(圖9):寫入空FIFO,直到寫滿時(shí)標(biāo)志位的變化;當(dāng)寫滿且在寫使能有效的情況下,f fo_wr_err_flag有效。
仿真4(圖10):驗(yàn)證二進(jìn)制讀寫指針轉(zhuǎn)格雷碼讀寫指針正確性。
圖7 仿真1
圖8 仿真2
圖9 仿真3
圖10 仿真4
[1] 汪東,馬劍武,陳書(shū)明. 基于Gray碼的異步FIFO接口技術(shù)以及應(yīng)用[J]. 計(jì)算機(jī)工程與科學(xué),2005,27(11):58-60.
[2] Clifford E Cumming, PeterAlfke. Simulation and synthesis Technique for Asynchronous FIFO Design with Asynchronous Pointer Comparisons [Z]. SNUG,2012.1218.
[3] 夏宇聞. Verilog數(shù)字系統(tǒng)設(shè)計(jì)教程[M]. 北京:北京航天航空大學(xué)出版社,2008.
[4] 周敏. 高速異步FIFO的設(shè)計(jì)和實(shí)現(xiàn)[J]. 計(jì)算機(jī)工程與科學(xué),2009(2).