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