摘要:PCIe總線是第三代I/O總線的代表,提供高性能、高速、點(diǎn)到點(diǎn)的串行連接,支持單雙工傳輸,通過差分鏈路來互連設(shè)備。該設(shè)計(jì)由Xilinx公司的Virtex6 FPGA平臺(tái)和PC機(jī)組成,為了實(shí)現(xiàn)PFGA與CPU之間的高速通信,開發(fā)了基于FPGA IPcore 的PCIe總線 DMA數(shù)據(jù)傳輸平臺(tái)。通過硬件測(cè)試表明,該接口設(shè)計(jì)方案成本低,傳輸速率可以達(dá)到 15 Gb/s。
關(guān)鍵詞:PCI-Express總線;FPGA;DMA
0引言
隨著電子行業(yè)的飛速發(fā)展,人們對(duì)數(shù)據(jù)處理能力和存儲(chǔ)速率的要求越來越高,并行數(shù)據(jù)傳輸?shù)腜CI總線技術(shù)逐漸成為系統(tǒng)整體性能提升的瓶頸[1]。尤其在接收機(jī)的設(shè)計(jì)中,總線架構(gòu)關(guān)系到系統(tǒng)的整體性能。串行點(diǎn)對(duì)點(diǎn)的PCIe總線克服了PCI總線在系統(tǒng)帶寬、傳輸速度等方面固有的缺陷,有效地提高了系統(tǒng)的整體性能。目前實(shí)現(xiàn)PCIe總線功能有兩種方法:采用FPGA實(shí)現(xiàn)PCIe的功能[2];使用PCIe橋接芯片。由于通過FPGA實(shí)現(xiàn)PCIe接口要比使用PCIe橋接芯片更加靈活,成本更低,可靠性更好,所以采用前者完成FPGA與PC機(jī)之間的信息的交互。
1PCIe總線的簡(jiǎn)介
PCI Express 體系結(jié)構(gòu)采用分層結(jié)構(gòu),共分為四層:物理層(Physical Layer)、數(shù)據(jù)鏈路層(Link Layer)、處理層(Transaction Layer)和軟件層(Software Layer),這樣利于跨平臺(tái)的應(yīng)用。軟件層發(fā)出的讀、寫請(qǐng)求,使用基于數(shù)據(jù)包、分段傳輸?shù)膮f(xié)議,通過處理層,傳輸至鏈路層。在鏈路層,數(shù)據(jù)包可以添加序列號(hào)和循環(huán)冗余校驗(yàn)(CRC),從而創(chuàng)建一個(gè)更高度可靠的數(shù)據(jù)傳輸機(jī)制。基本的物理鏈路層包括兩個(gè)單一通道,即兩個(gè)低電壓的AC耦合差分信號(hào)對(duì)(一個(gè)傳輸對(duì)和一個(gè)接收對(duì))。通過增加信號(hào)對(duì)形成多信道,可以組成x1,x2,x4,x8,x16以及x32的鏈路模式,串行數(shù)據(jù)傳輸采用工業(yè)標(biāo)準(zhǔn)的8b/10b編碼實(shí)現(xiàn)數(shù)據(jù)恢復(fù)[3]。
本文基于非協(xié)作接收機(jī)的驗(yàn)證平臺(tái)進(jìn)行研究,系統(tǒng)整體框圖如圖1所示。
2PCIe接口及應(yīng)用層設(shè)計(jì)
本設(shè)計(jì)采用Xilinx公司Virtex-6系列的FPGA,芯片為xc6vlx240t,集成了PCIe的IP核,該P(yáng)CIe遵循V2.0的規(guī)范。首先使用Core Generation 生成PCIe的硬核模塊,生成的PCIe子模塊的鏈路寬度支持x1,x2,x4,x8四種模式。生成核的過程中主要需要配置的參數(shù)有:參考時(shí)鐘、鏈路寬度、設(shè)備ID、基址寄存器、TLP的大小、對(duì)應(yīng)的Xilinx的開發(fā)板等[4]。該核完全符合PCI Express的分層結(jié)構(gòu)[5],提供了系統(tǒng)接口(SYS)、外部傳輸接口(PCI EXP)、配置接口(CFG)、事務(wù)接口(TRN)和物理接口(PL)。PCI Express的頂端功能模塊與接口如圖2。
用戶邏輯接口:該接口為用戶設(shè)計(jì)提供一個(gè)產(chǎn)生和消耗TLPs的機(jī)制;
物理層接口:該接口允許用戶設(shè)計(jì)去查看鏈路狀態(tài)和對(duì)方鏈路的控制及狀態(tài);
配置接口:主機(jī)通過該接口對(duì)IP核進(jìn)行配置或讀取狀態(tài);
系統(tǒng)接口:這里只包括時(shí)鐘和復(fù)位;
PCIe接口邏輯:由若干對(duì)差分信號(hào)線組成,分為接收和發(fā)送信號(hào)線。
3DMA控制器的設(shè)計(jì)與實(shí)現(xiàn)
設(shè)計(jì)中為提高CPU的運(yùn)行效率,在系統(tǒng)中引入了DMA控制器,該控制器是在PCIe IP核的基礎(chǔ)上實(shí)現(xiàn)的,數(shù)據(jù)的傳輸不占用CPU的時(shí)間,提高了系統(tǒng)的運(yùn)行效率。
本節(jié)主要介紹DMA中的TLP數(shù)據(jù)包結(jié)構(gòu)、DMA相關(guān)寄存器的設(shè)計(jì)和PCIe接口的DMA讀寫操作核心狀態(tài)機(jī)的設(shè)計(jì)。
3.1TLP數(shù)據(jù)包結(jié)構(gòu)
PCIe總線以數(shù)據(jù)包形式傳送信息,本設(shè)計(jì)主要關(guān)注事務(wù)層數(shù)據(jù)包TLP。一個(gè)完整的TLP如圖3所示,其中只有TLP頭和數(shù)據(jù)有效負(fù)載需要由用戶使用FPGA程序?qū)崿F(xiàn),其他都由PCIe核自動(dòng)生成并加到幀結(jié)構(gòu)中[6]。
TLP頭是TLP中最重要的部分,主要包含當(dāng)前TLP的總線事務(wù)類型、路由信息等。一個(gè)TLP中的數(shù)據(jù)有效負(fù)載的長(zhǎng)度是可變的,本設(shè)計(jì)中選用的最大負(fù)載長(zhǎng)度為512 B。PCIe 核支持32 bit和64 bit地址空間的操作,其中32 bit地址空間讀寫操作的TLP頭格式如圖4。請(qǐng)求者根據(jù)自己的需要填寫TLP頭中的信息,并將數(shù)據(jù)放在TLP頭的后面發(fā)送給接收者,接收者解析出正確的數(shù)據(jù)放入到自己的地址空間中。
DMA寫操作使用的TLP格式與存儲(chǔ)器寫操作TLP格式相同,DMA讀操作需要使用存儲(chǔ)器讀請(qǐng)求與存儲(chǔ)器讀完成兩種TLP格式。當(dāng)接收到存儲(chǔ)器讀請(qǐng)求時(shí),設(shè)備需要發(fā)送CPLD(帶數(shù)據(jù)的完成報(bào)文)。帶數(shù)據(jù)的完成報(bào)文與讀寫請(qǐng)求報(bào)文不同。
32DMA操作寄存器的定義
PCIe IP核提供6個(gè)32 bit基地址寄存器BAR0~BAR5,也可以作為3個(gè)64 bit基地址寄存器,可以根據(jù)實(shí)際需要進(jìn)行配置。設(shè)計(jì)中使用BAR0存儲(chǔ)各種寄存器地址,使用BAR1作為內(nèi)存操作基地址空間。在BAR0中各寄存器地址定義如下:
?。?)偏移地址0x00(DCR2)是控制DMA開始的寄存器,當(dāng)寫入0x01時(shí),DMA操作開始,上位機(jī)開始接收數(shù)據(jù)。
?。?)偏移地址0x04是中斷服務(wù)寄存器。當(dāng)DMA數(shù)據(jù)包傳輸完畢時(shí),寫0x01到該寄存器,產(chǎn)生一個(gè)中斷,上位機(jī)會(huì)進(jìn)入中斷服務(wù)進(jìn)程。
?。?)偏移地址0x08是DMA傳輸?shù)哪康牡刂?。該目的地址是PC機(jī)端的內(nèi)存首地址。DMA傳輸開始之前,將該地址寫到該偏移地址。當(dāng)DMA操作時(shí),將FPGA板卡上的數(shù)據(jù)傳到PC機(jī)端該地址處。
?。?)偏移地址0x0C是DMA傳輸?shù)臄?shù)據(jù)長(zhǎng)度。設(shè)計(jì)中定義了每個(gè)包的數(shù)據(jù)長(zhǎng)度是512 B,由該值可得到需要傳輸?shù)臄?shù)據(jù)包個(gè)數(shù),用于控制DMA操作的結(jié)束時(shí)刻。
33DMA控制器
在整個(gè)設(shè)計(jì)中,DMA控制狀態(tài)機(jī)是核心部分,主要包括Tx Engine和Rx Engine。Tx Engine負(fù)責(zé)接收上位機(jī)存儲(chǔ)器讀寫操作、單字發(fā)送及DMA發(fā)送。Rx Engine主要負(fù)責(zé)存儲(chǔ)器讀寫操作、單字接收及DMA接收。實(shí)現(xiàn)PCIe的DMA讀寫操作的主要方法是正確填寫TLP包頭中的各個(gè)字段,并將數(shù)據(jù)按照64 bit并行放在TLP包頭中。對(duì)于DMA寫,將數(shù)據(jù)傳輸給PCIe硬核,由硬核將數(shù)據(jù)發(fā)送到物理端口,最后傳輸?shù)絇C機(jī)的物理地址中;對(duì)于DMA讀,主機(jī)將數(shù)據(jù)包發(fā)送到硬核,最后Rx Engine解包,將數(shù)據(jù)輸出。
Tx Engine和Rx Engine是使用狀態(tài)機(jī)來設(shè)計(jì)的,Rx Engine狀態(tài)轉(zhuǎn)移圖如圖5所示?!?/p>
Rx Engine開始時(shí)處于Rx_RST狀態(tài),當(dāng)Rx Engine收到數(shù)據(jù)包時(shí),首先解析數(shù)據(jù)包,根據(jù)TLP包頭分辨數(shù)據(jù)包類型,進(jìn)入不同的狀態(tài)。當(dāng)接收到的是存儲(chǔ)器讀時(shí),進(jìn)入Rx_MEM_RD_QW1狀態(tài),發(fā)送信號(hào)通知Tx Engine,由Tx Engine發(fā)送CPLD數(shù)據(jù)包;當(dāng)接收到的是存儲(chǔ)器寫時(shí),進(jìn)入Rx_MEM_WR_QW1,處理收到的TLP數(shù)據(jù)并更新配制寄存器;當(dāng)收到的是CPLD時(shí),進(jìn)入Rx_CPLD_QW1狀態(tài),解析數(shù)據(jù)包,將數(shù)據(jù)存儲(chǔ)到相應(yīng)的存儲(chǔ)器中;若信號(hào)trn_reof_n(傳輸結(jié)束信號(hào),低電平有效)低電平?jīng)]有到來,則Rx Engine從Rx_CPLD_QW1進(jìn)入到Rx_CPLD_QWN狀態(tài),根據(jù)寄存器中存有的DMA數(shù)據(jù)長(zhǎng)度來判斷數(shù)據(jù)是否已經(jīng)接收完成,若沒有完成則不斷在該狀態(tài)循環(huán),直到數(shù)據(jù)接收完畢,狀態(tài)機(jī)回到復(fù)位狀態(tài)。
Tx Engine狀態(tài)轉(zhuǎn)換圖如圖6所示。
Tx Engine狀態(tài)機(jī)同Rx Engine基本一樣,這里不再贅述?!?/p>
DMA傳輸開始之前需要對(duì)DMA的相關(guān)寄存器進(jìn)行配置,表1是寫DMA的操作步驟,寫DMA控制和狀態(tài)寄存器中定義了TLPs的地址、大小、個(gè)數(shù)、負(fù)載內(nèi)容。
其中DCR1和DCR2是設(shè)備控制寄存器,控制選擇FPGA型號(hào)、接口數(shù)據(jù)帶寬、讀/寫DMA開始/結(jié)束以及中斷服務(wù)的開啟。WDMATLPA是寫DMA的TLP低32位地址表1寫DMA操作步驟步驟操作寄存器操作值1發(fā)起初始化復(fù)位寫DCR10x000000012取消初始化復(fù)位寫DCR10x000000003寫DMA的PC端口地址寫WDMATLPAPC端地址4寫DMA TLP大小寫WDMATLPS事務(wù)包大小5寫DMA TLP個(gè)數(shù)寫WDMATLPC事務(wù)包個(gè)數(shù)6TLP數(shù)據(jù)包中payload值寫WDMATLPP數(shù)據(jù)值7寫DMA開始寫DCR20x000000018等待中斷TLP9寫DMA執(zhí)行結(jié)果讀WDMAPERF
寄存器,WDMATLPS是寫DMA事務(wù)包的大小、事務(wù)包TC字段。WDMATLPC是寫數(shù)據(jù)包個(gè)數(shù)寄存器。WDMATLPP是寫數(shù)據(jù)包類型及32位有效負(fù)載寄存器。WDMAPERF是寫DMA執(zhí)行寄存器,表示完成DMA傳輸所用到的接口時(shí)鐘周期數(shù)。
讀DMA與上述過程一致,只是在DMA中的傳輸方向的寄存器值不同。
4仿真及測(cè)試結(jié)果
完成FPGA的程序編程后,用Modlesim對(duì)程序進(jìn)行仿真。硬件測(cè)試時(shí),使用ChipScope抓取數(shù)據(jù),主要分析DMA控制器產(chǎn)生的PCIe總線傳輸信號(hào)時(shí)序是否滿足要求。同時(shí),通過軟件測(cè)試了DMA傳輸速率。
圖7是DMA寫過程的仿真圖,功能是由FPGA板卡將數(shù)據(jù)上傳至PC機(jī),圖8是讀過程的仿真圖,功能是由PC機(jī)到FPGA板卡的數(shù)據(jù)傳輸。由測(cè)試數(shù)據(jù)可以估算出PCIe Gen1x8寫操作速度可以達(dá)到15 GB/s。
由圖7可以看到數(shù)據(jù)包傳輸開始于trn_tsof_n低電平之后,結(jié)束于trn_teof_n。數(shù)據(jù)傳輸期間trn_tsrc_rdy_n和trn_rdst_rdy_n必須有效。
由圖8可以看到數(shù)據(jù)包傳輸開始于trn_rsof_n低電平之后,結(jié)束于trn_reof_n。數(shù)據(jù)傳輸期間trn_rsrc_rdy_n和trn_tdst_rdy_n必須有效。從圖中可以看到,若DMA傳輸沒有結(jié)束,在該數(shù)據(jù)包結(jié)束之后,會(huì)有新的數(shù)據(jù)包出現(xiàn)在鏈路上。
由仿真圖可知該設(shè)計(jì)能完成DMA讀寫功能并保證數(shù)據(jù)的正確傳輸。
實(shí)驗(yàn)結(jié)果可得,DMA寫數(shù)據(jù)的速率可達(dá)15 GB/s,讀數(shù)據(jù)的速率可達(dá)147 GB/s,數(shù)據(jù)速率有大幅的提高。
5結(jié)論
本文在PCIe硬核基礎(chǔ)上,設(shè)計(jì)了DMA控制器,使傳輸速度大幅度提高。經(jīng)實(shí)際測(cè)試,該方案的數(shù)據(jù)傳輸速度在15 GB/s左右,可以滿足工作需要。PCIe是目前總線中傳輸速度最快的一種,此方案為高速的數(shù)據(jù)傳輸提供了一個(gè)參考,具有很好的參考和應(yīng)用價(jià)值。參考文獻(xiàn)
?。?] 王齊.PCI Express 體系結(jié)構(gòu)導(dǎo)讀[M].北京:機(jī)械工業(yè)出版社,2010.
?。?] 雷雨,任國(guó)強(qiáng),孫健,等.基于PCIE 的高速光纖圖像實(shí)時(shí)采集系統(tǒng)設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2013,39(10):136-142.
?。?] 魏蕓.基于FPGA的PCIe總線DMA平臺(tái)設(shè)計(jì)[D].武漢:武漢理工大學(xué),2013.
?。?] 陳剛,張京,唐建.一種基于FPGA的PCIe總線及其DMA的設(shè)計(jì)方法[J].兵工自動(dòng)化,2014,33(5):75-77.
?。?] LogiCORETM IP Virtex6 FPGA Integrated Block Data Sheet[R].Xilinx,2009.
[6] 李木國(guó),黃影,劉于之.基于FPGA的PCIe總線接口的DMA傳輸設(shè)計(jì)[J].計(jì)算機(jī)測(cè)量與控制,2013,21(1):233-235.