宋建港,宋英雄,張俊杰
(上海大學(xué) 特種光纖與光接入網(wǎng)教育部重點實驗室,上海 200072)
現(xiàn)代數(shù)字系統(tǒng)設(shè)計中往往含有多個時鐘,即多時鐘域,這必然會造成數(shù)據(jù)之間的傳遞在多時鐘控制下完成,使用異步FIFO能有效地在兩個不同時鐘系統(tǒng)之間快速方便地傳輸實時數(shù)據(jù)。在信息處理、數(shù)據(jù)通信、圖像處理等方面,異步FIFO應(yīng)用廣泛。在10G-EPON系統(tǒng)中,存在大量高速數(shù)據(jù)與低速數(shù)據(jù)的傳輸,需要使用大量的異步FIFO,根據(jù)實際需要,若能掌握異步FIFO的數(shù)據(jù)余量(本文將FIFO中已經(jīng)存儲的數(shù)據(jù)個數(shù)定義為數(shù)據(jù)余量),就能實時告訴外界FIFO已經(jīng)寫入了多少數(shù)據(jù),外界就能依此判斷剩下的空間能否寫下下一幀數(shù)據(jù),可以更有效地提高FIFO的利用率。
要想設(shè)計異步FIFO數(shù)據(jù)余量的檢測方法,首先應(yīng)該了解異步FIFO設(shè)計中涉及到的亞穩(wěn)態(tài)問題。
在數(shù)字集成電路中,觸發(fā)器必須滿足建立時間(set?up time)和保持時間(hold time)的時序要求(其中建立時間是時鐘翻轉(zhuǎn)之前數(shù)據(jù)輸入必須有效的最小時間,有效時間是在時鐘沿之后數(shù)據(jù)輸入必須仍然有效的最小時間)。觸發(fā)器時序要求如圖1所示,如果信號和時鐘之間不滿足這個時序要求,會使寄存器工作在一個不確定的狀態(tài),并且在未知的時刻會隨機地固定到高電平或低電平,此時稱寄存器進(jìn)入亞穩(wěn)態(tài)(metastability)。亞穩(wěn)態(tài)會嚴(yán)重降低設(shè)計性能,破壞設(shè)計所能實現(xiàn)的功能。
異步FIFO中要對不同時鐘域信號進(jìn)行同步,必然會引起亞穩(wěn)態(tài),而且亞穩(wěn)態(tài)無法徹底消除,只能將其出現(xiàn)的概率降到最低[1]。為了解決亞穩(wěn)態(tài)問題,本文異步FIFO設(shè)計中采用格雷碼和兩級觸發(fā)器[2]。
在異步FIFO中,讀寫地址指針有多位,若采用二進(jìn)制計數(shù)進(jìn)行同步,有可能有多位同時變化,這將很容易出現(xiàn)亞穩(wěn)態(tài),得出不相關(guān)的同步信號。而格雷碼的相鄰碼之間只有一位發(fā)生改變,對其同步時,最多只有一個觸發(fā)器進(jìn)入亞穩(wěn)態(tài),穩(wěn)定后輸出的要么是當(dāng)前地址,要么是前一地址,可以有效地解決亞穩(wěn)態(tài)問題。
此外,雖然理論上亞穩(wěn)態(tài)無法完全消除,但是當(dāng)時鐘周期滿足公式Tclk≥20×Teq+Tsetup時(Tclk為同步器的時鐘周期,Teq和Tsetup分別為觸發(fā)器的輸出延時和建立時間)[3],第一級觸發(fā)器的輸出Q1經(jīng)過20×Teq的延時后仍不穩(wěn)定的概率p非常小,第二級觸發(fā)器的輸出Q2仍不穩(wěn)定的概率p2可忽略不計。兩級觸發(fā)器如圖2所示,如果使用兩級觸發(fā)器,在同步異步信號的同時還可有效防止亞穩(wěn)態(tài)的傳播,更進(jìn)一步保證了系統(tǒng)的可靠性。
在同步FIFO中,初始化時讀寫指針都指向FIFO起始位置,每進(jìn)行一次讀寫操作,相應(yīng)地指針就增加一次,指向下一個位置。設(shè)FIFO深度為2N,當(dāng)waddr=raddr時,F(xiàn)IFO為空,由于FIFO是一個環(huán)形結(jié)構(gòu),所以會出現(xiàn)寫地址大于、等于和小于讀地址3種情況。當(dāng)寫地址大于或等于讀地址時,F(xiàn)IFO內(nèi)數(shù)據(jù)余量為waddr-raddr;寫地址小于讀地址時,F(xiàn)IFO內(nèi)數(shù)據(jù)余量為2N-(raddr-waddr)[4]。但是對于異步FIFO來說,因為異步FIFO的讀寫時鐘是完全異步的,其數(shù)據(jù)余量不能直接采用這種方法計算。
基于此,本文提出一種異步FIFO數(shù)據(jù)余量的檢測方法,首先把讀地址同步到寫時鐘域,然后采用同步FIFO數(shù)據(jù)余量檢測方法來進(jìn)行檢測??紤]到異步FIFO同步過程中出現(xiàn)的亞穩(wěn)態(tài)問題,本文設(shè)計方法中,是先把讀地址轉(zhuǎn)化為格雷碼形式并經(jīng)過兩級觸發(fā)器同步到寫時鐘域中。另外,本文涉及方法中設(shè)定當(dāng)waddr=raddr時,F(xiàn)IFO為空,當(dāng)waddr_next=raddr時,F(xiàn)IFO為滿(數(shù)據(jù)余量最大值比FIFO深度小1),如圖3所示。所以寫時鐘域進(jìn)行讀寫地址比較時,比較的是waddr_next與同步過來的讀地址wclk_raddr。
為了檢測異步FIFO的數(shù)據(jù)余量,構(gòu)造一個計數(shù)器data_num,用來記錄異步FIFO的數(shù)據(jù)余量。數(shù)據(jù)余量的產(chǎn)生方法如下:讀地址raddr的格雷碼形式rgray_addr同步到寫時鐘域后,還原為二進(jìn)制自然碼形式wclk_raddr,與寫地址的下一個狀態(tài)waddr_next進(jìn)行比較,根據(jù)比較情況,使用相應(yīng)的公式得出數(shù)據(jù)余量data_num的值。因為會出現(xiàn)wclk_raddr大于、等于或小于waddr_next的情況,分兩種情況計算,當(dāng)wclk_raddr大于或等于waddr_next時,data_num≤2addr_length-(wclk_raddr-waddr),當(dāng)wclk_rad?dr小于waddr_next時,data_num≤waddr-wclk_raddr。
檢測方法如圖4所示,real_data_num表示實際的數(shù)據(jù)余量,用來與測試出的數(shù)據(jù)余量data_num進(jìn)行比較看其是否準(zhǔn)確。在某時刻waddr=d5H,同步到寫時鐘域的raddr信號wclk_raddr=3cH,根據(jù)文中檢測方法得出的數(shù)據(jù)余量data_num=99H,而FIFO的實際數(shù)據(jù)余量是98H,比測試出的值小,但這并不是錯誤。因為檢測data_num的目的是告訴外界FIFO中已經(jīng)寫入了多少數(shù)據(jù),還有多少空間沒有寫,防止空間不夠時數(shù)據(jù)幀往FIFO里寫,當(dāng)測得的數(shù)據(jù)余量偏大時,不影響達(dá)到此目的。本文設(shè)計方法得出的數(shù)據(jù)余量等于或者大于實際的數(shù)據(jù)余量,可以保證其有效性。
設(shè)計讀、寫地址指針長度為8,深度為28=256的異步FIFO,讀、寫指針初始位置都是00H。采用Verilog HDL硬件描述語言進(jìn)行電路設(shè)計,使用Modelsim SE 6.5進(jìn)行功能仿真,綜合速度為204.918 MHz。根據(jù)本文設(shè)計方法,考慮幾個邊界問題,主要包括讀、寫指針由ffH跳變到00H時,寫滿后繼續(xù)寫時,以及讀空后繼續(xù)讀時,經(jīng)過仿真驗證,本設(shè)計方法在涉及到的邊界條件下均能正常工作,且得出的數(shù)據(jù)余量均符合設(shè)計要求。下面是部分仿真結(jié)果。
圖5表示的當(dāng)wclk比rclk快的情況下,寫指針由ffH→00H時,測得的數(shù)據(jù)余量data_num由d2H→d3H,實際數(shù)據(jù)余量由d1H→d2H,符合設(shè)計要求。
圖6表示的是當(dāng)wclk比rclk慢的情況下,讀指針由ffH→00H時,測得的數(shù)據(jù)余量data_num是03H,實際數(shù)據(jù)余量由02H→01H,符合設(shè)計要求。
從仿真結(jié)果可以看出,根據(jù)本文設(shè)計方法得出的異步FIFO數(shù)據(jù)余量均等于或者大于實際的數(shù)據(jù)余量,可以達(dá)到設(shè)計目的,得到有效的數(shù)據(jù)余量。
本文提出了一種異步FIFO數(shù)據(jù)余量的檢測方法,并在Modelsim中進(jìn)行了仿真驗證,根據(jù)實驗研究表明,這種方法能夠?qū)崟r有效地檢測異步FIFO中數(shù)據(jù)余量,對提高FIFO的利用率具有顯著作用,具有一定的應(yīng)用價值和應(yīng)用前景。
[1]謝文華,高文華.FPGA異步FIFO設(shè)計中的問題與解決辦法[J].單片機與嵌入式系統(tǒng)應(yīng)用,2009(8):33-35.
[2]CUMMINGS C E.Synthesis and scrip ting techniques for designing multi-asynchronous clock designs[C]//Proc.SNUG2001.San Jose:[s.n.],2001.
[3]李媛,盧宏生.異步FIFO設(shè)計的實現(xiàn)與時序分析[J].高性能計算技術(shù),2007(7):35-39.
[4]張瑩,陽璞瓊.FIFO可靠性設(shè)計與研究[J].微處理機,2008(6):170-172.