丁彬勇,白雪飛,黃 魯
(中國(guó)科學(xué)技術(shù)大學(xué) 電子科學(xué)與技術(shù)系 集成電路實(shí)驗(yàn)室,安徽 合肥 230027)
在現(xiàn)代集成電路設(shè)計(jì)中,隨著集成度的不斷提升,常常會(huì)遇到數(shù)據(jù)緩存與不同時(shí)鐘域之間數(shù)據(jù)傳遞的問(wèn)題,在不同系統(tǒng)間如不能設(shè)計(jì)出有效的接口單元,將會(huì)產(chǎn)生數(shù)據(jù)傳輸過(guò)程中的復(fù)寫(xiě)、丟失和無(wú)效數(shù)據(jù)的讀入等錯(cuò)誤,同時(shí)亞穩(wěn)態(tài)現(xiàn)象也會(huì)出現(xiàn)在不同時(shí)鐘域之間的數(shù)據(jù)傳遞過(guò)程中。此時(shí),如何實(shí)現(xiàn)數(shù)據(jù)高速有效的傳輸并克服跨時(shí)鐘域間數(shù)據(jù)傳遞時(shí)的亞穩(wěn)態(tài)成為一個(gè)關(guān)鍵點(diǎn)問(wèn)題。由于異步FIFO (First In First Out)能夠有效解決不同傳輸速度和不同時(shí)鐘域之間數(shù)據(jù)傳遞的問(wèn)題,異步FIFO在實(shí)際電路中得到廣泛的運(yùn)用。本文介紹一種基于ASIC的高速異步FIFO的設(shè)計(jì)和實(shí)現(xiàn)方案。

異步FIFO指在不同時(shí)鐘域之間,由一個(gè)時(shí)鐘域?qū)懭?,待?xiě)入數(shù)據(jù)穩(wěn)定之后,由另一個(gè)時(shí)鐘域讀出。圖1為異步FIFO的基本結(jié)構(gòu)框圖,F(xiàn)IFO的存儲(chǔ)單元采用雙端口RAM的解決方式,同步模塊SYNC完成異步讀寫(xiě)時(shí)鐘域之間指針信號(hào)的同步過(guò)程,將同步前后的指針?biāo)偷?wrfull、rdempty模塊,產(chǎn)生 wrfull、rdempty信號(hào),從而構(gòu)成一個(gè)完整的FIFO。

表1 FIFO各信號(hào)列表
在不同時(shí)鐘域之間傳遞的信號(hào),由于兩個(gè)時(shí)鐘之間沒(méi)有清楚的相位和頻率關(guān)系,很容易出現(xiàn)亞穩(wěn)態(tài)現(xiàn)象。亞穩(wěn)態(tài)是指觸發(fā)器無(wú)法在某個(gè)規(guī)定的時(shí)間段內(nèi)達(dá)到一個(gè)可以確認(rèn)的狀態(tài)。當(dāng)一個(gè)觸發(fā)器進(jìn)入亞穩(wěn)態(tài)時(shí),觸發(fā)器會(huì)輸出一些中間電平,或者可能處于振蕩狀態(tài)。在數(shù)字電路中,如果將亞穩(wěn)態(tài)信號(hào)直接應(yīng)用于后續(xù)的組合邏輯,將會(huì)產(chǎn)生難以預(yù)測(cè)的結(jié)果。圖2所示為異步時(shí)鐘的亞穩(wěn)態(tài)現(xiàn)象,圖中CLK_A和CLK_B為異步時(shí)鐘。

圖2 異步時(shí)鐘和亞穩(wěn)態(tài)
亞穩(wěn)態(tài)是不可避免的,但可以采用合適的方法將其降低到一個(gè)合適的低概率水平。
首先可以從讀寫(xiě)地址指針的編碼入手。若采用傳統(tǒng)的二進(jìn)制計(jì)數(shù),地址指針的每次增加,則有可能出現(xiàn)從全1到全0的所有位的同時(shí)跳變,這種情況使得出現(xiàn)亞穩(wěn)態(tài)的概率大大增加。本文將采用一種特殊的編碼方式,使得地址指針的每次增加只會(huì)出現(xiàn)一位改變,從而減小亞穩(wěn)態(tài)發(fā)生的概率。
其次可以采用兩級(jí)鎖存的辦法。如圖3所示,在一個(gè)信號(hào)進(jìn)入另一個(gè)時(shí)鐘域前,將該信號(hào)用兩級(jí)觸發(fā)器進(jìn)行鎖存,即使第一級(jí)觸發(fā)器的輸出出現(xiàn)亞穩(wěn)態(tài),經(jīng)過(guò)一個(gè)時(shí)鐘周期之后,進(jìn)入第二級(jí)觸發(fā)器的信號(hào)已經(jīng)穩(wěn)定到一個(gè)確定的電平,從而兩級(jí)鎖存的輸出可以有效減小亞穩(wěn)態(tài)發(fā)生的概率。

