文獻(xiàn)標(biāo)識(shí)碼: A
DOI:10.16157/j.issn.0258-7998.190034
中文引用格式: 孫豐霞,張偉功,周繼芹,等. UM-BUS總線測試系統(tǒng)中PCIe的設(shè)計(jì)與實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,2019,45(5):61-65.
英文引用格式: Sun Fengxia,Zhang Weigong,Zhou Jiqin,et al. Design and implementation of PCIe on UM-BUS test system[J]. Application of Electronic Technique,2019,45(5):61-65.
0 引言
UM-BUS[1-2]總線是一種具有動(dòng)態(tài)重構(gòu)能力的高速串行總線。為了驗(yàn)證UM-BUS總線在傳輸速率及帶寬靈活性方面的優(yōu)勢,本文設(shè)計(jì)了一個(gè)UM-BUS測試系統(tǒng)[3],其功能是將采集的總線數(shù)據(jù)緩存到SDRAM存儲(chǔ)器中,并實(shí)現(xiàn)FPGA端SDRAM存儲(chǔ)器與PC的通信,將數(shù)據(jù)傳輸至PC進(jìn)行分析和處理。
鑒于PCIe1.1(PCI Express)采用點(diǎn)對(duì)點(diǎn)串行連接、全雙工的傳輸方式,并可根據(jù)實(shí)際需求靈活配置成x1、x4、x8和x16通道,單通道單向傳輸帶寬可達(dá)250 MB/s,本文采用PCIe1.1[4]x4通道,基于DMA[5-6](Direct Memory Access)傳輸機(jī)制共同實(shí)現(xiàn)了SDRAM存儲(chǔ)器與PC之間的通信傳輸設(shè)計(jì)。
1 研究背景
1.1 UM-BUS總線介紹
UM-BUS總線采用多線路并發(fā)冗余的總線型拓?fù)浣Y(jié)構(gòu),采用節(jié)點(diǎn)互連方式,最多可以連接30個(gè)總線節(jié)點(diǎn)設(shè)備,采用32條通道進(jìn)行數(shù)據(jù)的并發(fā)傳輸,單通道速率可達(dá)200 Mb/s。其拓?fù)浣Y(jié)果如圖1所示,其中n表示總線上的節(jié)點(diǎn)數(shù),m表示物理通道數(shù)。
1.2 UM-BUS總線測試系統(tǒng)介紹
本文UM-BUS總線測試系統(tǒng)是針對(duì)采用16通道并發(fā)傳輸?shù)腢M-BUS總線而設(shè)計(jì)的,理論速率可達(dá)400 MB/s,滿足當(dāng)前大多數(shù)測試和應(yīng)用帶寬需求。為了將采集的高速總線數(shù)據(jù)傳輸?shù)絇C進(jìn)行分析處理,完成測試功能需求,本文在UM-BUS總線測試系統(tǒng)中設(shè)計(jì)并實(shí)現(xiàn)了PCIe1.1技術(shù)。
如圖2所示,在UM-BUS測試系統(tǒng)中,系統(tǒng)要求PC能夠?qū)τ蓴?shù)據(jù)采集模塊采集處理后的數(shù)據(jù)通過外部SDRAM存儲(chǔ)器進(jìn)行緩沖,然后通過PCIe接口將數(shù)據(jù)傳輸至PC進(jìn)行保存。目前UM-BUS總線數(shù)據(jù)采集模塊和高速緩存模塊設(shè)計(jì)已完成,本文重點(diǎn)是PCIe通信接口的設(shè)計(jì)與實(shí)現(xiàn)。
2 PCIe通信接口設(shè)計(jì)
為了更好地發(fā)揮PCIe總線的高帶寬優(yōu)勢,本文采用Xilinx公司Virtex-5系列XC5VLX85T的FPGA來設(shè)計(jì)PCIe通信接口,通過其內(nèi)部嵌入的PCIe IP硬核Endpoint Block Plus for PCI Express1.1[7]來實(shí)現(xiàn)。為了提高CPU的運(yùn)行效率,引入DMA設(shè)計(jì),本文采用總線主控DMA(BUS Master DMA,BMD)的方式控制PCIe IP硬核從而控制高速數(shù)據(jù)的傳輸。
3 硬件邏輯設(shè)計(jì)
針對(duì)Xilinx公司XC5VLX85T PFGA,在Windows系統(tǒng)平臺(tái)下,以Xilinx的參考案例XAPP1052[8]為基礎(chǔ),實(shí)現(xiàn)了PCIe總線的BMD功能邏輯設(shè)計(jì)。
如圖3所示,BMD主要由以下五部分構(gòu)成:
(1)PCIe IP硬核:對(duì)外與其他PCIe設(shè)備通信,對(duì)內(nèi)與發(fā)送引擎和接收引擎進(jìn)行數(shù)據(jù)傳輸。
(2)設(shè)備控制模塊:接收通過接收引擎解析的數(shù)據(jù),并將數(shù)據(jù)存儲(chǔ)在SDRAM中;將SDRAM中的數(shù)據(jù)讀出,供發(fā)送引擎組織TLP[9]包使用。為了匹配PCIe IP核和SDRAM兩側(cè)不同時(shí)鐘域、不同速率的數(shù)據(jù)緩沖和位寬轉(zhuǎn)換,設(shè)計(jì)了FIFO緩沖模塊。
(3)寄存器控制模塊:解析來自PC的命令和配置,并通知發(fā)送引擎、接收引擎和設(shè)備控制模塊作出相應(yīng)的執(zhí)行操作。
(4)接收引擎模塊:接收并解析TLP包,根據(jù)TLP的包頭信息,將對(duì)應(yīng)的數(shù)據(jù)寫入寄存器控制模塊的寄存器中,或者對(duì)接收到的存儲(chǔ)器讀TLP進(jìn)行拆包。
(5)發(fā)送引擎模塊:負(fù)責(zé)把待發(fā)送數(shù)據(jù)組織成TLP包,并傳送給PCIE IP核。
3.1 DMA傳輸?shù)倪壿嬙O(shè)計(jì)與實(shí)現(xiàn)
DMA傳輸包括兩個(gè)過程,即DMA讀(PC端到FPGA端)和DMA寫(FPGA端到PC端)。
3.1.1 DMA讀設(shè)計(jì)與實(shí)現(xiàn)
DMA讀操作包含兩個(gè)過程,發(fā)送引擎組裝DMA讀請求TLP并發(fā)送,接收引擎接收PC返回的CPLD TLP。
本文在接收引擎中設(shè)置了4個(gè)TAG存儲(chǔ)器,每個(gè)TAG存儲(chǔ)器對(duì)應(yīng)一個(gè)等待完成包的讀請求,TAG存儲(chǔ)器用來保存讀請求的設(shè)備訪問地址及長度,對(duì)每個(gè)讀請求,PC可能會(huì)用多個(gè)CPLD TLP來應(yīng)答,當(dāng)PC送來CPLD TLP時(shí),接收引擎根據(jù)CPLD TLP中的TAG標(biāo)識(shí),查找對(duì)應(yīng)的TAG存儲(chǔ)器,獲得設(shè)備側(cè)SDRAM的寫入地址。因此,當(dāng)發(fā)送引擎發(fā)送讀請求TLP時(shí),必須等待可用的TAG存儲(chǔ)器,并以可用的TAG存儲(chǔ)器編號(hào)作為讀請求的TAG標(biāo)識(shí)。當(dāng)對(duì)可用TAG進(jìn)行優(yōu)先級(jí)排除時(shí),優(yōu)先級(jí)設(shè)置為0、2、1、3,以下的程序片段為接收引擎中TAG空閑信號(hào)TAG_empty_o及TAG標(biāo)號(hào)TAG_empty_Index優(yōu)先級(jí)設(shè)置方法,其中TAG_Valid為接收引擎收到的TAG對(duì)應(yīng)的TAG標(biāo)識(shí)。
為此設(shè)計(jì)的DMA讀操作如下所示:
(1)發(fā)送DMA讀請求TLP
①共需要發(fā)送rmrd_count個(gè)DMA讀請求TLP, rmrd_count由軟件在寄存器控制模塊中設(shè)置。當(dāng)接收引擎有空閑TAG時(shí),發(fā)送DMA讀請求TLP的第一個(gè)64 bit,使用該空閑的TAG 編號(hào)TAG_empty_Index_i來作為TAG標(biāo)識(shí),即trn_rd[41:40]={TAG_empty_Index_i}。
②根據(jù)32 bit地址信息組裝DMA讀請求TLP的第二個(gè)64 bit并發(fā)送。
(2)接收PC返回的CPLD TLP
流程如圖4所示。
①接收CPLD TLP的第一個(gè)64 bit,解析得到TLP包數(shù)據(jù)長度。
②當(dāng)接收緩沖FIFO為空且收到的TAG標(biāo)識(shí)有效時(shí),將解析得到的數(shù)據(jù)寫入FIFO中進(jìn)行緩存。
③接收CPLD TLP后續(xù)數(shù)據(jù)并將其寫入FIFO進(jìn)行緩存。
④若是CPLD TLP傳輸完成,判斷接收到的數(shù)據(jù)長度。如若實(shí)際接收的數(shù)據(jù)長度與TLP包應(yīng)傳輸長度一致,則當(dāng)前CPLD TLP正確接收完成,清除TAG有效標(biāo)識(shí),此時(shí)TAG存儲(chǔ)器處于空閑狀態(tài),可用于新的DMA讀請求。
3.1.2 DMA寫設(shè)計(jì)與實(shí)現(xiàn)
DMA寫操作實(shí)現(xiàn)的主要方法是將TLP包頭中的各個(gè)字段正確填充,并將數(shù)據(jù)按照64 bit并行放在TLP包頭,傳輸給PCIe IP硬核,然后硬核以PCIe協(xié)議串行傳輸給PC。DMA寫操作在發(fā)送引擎中實(shí)現(xiàn),操作流程如圖5所示。
(1)發(fā)送FIFO讀取SDRAM存儲(chǔ)器數(shù)據(jù)。當(dāng)需要傳輸?shù)臄?shù)據(jù)量大于等于4 096 B時(shí),傳輸數(shù)據(jù)量為4 096 B,否則傳輸數(shù)據(jù)量為SDRAM中剩余數(shù)據(jù)量。
(2)若發(fā)送FIFO讀取數(shù)據(jù)完成,則發(fā)送DMA寫TLPs。
①設(shè)置TLP包計(jì)數(shù)值cur_wr_count,初始值為零:cur_wr_count<=cur_wr_count+1′b1,將DMA寫請求各字段填入TLP包頭的第一個(gè)64 bit中發(fā)送。
②將32 bit地址和第一個(gè)32 bit數(shù)據(jù)填入TLP包頭的第二個(gè)64 bit字發(fā)送。
③將每個(gè)TLP所需傳輸?shù)臄?shù)據(jù)填入TLP后續(xù)的64 bit字進(jìn)行發(fā)送。
(3)重復(fù)步驟(2),直至cur_wr_count達(dá)到所需傳輸TLP包個(gè)數(shù)設(shè)定值,DMA寫操作完成。
3.2 SDRAM控制模塊設(shè)計(jì)
本文采用了片外擴(kuò)展SDRAM存儲(chǔ)芯片,片內(nèi)編寫SDRAM控制器的方式實(shí)現(xiàn)數(shù)據(jù)的緩存。采用兩片32 M×16 bit SDRAM,SDRAM存儲(chǔ)器只進(jìn)行單端口數(shù)據(jù)操作,SDRAM控制器被設(shè)計(jì)成有左端口和右端口的雙口控制器,在邏輯上將控制器實(shí)現(xiàn)左端口輸入數(shù)據(jù)、右端口輸出數(shù)據(jù)的功能。雙口設(shè)計(jì)實(shí)現(xiàn)了數(shù)據(jù)傳輸方向的靈活控制。
圖6是SDRAM控制邏輯的狀態(tài)機(jī),其中S0和S2是等待命令狀態(tài)。S1表示經(jīng)DMA讀方式緩存在接收緩沖FIFO的數(shù)據(jù)有寫入SDRAM的請求時(shí),SDRAM控制器成為左口模式,數(shù)據(jù)存入SDRAM。S3表示有DMA寫請求,發(fā)送緩沖FIFO有讀取SDRAM數(shù)據(jù)請求時(shí),SDRAM控制器成為右口模式,數(shù)據(jù)從SDRAM存儲(chǔ)器讀出后被傳輸?shù)桨l(fā)送緩沖FIFO。
4 軟件設(shè)計(jì)
軟件設(shè)計(jì)包括驅(qū)動(dòng)程序設(shè)計(jì)和應(yīng)用軟件程序設(shè)計(jì)。
本文PCIe驅(qū)動(dòng)程序是在Windows 7操作系統(tǒng)下開發(fā)設(shè)計(jì)的,選用Jungo公司軟件WinDriver生成,極大地簡化了硬件驅(qū)動(dòng)程序開發(fā)的工作量,具有極強(qiáng)的平臺(tái)移植性。WinDriver支持Xilinx的BMD模式,能夠根據(jù)硬件設(shè)備的描述自動(dòng)產(chǎn)生設(shè)備驅(qū)動(dòng)程序源代碼程序框架,用戶在Visual Studio2015下根據(jù)要實(shí)現(xiàn)的功能添加代碼,完成驅(qū)動(dòng)程序的開發(fā)。
應(yīng)用軟件程序的開發(fā)則使用了Visual Studio2015,主要功能是測試直接訪問讀寫和DMA讀寫的正確性。在實(shí)現(xiàn)PCIe數(shù)據(jù)傳輸過程中,數(shù)據(jù)傳輸流程為:數(shù)據(jù)從PC內(nèi)存通過PCIe接口以DMA讀的方式向下傳輸?shù)紽PGA內(nèi)部發(fā)送緩存FIFO中,F(xiàn)PGA內(nèi)部SDRAM控制邏輯再將數(shù)據(jù)傳輸?shù)絊DRAM存儲(chǔ)器中進(jìn)行存儲(chǔ),向下傳輸成功后,F(xiàn)PGA內(nèi)部邏輯從SDRAM存儲(chǔ)器中將存儲(chǔ)的數(shù)據(jù)讀出,然后通過PCIe接口以DMA寫的方式將數(shù)據(jù)傳回PC內(nèi)存,與原始數(shù)據(jù)進(jìn)行比對(duì)校驗(yàn)。
5 FPGA測試驗(yàn)證
為了對(duì)設(shè)計(jì)實(shí)現(xiàn)的PCIe接口進(jìn)行測試驗(yàn)證,需將硬件部分燒錄到板卡的FPGA芯片后,通過板卡的PCIe金手指插到PC的主板上,重啟PC,檢測到新的硬件插入后便可安裝相應(yīng)的PCIe驅(qū)動(dòng)文件,成功安裝后進(jìn)行功能測試。
上位機(jī)軟件界面如圖7所示,從圖中可以看到,測試包括DMA讀操作、DMA寫操作及寄存器讀寫操作,步驟如下:
(1)進(jìn)行DMA讀操作,將所要傳輸?shù)臄?shù)據(jù)文件讀入PC機(jī)內(nèi)存,然后寫入FPGA端;
(2)進(jìn)行DMA寫操作,F(xiàn)PGA通過DMA寫將數(shù)據(jù)寫回PC,并以文件的形式保存在PC上,PC對(duì)寫回的數(shù)據(jù)和初始數(shù)據(jù)進(jìn)行校驗(yàn);
(3)直接訪問操作,對(duì)指定地址的寄存器進(jìn)行讀寫操作。
在進(jìn)行DMA讀寫操作過程中,同時(shí)通過ChipScope Analyzer工具捕獲各模塊的端口數(shù)據(jù)來驗(yàn)證DMA讀寫操作過程中數(shù)據(jù)傳輸?shù)恼_性。以DMA讀為例,如圖8所示,接收引擎模塊從PCIe IP硬核接收信號(hào)trn_rd,解析得到有效數(shù)據(jù),接收緩沖FIFO讀取其有效數(shù)據(jù)并輸出dout信號(hào),SDRAM存儲(chǔ)器讀取信號(hào)SDR_Din并進(jìn)行存儲(chǔ)。對(duì)比PC發(fā)送的原始數(shù)據(jù)和SDR_Din信號(hào)數(shù)據(jù),得知DMA讀操作正確。從圖7軟件界面可知,DMA讀寫數(shù)據(jù)長度107 640 B,PC原始數(shù)據(jù)與經(jīng)DMA讀寫兩個(gè)操作返回的數(shù)據(jù)全部一致,故而DMA讀寫正確。
經(jīng)過多次測試,每次通信數(shù)據(jù)總量不少于100 GB,并未在DMA讀寫兩個(gè)通道中發(fā)現(xiàn)不一致的數(shù)據(jù),沒有丟幀和誤碼現(xiàn)象。由此推算,PCIe通信數(shù)據(jù)誤碼率低于10-8。
DMA讀寫速度如表1所示。
在x4模式下,DMA的加入,寫速率提升了近9倍,讀速率提升了約10倍,并且PCIe總線的平均DMA讀寫速度穩(wěn)定在500 MB/s以上,均超過16通道的總線測試系統(tǒng)的400 MB/s高速數(shù)據(jù)傳輸要求。
6 結(jié)論
本文設(shè)計(jì)實(shí)現(xiàn)了UM-BUS總線測試系統(tǒng)中PCIe1.1 x4鏈路通道的應(yīng)用方案,采用基于FPGA的PCIe總線的DMA數(shù)據(jù)傳輸方式解決了總線測試系統(tǒng)中PCIe通信接口模塊與PC間的高速數(shù)據(jù)傳輸問題,并完成了測試系統(tǒng)中的SDRAM高速緩存處理,最后結(jié)合WinDriver軟件對(duì)PCIe功能進(jìn)行了測試。測試結(jié)果表明,PCIe總線的DMA讀寫速度穩(wěn)定在500 MB/s以上,均超過UM-BUS總線16通道并發(fā)傳輸?shù)目偩€測試系統(tǒng)的400 MB/s帶寬需求。
參考文獻(xiàn)
[1] 張偉功,周繼芹,李杰,等.UM-BUS總線及接入式體系結(jié)構(gòu)[J].電子學(xué)報(bào),2015,43(9):1776-1785.
[2] 鄧哲,張偉功,朱曉燕,等.動(dòng)態(tài)可重構(gòu)總線數(shù)據(jù)傳輸管理方法設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2013,39(1):264-269.
[3] 王春亮.基于UM-BUS系統(tǒng)的總線測試方案研究[D].北京:首都師范大學(xué),2014.
[4] 王嘉良,趙曙光.用FPGA實(shí)現(xiàn)PCI-E接口和DMA控制器設(shè)計(jì)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2011,21(6):181-184.
[5] 王之光,高清運(yùn).基于FPGA的PCIe總線接口的DMA控制器的設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2018,44(1):9-12.
[6] 李超,邱柯妮,張偉功,等.基于PCIE總線主模式DMA高速數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2015,41(9):142-145.
[7] Xilinx DS551.LogiCORE IP endpoint block plus v1.15 for PCI express[Z].2011.
[8] LAWLEY J.Bus master performance demonstration reference design for the Xilinx endpoint PCI express solutions[Z].USA:Xilinx,2015.
[9] 王齊.PCI Express體系結(jié)構(gòu)導(dǎo)讀[M].北京:機(jī)械工業(yè)出版社,2010.
作者信息:
孫豐霞1,張偉功1,2,3,周繼芹3,王 瑩1
(1.首都師范大學(xué) 信息工程學(xué)院,北京100048;
2.首都師范大學(xué) 北京成像技術(shù)高精尖創(chuàng)新中心,北京100048;
3.首都師范大學(xué) 高可靠嵌入式系統(tǒng)技術(shù)北京市工程技術(shù)研究中心,北京100048)