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