傳統(tǒng)的FIFO指針編碼采用格雷碼編碼的方式。用格雷碼表示的地址指針,每次指針的增加,地址指針只會(huì)有一位發(fā)生變化,降低了指針信號(hào)跳變的次數(shù),從而有效減小了亞穩(wěn)態(tài)出現(xiàn)的概率[1]。
與格雷碼編碼不同,本文設(shè)計(jì)的FIFO,其指針編碼采用的是一種稱(chēng)為移位碼的編碼方式,移位碼的計(jì)數(shù)規(guī)則是每左移一位,將最高位取反后移入最低位[2]。表2分別列出了二進(jìn)制碼、格雷碼與移位碼的對(duì)比情況。

表2 二進(jìn)制碼、格雷碼和移位碼
由表2可知,移位碼每個(gè)相鄰的碼字之間只有一位不同,該特性與格雷碼相似,可以有效減小亞穩(wěn)態(tài)出現(xiàn)的概率;并且移位碼計(jì)數(shù)一個(gè)周期等同于二進(jìn)制碼計(jì)數(shù)兩個(gè)周期,這在之后產(chǎn)生空滿(mǎn)標(biāo)志的過(guò)程中將會(huì)有很好的應(yīng)用。
當(dāng)FIFO的深度為n時(shí),二進(jìn)制碼和格雷碼的碼字長(zhǎng)度是log2(n),而移位碼的碼字長(zhǎng)度為n,這也是移位碼的一個(gè)缺點(diǎn),碼字長(zhǎng),造成電路中需要更多的寄存器,使得電路面積增大,不過(guò)由于計(jì)數(shù)和產(chǎn)生空滿(mǎn)標(biāo)志位電路的結(jié)構(gòu)更簡(jiǎn)單,使得面積又得以有效減小。移位碼計(jì)數(shù)電路非常簡(jiǎn)單,采用移位碼編碼的寫(xiě)指針計(jì)數(shù)電路如圖4所示,其中wr_ptr為時(shí)鐘同步后的指針輸出,wr_ptr_nxt為下一時(shí)鐘指針預(yù)輸出,讀指針與之相似。

圖4 移位碼寫(xiě)指針計(jì)數(shù)電路
FIFO的存儲(chǔ)器可以采用定制的雙端口RAM或DFF搭建而成。由于本文設(shè)計(jì)的32×8的FIFO存儲(chǔ)容量不大,所以都是采用DFF搭建而成。
觀察表2的移位碼可以看出,若將當(dāng)前移位碼與下一位移位碼異或,即可快速得到用于存儲(chǔ)單元的尋址信號(hào),以下為寫(xiě)地址描述,讀地址與之相似。
assign wr_addr=wr_ptr^wr_ptr_nxt;
空滿(mǎn)標(biāo)志位的產(chǎn)生,首先要對(duì)讀寫(xiě)指針進(jìn)行同步,同步方法即采用前文所述的三級(jí)DFF進(jìn)行不同時(shí)鐘域之間的同步。采用格雷碼編碼方式時(shí),在同步之前需將二進(jìn)制地址指針轉(zhuǎn)化為格雷碼進(jìn)行同步,同步之后再轉(zhuǎn)化為二進(jìn)制碼來(lái)產(chǎn)生空滿(mǎn)標(biāo)志[3],這就使得電路結(jié)構(gòu)復(fù)雜化,無(wú)形中就增加了電路面積。而在采用移位碼編碼方式下,由于移位碼的每次改變只有一位發(fā)生變化,因此直接采用兩級(jí)DFF對(duì)其地址指針進(jìn)行同步,同步之后將同一時(shí)鐘域內(nèi)的讀寫(xiě)指針進(jìn)行比較就可以產(chǎn)生空滿(mǎn)標(biāo)志位了。
仔細(xì)觀察表2可以看出一種產(chǎn)生空滿(mǎn)標(biāo)志位的巧妙方法:當(dāng)寫(xiě)指針等于同步到寫(xiě)時(shí)鐘域內(nèi)的讀指針按位取反時(shí),表示寫(xiě)指針在多遍歷一邊FIFO的基礎(chǔ)上追上了讀指針,即FIFO已滿(mǎn)。又由于滿(mǎn)標(biāo)志的產(chǎn)生是因?yàn)閷?xiě)時(shí)鐘域內(nèi)的寫(xiě)指針的增加,失效是由于讀時(shí)鐘域內(nèi)讀指針的增加,所以要把滿(mǎn)標(biāo)志信號(hào)同步到寫(xiě)時(shí)鐘域[4],產(chǎn)生wrfull信號(hào),Verilog實(shí)現(xiàn)如下:

