王曉嬌,張治中
(重慶郵電大學(xué)通信網(wǎng)與測試技術(shù)重點(diǎn)實(shí)驗(yàn)室,重慶 400065)
隨著網(wǎng)絡(luò)流量的日益龐大,鏈路帶寬的不斷提升,在高速數(shù)據(jù)采集系統(tǒng)中,對雙倍速率同步動(dòng)態(tài)隨機(jī)存儲器(Double Data Rate Synchronously Dynamic RAM,DDR SDRAM)[1]所提供的大容量緩沖技術(shù)也提出了挑戰(zhàn)。
現(xiàn)有技術(shù)中,DDR控制器對數(shù)據(jù)的封裝處理和讀寫控制方法難以很好地兼顧數(shù)據(jù)訪問的可靠性和有效性,且容錯(cuò)糾錯(cuò)能力較低、內(nèi)存管理復(fù)雜。本文研究并設(shè)計(jì)了一種改進(jìn)型高性能DDR控制器,保證了數(shù)據(jù)存儲取的正確性、高效性和連續(xù)性,有效提高DDR存儲器的管理效率和內(nèi)存利用率。適用于多光口/電口的千兆線速數(shù)據(jù)采集系統(tǒng),提供高速大容量的緩沖能力,在網(wǎng)絡(luò)流量峰值時(shí),能夠?qū)崿F(xiàn)動(dòng)態(tài)均衡,平滑處理,可顯著提高數(shù)據(jù)采集密度與速率。
基于FPGA實(shí)現(xiàn)的DDR控制器通常主要包括前端主控模塊和后端用戶模塊。以目前主流的Virtex-5 FPGA器件參考設(shè)計(jì)結(jié)構(gòu)為例,如圖1所示。
前端主控模塊由PHY控制器、主控制器和前端FIFO組成。PHY控制器完成DDR存儲器初始化狀態(tài)和讀數(shù)據(jù)采集時(shí)序校準(zhǔn)邏輯功能,主控制器實(shí)現(xiàn)DDR控制器狀態(tài)機(jī)和用于地址/命令/數(shù)據(jù)的FIFO邏輯,前端FIFO作為一種用戶接口,提供地址/命令、寫數(shù)據(jù)和讀數(shù)據(jù)3個(gè)FIFO。前2個(gè)FIFO由不同的用戶后端邏輯加載,而讀數(shù)據(jù)FIFO則由PHY控制器訪問,以將采集的數(shù)據(jù)存儲在每個(gè)讀周期上。通過用戶接口,可以發(fā)出命令,向DDR存儲器提供寫數(shù)據(jù)或者讀數(shù)據(jù)操作[1-3]。因此,在前端主控模塊的設(shè)計(jì)結(jié)構(gòu)相對固定的情況下,后端用戶模塊以及與前端模塊對接方式的良好設(shè)計(jì),對提升DDR控制器的整體性能具有重要作用。
圖1 DDR SDRAM存儲器控制器的參考設(shè)計(jì)結(jié)構(gòu)
針對現(xiàn)有的DDR控制器對外部DDR 存儲器數(shù)據(jù)讀寫訪問所存在的不足,提出一種基于FPGA實(shí)現(xiàn)的模塊化設(shè)計(jì),采用多數(shù)據(jù)包重組和轉(zhuǎn)義思想,以及讀寫控制方法,其模塊設(shè)計(jì)框圖如圖2所示。DDR控制器主要包括:多凈荷包組裝模塊、寫轉(zhuǎn)義模塊、讀反向轉(zhuǎn)義模塊、多凈荷包解封裝模塊、讀寫控制邏輯以及存儲器接口邏輯。
圖2 DDR控制器模塊設(shè)計(jì)框圖
其中,多凈荷包組裝模塊將把從前一級處理模塊送入的多個(gè)凈荷數(shù)據(jù)包拼接為一個(gè)較大的數(shù)據(jù)包;寫轉(zhuǎn)義模塊完成對預(yù)寫入DDR存儲器數(shù)據(jù)的轉(zhuǎn)義處理;讀反向轉(zhuǎn)義模塊則實(shí)現(xiàn)對從DDR存儲器讀出的數(shù)據(jù)流進(jìn)行反向轉(zhuǎn)義,解析出正確的原始組裝凈荷包;多凈荷包解封裝模塊將提取出原始單個(gè)凈荷包;讀寫控制邏輯模塊負(fù)責(zé)對DDR存儲器的讀寫訪問進(jìn)行控制;存儲器接口邏輯模塊主要實(shí)現(xiàn)圖1中的前端主控功能,完成對外部DDR存儲器的讀寫訪問,并為應(yīng)用提供命令、讀、寫接口。
DDR控制器存儲和讀取數(shù)據(jù)的基本流程如圖3所示。首先,對多個(gè)凈荷包進(jìn)行組裝并進(jìn)行寫轉(zhuǎn)義處理;然后,在處于寫操作時(shí)鐘周期時(shí),將寫轉(zhuǎn)義處理后的數(shù)據(jù)寫入到DDR存儲器中。當(dāng)?shù)竭_(dá)讀操作時(shí)鐘周期時(shí),從DDR存儲器中讀取數(shù)據(jù),并對讀出的數(shù)據(jù)流進(jìn)行讀反向轉(zhuǎn)義和解封裝,恢復(fù)出原始單個(gè)凈荷包。
圖3 DDR控制器存儲和讀取數(shù)據(jù)基本流程示意圖
向DDR存儲器寫入數(shù)據(jù)前,對數(shù)據(jù)進(jìn)行兩級預(yù)處理。多凈荷包組裝是第一級數(shù)據(jù)預(yù)處理,該方法旨在有效減少短包對CPU的中斷次數(shù),降低資源開銷,提高DDR控制器的處理效率。多凈荷包組裝模塊封裝的數(shù)據(jù)包格式如圖4所示。
圖4 多凈荷包組裝模塊封裝的數(shù)據(jù)包結(jié)構(gòu)示意圖
多凈荷包組裝過程:首先,將一個(gè)或一個(gè)以上原始數(shù)據(jù)凈荷包分別增加一個(gè)標(biāo)識有該包長度信息的數(shù)據(jù)包包頭后級聯(lián)在一起,并在第一個(gè)數(shù)據(jù)包包頭前標(biāo)識級聯(lián)在一起的數(shù)據(jù)包的個(gè)數(shù);然后,將級聯(lián)在一起的數(shù)據(jù)包組裝為一個(gè)復(fù)合數(shù)據(jù)包;在組裝的同時(shí),在復(fù)合數(shù)據(jù)包的頭部加上64 bit特定的數(shù)據(jù)包起始標(biāo)識符(Start of Frame,SOF),在數(shù)據(jù)包的尾部加上64 bit特定的數(shù)據(jù)包結(jié)束標(biāo)識符(End of Frame,EOF)。其中,SOF和EOF可以在解析讀出的數(shù)據(jù)流時(shí),定位有效數(shù)據(jù)的起始位置與結(jié)束位置。
寫轉(zhuǎn)義是第二級數(shù)據(jù)預(yù)處理,可避免在組裝后的原始數(shù)據(jù)包中出現(xiàn)與SOF、EOF以及轉(zhuǎn)義標(biāo)識符相同的有效數(shù)據(jù),從而影響數(shù)據(jù)的正確解析。寫轉(zhuǎn)義變換的規(guī)則是對相應(yīng)的64 bit原始數(shù)據(jù)的最高位進(jìn)行反碼轉(zhuǎn)換,并在其起始位置加上64 bit特定的轉(zhuǎn)義標(biāo)識符。寫轉(zhuǎn)義變換的實(shí)現(xiàn)流程如圖5所示,其對應(yīng)的寫轉(zhuǎn)義各狀態(tài)含義見表1(TM是Transferred Meaning的英文縮寫,表示轉(zhuǎn)義)。
圖5 寫轉(zhuǎn)義狀態(tài)機(jī)
表1 寫轉(zhuǎn)義狀態(tài)機(jī)各狀態(tài)說明
讀反向轉(zhuǎn)義是寫轉(zhuǎn)義的逆過程,解析從DDR緩存所讀取的數(shù)據(jù)流。讀反向轉(zhuǎn)義變換的規(guī)則是:從有SOF、EOF和轉(zhuǎn)義標(biāo)識符的數(shù)據(jù)流中讀出并過濾掉SOF、EOF和轉(zhuǎn)義標(biāo)識符,同時(shí)將轉(zhuǎn)義標(biāo)識符后的64 bit數(shù)據(jù)的最高位進(jìn)行反碼轉(zhuǎn)換,以恢復(fù)出原始數(shù)據(jù)。讀反向轉(zhuǎn)義的實(shí)現(xiàn)流程如圖6所示,其對應(yīng)的轉(zhuǎn)義各狀態(tài)含義見表2(RTM是Reverse Transferred Meaning的英文縮寫)。
圖6 讀反向轉(zhuǎn)義狀態(tài)機(jī)
表2 讀反向轉(zhuǎn)義狀態(tài)機(jī)各狀態(tài)說明
本方案中對DDR的讀寫控制主要有兩個(gè)關(guān)鍵點(diǎn),一個(gè)是64 bit和256 bit數(shù)據(jù)轉(zhuǎn)換,另一個(gè)是讀寫均衡控制。前者的目的在于更有效地利用接口寬度和轉(zhuǎn)義數(shù)據(jù)的讀寫粒度,存儲、讀取和解析數(shù)據(jù)。后者則以平均、輪流占用時(shí)間片的方式實(shí)現(xiàn)讀、寫操作所占用時(shí)間的均勻分配。
在讀寫控制邏輯模塊定義3個(gè)256 bit位寬的存儲管理寄存器,分別用于寫地址計(jì)數(shù)、讀地址計(jì)數(shù)和存儲數(shù)量計(jì)數(shù)。3個(gè)寄存器的協(xié)同工作運(yùn)轉(zhuǎn)過程如圖7所示。
圖7 存儲管理寄存器協(xié)同工作運(yùn)轉(zhuǎn)過程示意圖
寫地址寄存器存放寫入數(shù)據(jù)的地址。在寫入1個(gè)256 bit的數(shù)據(jù)后,寄存器值加1,當(dāng)達(dá)到1 Gbit容量的DDR存儲器上限值時(shí),寄存器值回到0。
讀地址寄存器存放讀取數(shù)據(jù)的地址。讀地址寄存器在讀出1個(gè)256 bit的數(shù)據(jù)后加1,當(dāng)達(dá)到1 Gbit容量的DDR存儲器上限值時(shí),寄存器值回到0。
存儲數(shù)量寄存器存放DDR存儲器中當(dāng)前存儲的數(shù)據(jù)個(gè)數(shù)。在寫入1個(gè)256 bit數(shù)據(jù)后加1,在讀出1個(gè)256 bit數(shù)據(jù)后減1。當(dāng)存儲數(shù)量寄存器等于DDR存儲器的容量大小時(shí),表示存儲器已滿;當(dāng)存儲數(shù)量寄存器等于0時(shí),表示DDR存儲器為空。
為了將寫轉(zhuǎn)義和讀反向轉(zhuǎn)義時(shí),數(shù)據(jù)按64 bit粒度進(jìn)行變換和解析,為達(dá)到存儲器提供的256 bit讀寫接口的數(shù)據(jù)總線要求,在寫轉(zhuǎn)義后,對輸出數(shù)據(jù)進(jìn)行64 bit—256 bit的轉(zhuǎn)換。而在讀反向轉(zhuǎn)義前,首先通過256 bit—64 bit FIFO將輸入256 bit寬度的數(shù)據(jù)轉(zhuǎn)換為64 bit位寬,為下一步反向轉(zhuǎn)義做好數(shù)據(jù)準(zhǔn)備。
為實(shí)現(xiàn)對DDR總線的分時(shí)復(fù)用[4-5],在讀寫控制模塊中定義一個(gè)讀寫計(jì)數(shù)器,完成讀寫均衡控制中的計(jì)數(shù)功能。在連續(xù)寫入固定量數(shù)據(jù)后,切換到讀狀態(tài);在連續(xù)讀出固定量數(shù)據(jù)后,又切換回寫入狀態(tài),如此反復(fù),可使讀寫吞吐量基本一致且足夠大。
經(jīng)仿真測試和計(jì)算單位時(shí)間內(nèi)讀寫的數(shù)據(jù)個(gè)數(shù),如果每次讀寫數(shù)據(jù)為4 kbyte,讀、寫操作的總速率可達(dá)到18 Gbit/s,每個(gè)單向具有9 Gbit/s的速率。寫入數(shù)據(jù)時(shí),如果連續(xù)寫入數(shù)量未達(dá)到4 kbyte,卻出現(xiàn)沒有數(shù)據(jù)輸入或DDR存儲器已滿時(shí),將主動(dòng)切換到讀數(shù)據(jù)狀態(tài)。在讀數(shù)據(jù)時(shí),在連續(xù)讀出數(shù)量未達(dá)到4 kbyte,卻出現(xiàn)DDR存儲器已空時(shí),將切換到寫數(shù)據(jù)狀態(tài)。
為了驗(yàn)證方案中轉(zhuǎn)義處理的可靠性和有效性,圖8給出了寫轉(zhuǎn)義和讀反向轉(zhuǎn)義的FPGA仿真圖。圖8a中B_TM是寫轉(zhuǎn)義前的數(shù)據(jù),A_TM是寫轉(zhuǎn)義后的數(shù)據(jù),設(shè)置SOF標(biāo)識為64 bit特定數(shù)據(jù)0x7e1234567e123456,EOF標(biāo)識為64 bit特定數(shù)據(jù)0x7e12345d7e12345d,轉(zhuǎn)義標(biāo)識符為64 bit特定數(shù)據(jù)0x7e12345f7e12345f。從圖中,可以看出寫轉(zhuǎn)義前的數(shù)據(jù)為0x7e1234567e123456,0x7e12345f7e12345f,0x300000004,……,其中,SOF標(biāo)識后的第1個(gè)64 bit有效數(shù)據(jù)與轉(zhuǎn)義標(biāo)識符相同,于是對其進(jìn)行轉(zhuǎn)義變換為0x7e12345f7e12345f,0xfe12345f7e12345f,如圖 8b 所示,B_ITM是從DDR存儲器讀出數(shù)據(jù)后,讀反向轉(zhuǎn)義前的數(shù)據(jù)。圖8c中的A_ITM是讀反轉(zhuǎn)義后的數(shù)據(jù),與原始數(shù)據(jù)一致。采用轉(zhuǎn)義的方法后,讀數(shù)據(jù)時(shí)的時(shí)延問題(發(fā)送讀命令后,期望的數(shù)據(jù)要在幾十個(gè)時(shí)鐘周期后出現(xiàn)在讀數(shù)據(jù)總線上)可以得到有效解決。
圖8 DDR控制器寫轉(zhuǎn)義與讀反向轉(zhuǎn)義仿真圖(截圖)
本文提出一種基于FPGA實(shí)現(xiàn)的DDR控制器設(shè)計(jì)方案,采用了多凈荷包組裝,轉(zhuǎn)義與反向轉(zhuǎn)義方法以及讀寫控制的流量均衡算法設(shè)計(jì),改進(jìn)了數(shù)據(jù)封裝與解析方式以及讀寫控制方法。該DDR控制器統(tǒng)籌兼顧了數(shù)據(jù)讀寫的可靠性和有效性,有效提高了DDR存儲器的管理效率和內(nèi)存利用率。經(jīng)實(shí)際應(yīng)用測試,該DDR控制器在千兆線速數(shù)據(jù)采集卡中已得到有效運(yùn)用,保證了高速大容量的數(shù)據(jù)緩沖功能,具有廣泛適用性和較高的應(yīng)用價(jià)值。
[1]DOUBLE DATA RATE(DDR)SDRAM Specification[EB/OL].[2012-06-10].http://download.csdn.net/detail/macrojiali/3069228.
[2]使用Virtex-5 FPGA器件實(shí)現(xiàn)DDR SDRAM控制器[EB/OL].[2012-06-10].http://www.docin.com/p -9751883.html.
[3]門亮,王立欣.基于FPGA的DDR SDRAM控制器在高速數(shù)據(jù)采集系統(tǒng)中的應(yīng)用[J].電子產(chǎn)品世界,2007(C00):99-103.
[4]姚瑋,趙海慶,陳金樹.基于Stratix器件的高速DDR緩存系統(tǒng)優(yōu)化設(shè)計(jì)[J].電視技術(shù),2005,29(S1):69-72.
[5]ZHOU Zude,CHENG Songlin,LIU Quan.Application of DDR Controller for High-speed Data Acquisition Board[C]//Proc.Innovative Computing Information and Control,ICICIC '06.Beijing,China:[s.n.],2006:611-614.