水穎
(第七一五研究所,杭州,310023)
目前,在傳輸業(yè)界中,網(wǎng)關(guān)、加擾機、編碼機及調(diào)制解調(diào)設(shè)備等多采用千兆級以太網(wǎng)作為交互接口,要完成交互過程中大容量數(shù)據(jù)簡單方便的緩存,通常采用板載FIFO、SRAM、SDRAM或DDR顆粒芯片的方案。在一些對存儲資源要求不高但對存儲速度要求高的應(yīng)用中,大多使用FPGA內(nèi)部的存儲器資源。FIFO 是一種在電子系統(tǒng)得到廣泛應(yīng)用的模塊,通常用于數(shù)據(jù)的緩存和容納異步信號的頻率或相位的差異。FIFO 的實現(xiàn)通常是利用雙口RAM 和讀寫地址產(chǎn)生模塊來實現(xiàn)的。
本文根據(jù)互聯(lián)網(wǎng)幀的實際處理,提出了一種幀級 FIFO的設(shè)計,從而完成整幀數(shù)據(jù)處理的異步FIFO[1],設(shè)計的 FIFO處理模塊是針對每一幀而不是每一個數(shù)據(jù)。根據(jù)FPGA提供BRAM塊,搭建FIFO的讀寫以及數(shù)據(jù)使能,最關(guān)鍵的設(shè)計是控制讀寫地址、產(chǎn)生空滿信號以及校驗。此方式產(chǎn)生幀級的異步FIFO,既可以減少使用內(nèi)部FIFO帶來資源高的問題,又可以隔離異步時序減少亞穩(wěn)態(tài)的產(chǎn)生。
傳統(tǒng)的異步時序FIFO,當(dāng)寫入一個FIFO位寬的數(shù)據(jù),F(xiàn)IFO的空信號(empty)置0,則可以進行讀取數(shù)據(jù)。本文設(shè)計的基于幀級異步時序FIFO,當(dāng)一個正常數(shù)據(jù)包正在寫入時,F(xiàn)IFO的空信號并不會置0;只有當(dāng)正常數(shù)據(jù)包全部寫入異步FIFO中,空信號才能置 0,數(shù)據(jù)才能夠被讀取。此方式有利于互聯(lián)網(wǎng)幀級數(shù)據(jù)的緩存和處理。
幀級FIFO是將一個數(shù)據(jù)包作為一個最小單元進行存儲,包括以下幾種情況:(1)數(shù)據(jù)包為壞包,則通過控制寫RAM地址,刷新至上一包結(jié)束位置,將其從FIFO中刪除;(2)數(shù)據(jù)包長度大于RAM剩余空間,則進行丟包處理;(3)正常數(shù)據(jù)包則寫入RAM,更新寫指針。當(dāng)整個包寫入后RAM后,輸出不空標(biāo)志,使得FIFO數(shù)據(jù)可以被讀取。
本文異步時序FIFO使用雙端口RAM實現(xiàn)。FIFO 的接口信號包括異步的寫時鐘(wclk)和讀時鐘(rclk)、與寫時鐘同步的寫有效(wvld)和寫數(shù)據(jù)(wdata&wsof&weof)、與讀時鐘同步的讀有效(rvld)和讀數(shù)據(jù)(rdata&rsof&reof)。為了實現(xiàn)正確的讀寫,避免 FIFO 的上溢或下溢,通常還應(yīng)該給出與讀時鐘和寫時鐘同步的 FIFO 的空標(biāo)志(rframe)和滿標(biāo)志(wfull)以禁止讀寫操作。幀級FIFO的模塊接口圖見圖1。
圖1 異步FIFO的信號接口
本文根據(jù)互聯(lián)網(wǎng)幀級數(shù)據(jù)緩存原理,實現(xiàn)幀級FIFO的設(shè)計,由 6個模塊來完成:fifomem、wptr_full、rptr_empty,sync_r2w、sync_w2r 和rframe_in_fifo模塊。具體設(shè)計框圖如圖2所示。
fifomem 模塊主要功能是存儲數(shù)據(jù)。模塊調(diào)用了xilinx的BRAM塊作為存儲單元塊,根據(jù)產(chǎn)生讀寫地址進行數(shù)據(jù)存取。主要的存儲處理流程如圖3所示。
wptr_full 模塊主要功能是產(chǎn)生寫地址和寫滿的控制信號。每寫入一拍數(shù)據(jù)地址加 1,如此遞增產(chǎn)生寫地址。當(dāng)數(shù)據(jù)包為正常包,數(shù)據(jù)包length大于剩余空間,寫滿信號置 1;當(dāng)數(shù)據(jù)包為壞包,雖然數(shù)據(jù)包length大于剩余空間,寫滿信號仍然為0。rptr_empty 模塊主要功能是產(chǎn)生讀地址和讀空的控制信號。讀地址與寫地址產(chǎn)生方式相同,讀出去一拍數(shù)據(jù)則自增。讀寫指針一致產(chǎn)生讀空信號。sync_r2w和sync_w2r 模塊主要是負責(zé)兩個不同時鐘域的單比特信號處理??諠M信號的產(chǎn)生,需要跨時鐘域信號處理。單比特跨時鐘域信號處理使用寄存器打拍方式。rframe_in_fifo 模塊主要是通過狀態(tài)機的方式產(chǎn)生讀取 BRAM 的控制信息。本模塊主要根據(jù) rq2_wframe信號即整幀數(shù)據(jù)寫完成標(biāo)志和fifo_mem模塊讀出的數(shù)據(jù)狀態(tài),產(chǎn)生FIFO控制信息。主要狀態(tài)機處理見圖4。
圖2 幀級FIFO設(shè)計框圖
圖3 寫RAM的處理流程圖
圖4 讀RAM的狀態(tài)機圖
狀態(tài)機空閑時刻為IDLE狀態(tài)。當(dāng)rframe信號為1,說明FIFO不空,則開始讀取包頭SOF和數(shù)據(jù)FRAME部分,讀至EOF,即一個數(shù)據(jù)包結(jié)束,狀態(tài)機再次回到空閑狀態(tài)。循環(huán)讀取異步FIFO中數(shù)據(jù)包,完成幀級FIFO讀取功能。
硬件描述語言是一種應(yīng)用于電路設(shè)計的高層次描述語言,具有行為級、寄存器傳輸級和門級等多層次描述,并且具有簡單、易讀、易修改和與工藝無關(guān)等優(yōu)點。目前,Verilog 語言已經(jīng)得到多種EDA工具的支持,綜合工具得到迅速發(fā)展。Verilog語言的行為級綜合也已得到支持和實現(xiàn),因此利用Verilog 語言進行電路設(shè)計可以節(jié)約開發(fā)成本和周期。實現(xiàn)調(diào)用了xilinx的BRAM原語,這樣做的好處是可以適合所有不同xilinx器件進行調(diào)用。幀級FIFO rframe即為empty信號的產(chǎn)生代碼如下[2]:
幀級FIFO設(shè)計的關(guān)鍵在于控制讀寫地址和空滿信號。寫入地址根據(jù)正常包自加,而壞包進行刷新初值操作。當(dāng)寫入一個完整數(shù)據(jù)包時會產(chǎn)生不空信號,F(xiàn)IFO才允許讀取。另一個關(guān)鍵點是異步的處理,正常異步多比特信號處理使用 BRAM 和握手兩種方式,本文使用了 BRAM 的方式實現(xiàn)流水,減少異步時序帶來的亞穩(wěn)態(tài)。
異步 FIFO的整包仿真結(jié)果如圖 5(a),產(chǎn)生rframe信號的仿真結(jié)果如圖5(b)。wclk信號為寫數(shù)據(jù)時鐘,wvld信號為寫數(shù)據(jù)使能,wdata信號為寫數(shù)據(jù),wsof信號為寫幀級數(shù)據(jù)的起始標(biāo)志,weof信號為寫幀級數(shù)據(jù)的結(jié)束標(biāo)志。通過判斷 weof結(jié)束,如果不為 w_bad_frame(壞包),則 fifo不空,rframe信號置1。檢測到rframe信號為1,則開始讀取數(shù)據(jù)包,直至讀取EOF標(biāo)志,輸出整幀數(shù)據(jù)包。仿真測試結(jié)果與設(shè)計相符,完成幀級FIFO的功能需求。本方案已通過設(shè)備的傳輸采集系統(tǒng)應(yīng)用驗證,幀級異步FIFO基于采集板進行收發(fā)包測試時,測試結(jié)果通過Xilinx公司Chipscope Logic Analyzer抓包軟件。探測顯示結(jié)果如圖5(c)所示,實際抓包信號與仿真結(jié)果一致,符合預(yù)期。7×24 h拷機測試時性能也穩(wěn)定可靠。
圖5 異步FIFO的仿真結(jié)果與實測結(jié)果
本文提出了一種幀級異步 FIFO 的設(shè)計,并以Xilinx公司V5系列的一款FPGA為設(shè)計平臺,基于ISE 14.6 設(shè)計軟件和Modelsim 10.4仿真軟件,采用Verilog HDL高級可編程語言完成設(shè)計實現(xiàn)了信號采集傳輸系統(tǒng)。該電路實現(xiàn)了互聯(lián)網(wǎng)整幀數(shù)據(jù)的存取,軟件仿真和硬件實現(xiàn)已經(jīng)通過驗證,并已實際應(yīng)用。實踐證明它處理互聯(lián)網(wǎng)整幀數(shù)據(jù)可靠性高、穩(wěn)定性強。該設(shè)計可以直接應(yīng)用于互聯(lián)網(wǎng)數(shù)據(jù)的傳輸和處理,具有較強的工程實用價值。