李紅科,王慶春,余順園
(安康學(xué)院電子與信息工程學(xué)院,陜西安康 725000)
隨著集成電路的飛速發(fā)展,超大規(guī)模集成電路芯片中一個完整系統(tǒng)包含多個時鐘,不同時鐘域控制下,數(shù)據(jù)在傳輸或存儲之間會出現(xiàn)亞穩(wěn)態(tài)現(xiàn)象。異步FIFO(Frist Input Frist Output)是解決跨時鐘域數(shù)據(jù)傳輸和存儲所引發(fā)亞穩(wěn)態(tài)的有效方法之一。異步FIFO 在雷達(dá)、信號處理及多媒體技術(shù)等領(lǐng)域有著廣泛的應(yīng)用[1-3]。
FIFO是一種先進(jìn)先出的雙端口數(shù)據(jù)緩存器,和普通緩沖器區(qū)別在于FIFO沒有外部地址線,優(yōu)點是減少輸入信號控制線,缺點是數(shù)據(jù)只能順序?qū)懭?、順序讀出[4-5]。圖1給出了異步FIFO內(nèi)部結(jié)構(gòu)圖,包括雙端口RAM存儲器、寫控制器、讀控制器、寫地址指針同步到讀時鐘域(W2R 同步器)、讀地址指針同步到寫時鐘域(R2W同步器)、讀狀態(tài)標(biāo)志位和寫狀態(tài)標(biāo)志位等部分[6-8]。
圖1 異步FIFO內(nèi)部結(jié)構(gòu)圖
寫控制器模塊:在寫時鐘和寫使能信號作用下,產(chǎn)生寫地址指針。
讀控制器模塊:在讀時鐘和讀使能信號作用下,產(chǎn)生讀地址指針。
R2W 同步器模塊:讀計數(shù)器同步到寫時鐘域,同步后計數(shù)器和寫二進(jìn)制計數(shù)器比較用于產(chǎn)生滿標(biāo)志位(full)信號條件。
W2R 同步器模塊:寫計數(shù)器同步到讀時鐘域,同步后計數(shù)器和讀二進(jìn)制計數(shù)器比較用于產(chǎn)生空標(biāo)志位(empty)信號條件。
寫狀態(tài)標(biāo)志位模塊:寫時鐘控制下產(chǎn)生滿(full)信號。
讀狀態(tài)標(biāo)志位模塊:讀時鐘控制下產(chǎn)生空(empty)信號。
異步FIFO 外部引腳如表1 所示。
表1 異步FIFO外部引腳
異步FIFO 設(shè)計過程中存在兩個關(guān)鍵技術(shù)問題:1)亞穩(wěn)態(tài);2)空/滿狀態(tài)標(biāo)志位判斷及產(chǎn)生。在處理空/滿標(biāo)志位問題上,目前最常用的方案是增加一位讀寫指針附加位,當(dāng)讀寫指針最高位相同其余位也相同時,認(rèn)為讀空,當(dāng)讀寫指針最高位不相同其余位相同時,認(rèn)為寫滿。
文中以寬度為8 位、深度為16 位的異步FIF0 為例,介紹亞穩(wěn)態(tài)產(chǎn)生的原因以及降低亞穩(wěn)態(tài)出現(xiàn)概率的方法,分析利用格雷碼和同步轉(zhuǎn)換來產(chǎn)生空/滿標(biāo)志位的方法。
在所有數(shù)字器件中,寄存器都定義了一個信號時序要求,滿足時序要求的寄存器才能正確地在輸入端獲取數(shù)據(jù)、在輸出端產(chǎn)生數(shù)據(jù)[9]。為確保操作可靠,輸入數(shù)據(jù)在時鐘沿之前必須穩(wěn)定一段時間(建立時間),并且在時鐘沿之后保持一段時間(保持時間),觸發(fā)器經(jīng)過一個特定時鐘至輸出延時后有效。如果一個數(shù)據(jù)信號在變化之前不滿足觸發(fā)器建立和保持時間要求,觸發(fā)器輸出可能會進(jìn)入亞穩(wěn)態(tài)。亞穩(wěn)態(tài)觸發(fā)器輸出值會在高低電平之間徘徊不定,如圖2 所示。
圖2 亞穩(wěn)態(tài)的產(chǎn)生示意圖
雖然亞穩(wěn)態(tài)在異步電路中無法避免,但是兩級同步器和格雷碼計數(shù)器可以降低亞穩(wěn)態(tài)概率到可以接受的程度。
1)兩級同步器
圖3 中,clk1 和clk2 是異步時鐘,F(xiàn)F1和FF2組成兩級同步器[10-11],對不同時鐘域的輸入數(shù)據(jù)鎖存兩拍。一般情況下,兩級鎖存同步器是一級同步器出現(xiàn)亞穩(wěn)態(tài)概率的平方,在大部分同步設(shè)計中,兩級同步器可以大大降低亞穩(wěn)態(tài)出現(xiàn)概率[12]。
圖3 異步電路同步化處理
圖4 中,當(dāng)clk1 和clk2 上升沿很近時,data0 在變化時,此時clk2 上升沿采集到一個正在變化的數(shù)值,data1 是個不確定值,F(xiàn)F1觸發(fā)器輸出處于亞穩(wěn)態(tài),經(jīng)過1 個時鐘延時,data1 值趨于穩(wěn)定,F(xiàn)F2在clk2 上升沿對data1 穩(wěn)定值采樣,輸出data2 為確定值。雖然data1 在被clk2 上升沿采樣時也有處于亞穩(wěn)態(tài)的可能,但是這種概率很小,經(jīng)過兩級同步器能大大降低亞穩(wěn)態(tài)概率[13-15]。兩級同步器設(shè)計程序如下:
圖4 兩級同步器消除亞穩(wěn)態(tài)
2)格雷碼計數(shù)器
格雷碼是一種誤差最小化的可靠性編碼,可以極大地減少由一個狀態(tài)變化到下一個狀態(tài)時電路產(chǎn)生的誤差[11]。這種編碼方式是兩個相鄰碼之間只有一位變化,缺點是格雷碼是無權(quán)碼,不能直接用于計算、比較,需要轉(zhuǎn)換為二進(jìn)制代碼計算。
亞穩(wěn)態(tài)出現(xiàn)的原因是數(shù)據(jù)變化時建立和保持時間不夠,數(shù)據(jù)地址經(jīng)過二級同步器后,地址指針采用格雷碼編碼,地址指針一次只能變化一位,通過這種可以有效減少亞穩(wěn)態(tài)出現(xiàn)概率。
但是格雷碼指針不能直接比較產(chǎn)生空/滿標(biāo)志位,要產(chǎn)生空/滿標(biāo)志位,需要將格雷碼讀指針和寫指針轉(zhuǎn)換為相應(yīng)二進(jìn)制讀指針和寫指針進(jìn)行比較。
格雷碼轉(zhuǎn)二進(jìn)制碼方法是格雷碼最高位碼等于二進(jìn)制最高位碼Bn-1=Gn-1,二進(jìn)制次高位=二進(jìn)制最高位與格雷碼次高位異或,依次將n位格雷碼轉(zhuǎn)換為二進(jìn)制碼[11]。
為防止FIFO 誤操作,設(shè)置空/滿狀態(tài)標(biāo)志位,當(dāng)空狀態(tài)標(biāo)志位empty=1時,F(xiàn)IFO 不能再讀出數(shù)據(jù)。當(dāng)滿狀態(tài)標(biāo)志位full=1 時FIFO 不能再寫入數(shù)據(jù)。因為FIF0位寬為8位,至少需要3位二進(jìn)制數(shù)表示地址位。
讀空條件:寫指針(wr_pointer)=讀指針(rd_pointer),如圖5(a)所示。因為讀指針和寫指針變化是在不同時鐘下完成,不能直接比較,必須轉(zhuǎn)換到相同時鐘下進(jìn)行二進(jìn)制比較,將讀指針轉(zhuǎn)換為寫時鐘域,當(dāng)讀指針等于寫指針(w2r_bincnt==rd_bincnt)時,empty=1,F(xiàn)IFO 讀空。
寫滿條件:對寫滿操作分兩種情況討論:1)一次性寫滿,當(dāng)寫時鐘域下寫二進(jìn)制指針指向最后一個存儲單元時,讀時鐘域下的二進(jìn)制讀指針指向第一存儲單元時,(wr_pointer=15)&&(rd_pointer=0),full=1寫滿,如圖5(b)所示;2)經(jīng)過多次寫滿,一次只向FIFO寫一部分?jǐn)?shù)據(jù),多次FIFO寫滿。例如第一次寫入12個數(shù)據(jù),第一次讀出10 個數(shù)據(jù),第二次再寫入14 個數(shù)據(jù)時寫滿。當(dāng)寫時鐘域下寫指針指向第n個存儲單元,寫指針同步到讀時鐘域下的二進(jìn)制寫指針指向存在單元第n+1 個存儲單元(wr_pointer=n)&&(rd_pointer=n+1)時,full=1,F(xiàn)IFO寫滿,如圖5(c)所示。
圖5 異步FIFO空/滿狀態(tài)產(chǎn)生邏輯圖
整體設(shè)計包括:FIFO 存儲器設(shè)計模塊、寫計數(shù)器同步讀時鐘域模塊、讀計數(shù)器同步寫時鐘域模塊、空標(biāo)志產(chǎn)生模塊、滿標(biāo)志產(chǎn)生模塊和格雷碼計數(shù)器模塊[16-19]。
FIFO 雙端口RAM 模塊設(shè)計代碼如下:
寫計數(shù)器同步讀時鐘域模塊:用于產(chǎn)生空標(biāo)志信號條件。其中rc1k、rst_n 和w2r_bincnt 分別是寫時鐘復(fù)位和寫計數(shù)器轉(zhuǎn)換到讀時鐘二進(jìn)制計數(shù)器,設(shè)計代碼如下:
讀計數(shù)器同步寫時鐘域模塊:用于產(chǎn)生滿標(biāo)志信號條件。其中wc1k 和rzw-bincnt 分別是寫時鐘和讀計數(shù)器轉(zhuǎn)換到寫時鐘二進(jìn)制計數(shù)器,設(shè)計代碼如下:
空標(biāo)志產(chǎn)生模塊:在讀使能有效的情況下,讀二進(jìn)制計數(shù)器=寫格雷碼計數(shù)器同步并轉(zhuǎn)換到讀時鐘域的寫二進(jìn)制計數(shù)器,empty=1,empty 信號產(chǎn)生具體代碼如下:
滿標(biāo)志產(chǎn)生模塊:讀使能有效情況下,寫二進(jìn)制值計數(shù)器計數(shù)到最大值且同步到寫時鐘域讀計數(shù)器計數(shù)最小值,或經(jīng)同步后讀計數(shù)=寫計數(shù)器+1 時,full=1,full信號產(chǎn)生具體代碼如下:
針對異步FIFO 出現(xiàn)滿狀態(tài)的兩種情況進(jìn)行兩次仿真:1)第一種情況,F(xiàn)IFO 一次寫滿,在讀時鐘和讀使能控制下依次向FIFO 寫入十進(jìn)制5~20,16 個無符號數(shù),最后一個寫操作結(jié)束,full=1,F(xiàn)IFO 寫滿。在寫時鐘和寫使能控制下依次從FIFO 讀出5~20,16個無符號數(shù),最后一個讀操作結(jié)束,empty=1,F(xiàn)IFO 讀空,如圖6 所示;2)第二種情況,F(xiàn)IFO 多次寫滿,在讀時鐘和讀使能控制下依次向FIFO 寫入十進(jìn)制1~16,16個無符號數(shù),最后一個寫操作結(jié)束,full=1,F(xiàn)IFO 寫滿。在寫時鐘和寫使能控制下依次從FIFO 讀出1~10,10 個無符號數(shù),再次向FIFO 寫入0~9,10 個無符號數(shù),full=1,F(xiàn)IFO 寫滿,最后把FIFO11~16,0~9,16個數(shù)據(jù)依次讀出,empty=1,F(xiàn)IFO 讀空,如圖7 所示。
圖6 第一種寫滿情況
圖7 第二種寫滿情況
該文分析異步FIFO 內(nèi)部結(jié)構(gòu),在此基礎(chǔ)之上深入分析異步電路亞穩(wěn)態(tài)產(chǎn)生的原因,針對亞穩(wěn)態(tài)原因提出采用同步器和格雷碼計數(shù)器的方法,可以有效降低亞穩(wěn)態(tài)出現(xiàn)概率。針對傳統(tǒng)的空/滿標(biāo)志位產(chǎn)生方法,提出一種新的空/滿標(biāo)志位產(chǎn)生方法。使讀寫滿邏輯分兩種情況討論,分別對兩種情況進(jìn)行Modelsim 仿真驗證,從仿真圖上看,該設(shè)計正確,實現(xiàn)了預(yù)期目標(biāo)。