文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.2015.09.039
中文引用格式: 李超,邱柯妮,張偉功,等. 基于PCIE總線主模式DMA高速數據傳輸系統(tǒng)設計[J].電子技術應用,2015,41(9):142-145.
英文引用格式: Li Chao,Qiu Keni,Zhang Weigong,et al. Design of a high speed data transmission system based on PCIE bus master DMA mode[J].Application of Electronic Technique,2015,41(9):142-145.
0 引言
PCIE總線是新一代的I/O互連標準,它可提供點到點的串行差分信號鏈路的互連設備,且具有高性能、高帶寬、雙單工等特點。因此,取代了早期并行PCI總線,從而滿足了發(fā)展迅速的微處理器及存儲器對速率和帶寬的要求。PCIE總線主要特點如下[1]:
(1)PCIE設備在電氣上使用差分驅動器和差分接收器來發(fā)送和接收信號,一條PCIE通道(簡稱x1)由兩對LVDS差分信號線來實現接收和發(fā)送。
(2)可以根據需求配置為x1,x2,x4,x8,x16,x32模式,且x1通道峰值總帶寬可達0.5 Gb/s,其余的是乘相應通道數[2]。
(3)數據使用數據包的格式,在鏈路上串行傳輸,用以保障數據的可靠性及完整性。
通過上述PCIE總線的特點,總結出PCIE總線具有高速的傳輸特性,特別是在高速DMA控制器傳輸方式下[3],具有更廣闊的應用前景。
本文利用PCIE總線的高速串行傳輸等特點,采用Xilinx公司V5系列的FPGA芯片[4],基于PCIE2.0協議,設計出一個在FPGA板卡與PC之間以總線主模式DMA傳輸的高速數據傳輸系統(tǒng)。實現了數據的單字讀寫及總線主模式DMA讀寫通信方式,并利用上位機軟件和ChipScope(嵌入式邏輯分析工具)觀察并驗證了讀寫數據的正確性。該系統(tǒng)為FPGA板卡作為數據采集板奠定了基礎,可滿足數據采集卡對速率及正確性的需求。
1 PCIE簡介
與網絡的分層協議類似,PCIE協議規(guī)范對設備的設計也采用分層的結構,如圖1所示,從上到下有事務層、數據鏈路層、物理層,各層又都分為發(fā)送和接收部分。在發(fā)送部分根據設備核及應用程序的信息,在事務層形成事務層包(TLP),然后數據鏈路層在TLP包上附加一些信息用于檢測等然后發(fā)送至下層,在物理層對其進行8B/10B編碼然后發(fā)送至鏈路層。在接收部分是相反的操作。
信息以包的形式在PCIE設備間傳送,由于本設計中利用了V5芯片內部的PCIE硬核,只有傳輸的包頭和數據需要在代碼中實現,其余的都是PCIE硬核自動生成并加到包頭或包尾。如圖2所示為給出的一個包頭的通用字段[5],包頭長為3DW或者4DW,分別可支持32 bit和64 bit存儲器尋址。PCIE協議規(guī)定Fmt指示包的格式,Type指示包的類型,根據Fmt及Type的不同組合來定義不同類型的事務包。本系統(tǒng)主要實現單字讀寫及DMA讀寫,因此主要使用了事務層包中的存儲器請求包及完成包兩種。如果是一個存儲器寫事務,請求者會填寫正確的TLP內容及地址并將數據放在TLP包頭后發(fā)送給完成者,完成者會解析收到的包并將數據放到自己的存儲空間中。如果是一個存儲器讀事務,請求者會填寫滿足存儲器讀事務的Fmt及Type字段等,完成者接收到該包后會根據要求生成完成包發(fā)送給請求者,請求者解析完成包并將數據存儲。
每個PCIE設備的功能與其配置空間是相關聯的,配置空間由配置寄存器構成,是軟件與設備硬件進行交互與聯系的區(qū)域,是實現即插即用的基礎。軟件可通過配置空間檢測到一個PCIE設備的存在并通過它訪問該設備,為設備申請其需要的資源(包括存儲器、IO、中斷等)。
2 軟件、驅動程序及硬件設計
2.1 系統(tǒng)介紹
基于PCIE總線主模式DMA高速數據傳輸系統(tǒng)的設計框架圖如圖3所示,其中包括上位機軟件、COM組件、設備驅動程序及硬件部分。其中上位機軟件的主要功能是顯示測試速度、DMA命令的設置與啟動以及顯示數據結果。COM組件封裝了與驅動程序交互的函數,使得開發(fā)層次更加分明。設備驅動程序用于與PC內根聯合體(RC)交互,最終通過根聯合體的PCIE控制器與硬件FPGA進行通信。本文實現了單字讀寫及總線主模式DMA讀寫兩種模式??偩€主模式指的是以硬件PCIE總線端為主,向PC寫入數據或者從PC讀出數據。
2.2 軟件及驅動
本系統(tǒng)的上位機軟件界面采用Visual Studio2010編寫,調用COM組件使其與驅動程序進行交互,COM組件封裝了與驅動程序交互的函數,包括打開設備、單字讀寫、DMA讀寫的函數等,可以供上層軟件使用,使用COM組件的好處是可以使得程序變得更加通用,上層的界面實現可以更加多樣(例如可以是MFC、VB、網頁或者是WIN32控制臺)。如果需要增加一些功能,那么只需修改COM組件即可,使上層程序與驅動分離,各層的功能更加專一。
PCIE驅動程序的設計是參考Xilinx官網的驅動標準,該驅動是基于WDM模式的,參考該驅動作了相應的修改,利用WDK生成Win7系統(tǒng)使用的驅動文件并在系統(tǒng)檢測到實驗板后加載該驅動,使得COM組件可以實現單字讀寫及DMA的讀寫方式,并將DMA寫的數據在軟件界面中顯示或者保存下來。
2.3 硬件設計
硬件設計部分主要包括PCIE的硬核及應用邏輯模塊兩部分,PCIE的硬核(IP)是利用ISE工具生成的,包括PCIE物理層及鏈路層模塊,而應用邏輯模塊(APP)包括接收引擎模塊、發(fā)送引擎模塊及存儲訪問模塊。
2.3.1 模塊簡介
RX_ENGINE模塊是接收引擎處理模塊,負責解析IP核的數據包以及單字讀、DMA讀接收數據包的狀態(tài)機。TX_ENGINE模塊是發(fā)送引擎處理模塊,負責單字寫、DMA寫狀態(tài)及和中斷控制。MEM模塊是存儲訪問模塊,里面包含DMA狀態(tài)及控制寄存器用以控制DMA讀寫,這里的寄存器是利用PIO的方式寫入的(即單字讀寫)。上層軟件在界面中設置的長度、數量的值等將會寫入到這些寄存器中。本設計中使用V5芯片中自帶的PCIE IP硬核完成PCIE協議中物理層及數據鏈路層的功能。
2.3.2 DMA寫流程
由于采用的是總線主模式的DMA方式,即一次DMA寫的過程是由FPGA的RAM寫入PC的存儲器中,并在上位機軟件中顯示出來的過程。在TX引擎向硬核發(fā)送數據前,首先需要填充正確的TLP包頭,包頭的信息需要由上位機軟件控制。DMA寫的過程如下:
(1)在軟件界面中設置本次DMA寫的大小、數量、地址等及DMA寫啟動命令。
(2)驅動程序將第一步中設置的內容通過PIO(程控輸入/輸出)的方式,最終以TLP包的形式發(fā)送給硬件并寫入到MEM中的DMA狀態(tài)控制寄存器中。
(3)根據DMA狀態(tài)與控制寄存器的內容,在收到DMA寫啟動命令后,TX引擎開始從RAM中讀取數據并按第一步設置的DMA大小數量來組裝TLP包然后發(fā)送到EP模塊。在EP模塊加入鏈路層及物理層的包頭等信息后發(fā)送到主機存儲器中。
(4)COM組件將DMA寫地址的數據映射到上位機一個緩沖區(qū)中,上位機軟件通過讀取對應地址的緩沖區(qū)數據來驗證數據并顯示在其界面中。
其中TX引擎的狀態(tài)轉移過程如圖4所示。在BMD_TX_RST_STATE狀態(tài)中收到寫啟動命令后,填寫存儲器寫TLP包頭的前64 bit內容,包括圖中的FMT、TYPT、LENGTH、ID等。然后跳轉進入BMD_TX_MWR_QW1狀態(tài),該狀態(tài)完成存儲器寫TLP包頭的第二個64 bit內容,包括有地址及需要傳輸數據的高32位數據。最后跳轉進入BMD_TX_MWR_QWN狀態(tài)來發(fā)送剩余的數據,當發(fā)送數據的數量達到軟件設置的DMA寫大小后,跳轉回BMD_TX_RST_STATE狀態(tài)。其他的狀態(tài)分別對應發(fā)送單字讀完成包及存儲器讀包的狀態(tài)。
2.3.3 DMA讀流程
DMA讀的過程是將上位機一個存儲空間的數據讀入到FPGA的RAM中,從硬件的角度上看是FPGA向PC發(fā)送存儲器讀命令,然后PC向FPGA返回帶數據的完成包。但實現時是軟件設置本次DMA讀的地址、數量等然后啟動本次傳輸,由FPGA接收數據并存入到RAM里,通過ChipScope可觀察到數據。DMA讀的過程如下:
(1)在軟件界面中設置本次DMA讀的地址、大小、數量等及DMA讀啟動命令。
(2)這些命令通過COM組件與驅動程序交互,并生成相應的TLP包發(fā)送給硬件,寫入圖MEM的DMA狀態(tài)控制寄存機中。
(3)根據DMA狀態(tài)與控制寄存器的內容,收到DMA讀啟動命令后,在TX引擎中根據剛剛軟件設置的命令組裝存儲器讀TLP包后發(fā)送給EP模塊,在EP模塊中加入數據鏈路層及物理層所需的包頭等最后串行傳出到上位機中。
(4)上位機根據收到的存儲器讀包,在指定的地址讀取數據后形成帶數據完成包(CPLD)返回給FPGA,并存儲在FPGA內的一個RAM里。
其中RX引擎的狀態(tài)轉移過程如圖5所示。在BMD_RX_RST_STATE狀態(tài)中根據收到的包頭類型來判斷轉入的下一個狀態(tài),如果收到的是一個完成包頭類型則轉入BMD_MEM_CPLD_FMT_TYPE狀態(tài),從收到的包中截取完成包的大小等進入BMD_RX_CPLD_QW1,從包中截取地址等信息后跳轉進入BMD_RX_CPLD_QWN狀態(tài),在這里根據軟件界面設置的DMA讀的大小將讀出的數據寫入到完成包RAM中。完成后回到BMD_RX_RST_STATE狀態(tài)。
3 仿真與實現結果
本文設計的總線主模式高速數據傳輸系統(tǒng)在將硬件部分燒錄到板卡的FPGA芯片后,通過板卡的PCIE金手指插入到PC的主板上,PC重啟檢測到新的硬件插入后便可安裝對應的PCIE驅動文件,成功安裝去驅動后,便可使用上位機軟件進行測試。
上位機軟件界面如圖6所示,包括有單字讀寫設置模塊、DMA讀寫設置模塊、傳輸速率顯示模塊、DMA寫數據顯示模塊。
以一次DMA寫為例來介紹上述模塊,在軟件上設置本次DMA寫的TLP大小及TLP數量,將寫模式復選框勾選并點擊開始按鈕,可在界面上看到傳輸數據的結果及本次測試DMA寫的速度。
經多次實驗測試,在上位機軟件界面上設置DMA讀、寫TLP事務層包(即數據包)大小為128 B,傳輸數據包的數量為16,其中某次測得的寫速度結果為3 390 Mb/s=423 MB/s,速度的大小與一次DMA傳輸的TLP數量及TLP包的大小有關。界面中顯示的周期數(Cycles)為完成本次DMA所用的Cycle數量,實驗板上采用V5LX85t芯片,且鏈路上采用差分信號傳輸,一個cycle用時為16/1 000 000 ns,由此可計算出傳輸128 B×16×8=16 384 B的數據用時為16×302/1 000 000 ns,速度約為3 390 Mb/s即423 MB/s,分析代碼得出可能是由于存儲及讀取數據的過程會占用一定的時間影響速率,才使得速度沒有達到pcie中x1通道的0.5 Gb/s的峰值帶寬。將來也可根據需求將PCIE硬核配置x2、x4通道,會加快通信速率。
在DMA讀測試中,FPGA向上位機讀數據,并將數據存入另一個RAM中,上位機初始化時向一片地址的緩沖區(qū)內寫入固定的數0x12345678,利用DMA方式讀取該地址的數據,在ChipScope中可以看到寫入的數據都是12345678,如圖7所示。這里由于設定RAM是64 bit的,所以是兩個重復的數字,且由于計算機內采用的是小端存儲,所以顯示的數為78563412。
本系統(tǒng)通過軟件、驅動、硬件的協調設置,實現了基于PCIE總線的高速數據傳輸系統(tǒng),首先通過軟件界面設置讀寫的方式來配置硬件中的DMA狀態(tài)與控制寄存器,然后在硬件代碼中根據寄存器的內容完成單字讀寫或DMA讀寫的過程,最后將測得的數據及速率顯示在軟件界面上。
4 結束語
本文實現的基于PCIE的總線主模式DMA高速數據傳輸系統(tǒng)可以完成上位機與實驗板卡通過PCIE進行單字讀寫或DMA讀寫大量數據,并達到較高的傳輸速率,x1通道速率可穩(wěn)定在400 MB/s左右,為該實驗板將來作為數據采集模塊采集有用數據并提供給上位機分析奠定了基礎。通過測試發(fā)現,在FPGA中利用core_gen生成的RAM還存在一定的缺陷,如容量不夠大、占用芯片資源等問題,將來應替換成板卡上的SDRAM,以此來提高傳輸數據的數量,將該系統(tǒng)用于實際應用中。
參考文獻
[1] 馬鳴錦,朱劍冰,何紅旗,等.PCI、PCI-X和PCI Express的原理及體系結構[M].北京:清華大學大學出版社,2006.
[2] BUDRUK R.PCI Express系統(tǒng)體系結構標準教材[M].田玉敏,王崧,張波,譯.北京:電子工業(yè)出版社,2005.
[3] 張偉達.基于PCI Express的高速數據傳輸系統(tǒng)研究與開發(fā)[J].計算機測量與控制,2009,12(17):2555-2557.
[4] 王嘉良,趙曙光.用FPGA實現PCI-E接口和DMA控制器設計[J].計算機技術與發(fā)展,2011,21(6):181-184.
[5] 任連芳.基于PCI Express總線的數據傳輸與存儲[D].南京:南京理工大學,2010.