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