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