空標(biāo)志位的產(chǎn)生與滿(mǎn)標(biāo)志有一點(diǎn)不同,當(dāng)讀指針與寫(xiě)指針相同時(shí),表示讀指針追上了寫(xiě)指針,且二者遍歷FIFO的次數(shù)相同,即FIFO已空,同樣也需要將空標(biāo)志信號(hào)同步到讀時(shí)鐘域內(nèi),其Verilog的描述在此不再贅述。
圖5所示為移位碼方式實(shí)現(xiàn)32×8的FIFO的仿真圖,該圖截取了FIFO從只寫(xiě)狀態(tài)到寫(xiě)滿(mǎn)的波形圖,從圖5中可以看出,當(dāng)寫(xiě)指針等于同步到寫(xiě)時(shí)鐘域內(nèi)的讀指針r2w_ptr_sync按位取反時(shí),寫(xiě)滿(mǎn)標(biāo)志位wrfull跳變?yōu)楦?且wrfull的輸出與寫(xiě)時(shí)鐘wrclk同步。圖6所示為FIFO從只讀狀態(tài)到讀空的波形圖。由波形分析可知,該FIFO很好地實(shí)現(xiàn)了FIFO先進(jìn)先出及產(chǎn)生空滿(mǎn)標(biāo)志的功能。

圖5 FIFO的寫(xiě)滿(mǎn)標(biāo)志仿真結(jié)果

圖6 FIFO的讀空標(biāo)志仿真結(jié)果
將本文設(shè)計(jì)的 32×8的 FIFO在 SMIC 0.18 μm CMOS工藝下進(jìn)行綜合,將綜合結(jié)果列于表3。作為對(duì)比,利用格雷碼編碼設(shè)計(jì)了一個(gè)同樣大小的FIFO,也將其綜合的結(jié)果列于表3。綜合時(shí)鐘是 500 MHz(周期為 2 ns)。由表3可以看出采用移位碼方式設(shè)計(jì)的FIFO在500 MHz的時(shí)鐘約束下,時(shí)序仍可以收斂,關(guān)鍵路徑中最差的保持時(shí)間余量(slack)仍為正,而采用格雷碼方式設(shè)計(jì)的FIFO的slack已經(jīng)為負(fù),同時(shí)移位碼方式設(shè)計(jì)的FIFO面積也比格雷碼方式小,動(dòng)態(tài)功耗也有一定程度的降低。

表3 32×8異步FIFO綜合結(jié)果對(duì)比
本文設(shè)計(jì)了一種采用移位碼編碼的FIFO,采用這種編碼方式,同時(shí)解決了亞穩(wěn)態(tài)和產(chǎn)生空滿(mǎn)標(biāo)志位的問(wèn)題,電路結(jié)構(gòu)更為簡(jiǎn)單,縮短了電路中的關(guān)鍵路徑,使得電路時(shí)序更加優(yōu)化,工作頻率明顯提升,電路面積和功耗也有一定的降低。該種FIFO已用于基于BPSK(移相鍵控)調(diào)制的超寬帶基帶芯片中,能穩(wěn)定工作在500 MHz的時(shí)鐘頻率下。
[1]汪東,馬劍武,陳書(shū)明.基于 Gray碼的異步 FIFO接口技術(shù)及其應(yīng)用[J].計(jì)算機(jī)工程與科學(xué),2005,27(1):58-60.
[2]周敏.高速異步 FIFO的設(shè)計(jì)和實(shí)現(xiàn)[J].計(jì)算機(jī)工程與科學(xué),2009,31(2):85-87.
[3]CUMMINGS C E,ALFKE P.Synthesis and synthesis techniques for asynchronous FIFO design with asynchronous pointer comparisons[Z].SNUG,2002.
[4]CUMMINGS C E.Synthesis and scripting techniques for designing multi-asynchronous clock design[Z].SNUG,2001.