文獻標識碼: 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進行分析和處理。
鑒于PCIe1.1(PCI Express)采用點對點串行連接、全雙工的傳輸方式,并可根據(jù)實際需求靈活配置成x1、x4、x8和x16通道,單通道單向傳輸帶寬可達250 MB/s,本文采用PCIe1.1[4]x4通道,基于DMA[5-6](Direct Memory Access)傳輸機制共同實現(xiàn)了SDRAM存儲器與PC之間的通信傳輸設(shè)計。
1 研究背景
1.1 UM-BUS總線介紹
UM-BUS總線采用多線路并發(fā)冗余的總線型拓撲結(jié)構(gòu),采用節(jié)點互連方式,最多可以連接30個總線節(jié)點設(shè)備,采用32條通道進行數(shù)據(jù)的并發(fā)傳輸,單通道速率可達200 Mb/s。其拓撲結(jié)果如圖1所示,其中n表示總線上的節(jié)點數(shù),m表示物理通道數(shù)。
1.2 UM-BUS總線測試系統(tǒng)介紹
本文UM-BUS總線測試系統(tǒng)是針對采用16通道并發(fā)傳輸?shù)腢M-BUS總線而設(shè)計的,理論速率可達400 MB/s,滿足當(dāng)前大多數(shù)測試和應(yīng)用帶寬需求。為了將采集的高速總線數(shù)據(jù)傳輸?shù)絇C進行分析處理,完成測試功能需求,本文在UM-BUS總線測試系統(tǒng)中設(shè)計并實現(xiàn)了PCIe1.1技術(shù)。
如圖2所示,在UM-BUS測試系統(tǒng)中,系統(tǒng)要求PC能夠?qū)τ蓴?shù)據(jù)采集模塊采集處理后的數(shù)據(jù)通過外部SDRAM存儲器進行緩沖,然后通過PCIe接口將數(shù)據(jù)傳輸至PC進行保存。目前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ā)送引擎和接收引擎進行數(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進行拆包。
(5)發(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標識,查找對應(yīng)的TAG存儲器,獲得設(shè)備側(cè)SDRAM的寫入地址。因此,當(dāng)發(fā)送引擎發(fā)送讀請求TLP時,必須等待可用的TAG存儲器,并以可用的TAG存儲器編號作為讀請求的TAG標識。當(dāng)對可用TAG進行優(yōu)先級排除時,優(yōu)先級設(shè)置為0、2、1、3,以下的程序片段為接收引擎中TAG空閑信號TAG_empty_o及TAG標號TAG_empty_Index優(yōu)先級設(shè)置方法,其中TAG_Valid為接收引擎收到的TAG對應(yīng)的TAG標識。
為此設(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標識,即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標識有效時,將解析得到的數(shù)據(jù)寫入FIFO中進行緩存。
③接收CPLD TLP后續(xù)數(shù)據(jù)并將其寫入FIFO進行緩存。
④若是CPLD TLP傳輸完成,判斷接收到的數(shù)據(jù)長度。如若實際接收的數(shù)據(jù)長度與TLP包應(yīng)傳輸長度一致,則當(dāng)前CPLD TLP正確接收完成,清除TAG有效標識,此時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字進行發(fā)送。
(3)重復(fù)步驟(2),直至cur_wr_count達到所需傳輸TLP包個數(shù)設(shè)定值,DMA寫操作完成。
3.2 SDRAM控制模塊設(shè)計
本文采用了片外擴展SDRAM存儲芯片,片內(nèi)編寫SDRAM控制器的方式實現(xiàn)數(shù)據(jù)的緩存。采用兩片32 M×16 bit SDRAM,SDRAM存儲器只進行單端口數(shù)據(jù)操作,SDRAM控制器被設(shè)計成有左端口和右端口的雙口控制器,在邏輯上將控制器實現(xiàn)左端口輸入數(shù)據(jù)、右端口輸出數(shù)據(jù)的功能。雙口設(shè)計實現(xiàn)了數(shù)據(jù)傳輸方向的靈活控制。
圖6是SDRAM控制邏輯的狀態(tài)機,其中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存儲器中進行存儲,向下傳輸成功后,F(xiàn)PGA內(nèi)部邏輯從SDRAM存儲器中將存儲的數(shù)據(jù)讀出,然后通過PCIe接口以DMA寫的方式將數(shù)據(jù)傳回PC內(nèi)存,與原始數(shù)據(jù)進行比對校驗。
5 FPGA測試驗證
為了對設(shè)計實現(xiàn)的PCIe接口進行測試驗證,需將硬件部分燒錄到板卡的FPGA芯片后,通過板卡的PCIe金手指插到PC的主板上,重啟PC,檢測到新的硬件插入后便可安裝相應(yīng)的PCIe驅(qū)動文件,成功安裝后進行功能測試。
上位機軟件界面如圖7所示,從圖中可以看到,測試包括DMA讀操作、DMA寫操作及寄存器讀寫操作,步驟如下:
(1)進行DMA讀操作,將所要傳輸?shù)臄?shù)據(jù)文件讀入PC機內(nèi)存,然后寫入FPGA端;
(2)進行DMA寫操作,F(xiàn)PGA通過DMA寫將數(shù)據(jù)寫回PC,并以文件的形式保存在PC上,PC對寫回的數(shù)據(jù)和初始數(shù)據(jù)進行校驗;
(3)直接訪問操作,對指定地址的寄存器進行讀寫操作。
在進行DMA讀寫操作過程中,同時通過ChipScope Analyzer工具捕獲各模塊的端口數(shù)據(jù)來驗證DMA讀寫操作過程中數(shù)據(jù)傳輸?shù)恼_性。以DMA讀為例,如圖8所示,接收引擎模塊從PCIe IP硬核接收信號trn_rd,解析得到有效數(shù)據(jù),接收緩沖FIFO讀取其有效數(shù)據(jù)并輸出dout信號,SDRAM存儲器讀取信號SDR_Din并進行存儲。對比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功能進行了測試。測試結(jié)果表明,PCIe總線的DMA讀寫速度穩(wěn)定在500 MB/s以上,均超過UM-BUS總線16通道并發(fā)傳輸?shù)目偩€測試系統(tǒng)的400 MB/s帶寬需求。
參考文獻
[1] 張偉功,周繼芹,李杰,等.UM-BUS總線及接入式體系結(jié)構(gòu)[J].電子學(xué)報,2015,43(9):1776-1785.
[2] 鄧哲,張偉功,朱曉燕,等.動態(tài)可重構(gòu)總線數(shù)據(jù)傳輸管理方法設(shè)計與實現(xiàn)[J].計算機工程,2013,39(1):264-269.
[3] 王春亮.基于UM-BUS系統(tǒng)的總線測試方案研究[D].北京:首都師范大學(xué),2014.
[4] 王嘉良,趙曙光.用FPGA實現(xiàn)PCI-E接口和DMA控制器設(shè)計[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].北京:機械工業(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)