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