摘 要:隨著高速數(shù)據(jù)采集設備傳輸帶寬的日益提高,開發(fā)者需要采用新的計算機總線進行數(shù)據(jù)傳輸。這里敘述了使用EP2SGX90系列FPGA完成PCI-Express協(xié)議轉換,多種DMA工作方式及相關寄存器的作用。以鏈式DMA傳輸方式為例,詳細介紹該傳輸方式下的寄存器設置及在驅動程序中的實現(xiàn)范例。實驗表明,用FPGA實現(xiàn)協(xié)議轉換,總線持續(xù)傳輸速率最高可以達到1.2 Gb/s,滿足大多數(shù)高速數(shù)據(jù)采集設備的要求。在此摒棄了采用專用總線接口芯片的傳統(tǒng)方法,將開發(fā)者的邏輯設計和總線協(xié)議轉換放到同一個FPGA芯片中,不但節(jié)省了硬件成本,利用其可編程特性,大大提高了設計可擴展性,同樣的硬件很容易完成由PCIE 1.0到PCIE 2.0的升級。
關鍵詞:PCIE總線; 可編程器件; DMA傳輸; 高速數(shù)據(jù)采集設備
中圖分類號:TN40; TP336 文獻標識碼:A
文章編號:1004-373X(2010)14-0109-03
Application of FPGA in PCI Express Bus Interface
SHEN Hui, ZHANG Ping
(Nanjing Institute of Electronic Technology, Nanjing 210000, China)
Abstract: Along with increase of transmission bandwidth of the high-speed data acquisition systems, the designers have to use the new computer bus to complete the data transmission. The implementation of PCI-Express protocol transform with aplication of FPGA of EP2SGX90 series, the functions of multiple DMA operation modes and the relative register are described. Taking the chained transmissin mode as an example, the register setup in the chained DMA transmission mode and the implementation in the driver are introduced in detail. By this means, the continuous transmission rate of the bus is up to 1.2 GB. The experiment indicates that it can be applied to mass of data acquisition designs. One FPGA chip is adopted to accomplish the logic control and protocol transform of PCI-Express instead of the special bus interface chip. It lowers the design cost and improves the expandability of design. It is is for the same hardware to upgrade the PCIE1.0 to PCIE2.0.
Keywords: PCIE bus; FPGA; DMA transfer; high-speed data acquisition equipment
0 引 言
PCIE(PCI express)是用來互聯(lián)諸如計算機和通信平臺應用中外圍設備的第三代高性能I/O總線。PCIE體系結構繼承了第二代總線體系結構最有用的特點,采用與PCI相同的使用模型和讀/寫通信模型,支持各種常見的事務。其存儲器、I/O和配置地址空間與PCI的地址空間相同。由于地址空間模型沒有變化,所以現(xiàn)有的OS和驅動軟件無需進行修改就可以在PCIE系統(tǒng)上運行[1]。
PCIE是串行協(xié)議,與原有的PCI并行總線相比,它沒有大量的數(shù)據(jù)和控制線,對于硬件電路設計者來說,省去了很多硬件設計工作[2]。PCIE的傳輸速度遠遠大于PCI總線,PCIE 1.1版本單個鏈路的單向吞吐量能達到250 MB/s。對于需要與主機進行大容量傳輸?shù)南到y(tǒng)來說,該總線標準的優(yōu)勢是非常明顯的[3-4]。
由于PCIE總線硬件設計簡單,吞吐量大,軟件向下兼容,只要找到合適的總線接口芯片,很容易將現(xiàn)有的PCI總線設備升級為PCI Express設備。Altera公司最新推出的EP2SGX90系列的芯片,給用戶提供了PCIE接口IP核。本文將結合實際的應用,詳細介紹該IP核的使用情況,包括寄存器設置,DMA操作等。
1 功能描述及參數(shù)設置
按照PCIE協(xié)議的要求,該FPGA的IP核也采用三層體系結構,即傳輸層、數(shù)據(jù)鏈路層和物理層。這三層功能模塊完成了PCIE的協(xié)議轉換,在傳輸層上給開發(fā)人員提供了非常豐富的接口。開發(fā)人員的所有開發(fā),包括DMA傳輸?shù)榷际窃趥鬏攲右陨线M行的[5]。
傳輸層(transaction layer):完成TLP(數(shù)據(jù)傳輸包)的收發(fā),含有虛擬信道(VC)緩沖區(qū),具有端口仲裁、VC仲裁、流控制、數(shù)據(jù)重新排序和數(shù)據(jù)校驗等功能。
數(shù)據(jù)鏈路層(data link layer):數(shù)據(jù)鏈路層的主要功能是保證在各鏈路上發(fā)送和接收數(shù)據(jù)包時數(shù)據(jù)的完整性。在接收端,對數(shù)據(jù)進行嚴格的CRC校驗,如果有錯誤,會給發(fā)送方返回1個NAK信號。發(fā)送端具有重傳緩沖區(qū),如果收到NAK信號,則把數(shù)據(jù)重新發(fā)送1次。
物理層(physical layer):對于發(fā)送端,接收數(shù)據(jù)鏈路層的數(shù)據(jù)包,把這些數(shù)據(jù)進行8 b/10 b編碼,送到串行發(fā)送器上;對于接收端則剛好相反,收到串行碼后,先解碼,然后送給數(shù)據(jù)鏈路層。
在生成PCIE的IP核時,至少選擇2個存儲區(qū),一個是BAR[1:0],用作用戶開發(fā)板的擴展存儲區(qū)用;還有一個是BAR2,下面所有的寄存器操作都是基于該地址的。新生成的IP核不帶有DMA功能,但是在工程文件夾下面有一個xxx examples(xxx代表工程名稱)的文件夾,文件夾里有簡單DMA和鏈式DMA的例子代碼,開發(fā)者只需要對這些代碼進行修改,就能開發(fā)出適合自己的DMA功能模塊。
2 簡單DMA
該DMA傳輸模式相對比較簡單,只需要對相應的寄存器進行設置即可完成,DMA傳輸步驟如下所示,每進行1次DMA傳輸,都需要按照下面的步驟進行1次設置。下面所述的偏移量都是相對于BAR2地址[5]。
(1) 設置偏移量為0x00和0x04的寄存器,寫入DMA傳輸?shù)闹鳈C端地址;
(2) 設置偏移量為0x14的寄存器,寫入DMA傳輸?shù)腜CIE端點地址;
(3) 在偏移量為0x08的寄存器中寫入本次DMA傳輸?shù)拈L度,以字節(jié)為單位;
(4) 設置偏移量為0x0C的寄存器,設置DMA傳輸?shù)膶傩?,對該寄存器的寫操作將啟動本次DMA傳輸;
(5) 讀取0x0C的寄存器DMA傳輸狀態(tài)位,察看本次DMA是否完成。
3 鏈式DMA
鏈式DMA是一種效率遠遠高于簡單DMA的傳輸方式,它只需要1次啟動操作,就可以完成多次DMA傳輸。這里將結合實際使用情況,詳細介紹鏈式DMA的傳輸過程。
3.1 描述符表
實現(xiàn)鏈式DMA傳輸時,需要開發(fā)人員在主機內存中開辟一塊空間,用來存儲描述符表,它由一個表頭和多個描述符組成,其中每一個描述符對應一次DMA操作。用戶根據(jù)自己的需求填寫該描述符表,關于該描述符表的詳細說明如表1和表2所示[6-7]。
控制區(qū)域中含有一些控制信息,其中第16位用來控制傳輸方向,為0是DMA寫,為1是DMA讀,這里的讀/寫是以主機端為參考的,如果以PCIE核為參考,方向剛好相反。第18位用來使能DMA傳輸計數(shù),如果該位使能為1,那么在DMA傳輸過程中,PCIE核每完成1次DMA操作,都會進行1次計數(shù)操作,然后把這個計數(shù)結果傳送給主機,主機把這個結果填寫到描述符表的RCLAST字段中。
表大小是指本次鏈式DMA操作對應的描述符個數(shù),每個描述符對應一次DMA操作。
RCLAST是一個計數(shù)單元,它有兩個作用,在鏈式DMA傳輸前,表示還有多少個DMA操作等待傳輸,由于它是從0開始計數(shù)的,所以這個值等于表大小減1。還有一個重要作用是在鏈式DMA傳輸過程中,用來表示鏈式DMA傳輸?shù)臓顟B(tài)。如上所述,如果控制區(qū)域的第18位設置為1,那么每完成1次DMA操作,主機都會更新這個計數(shù)器。當計數(shù)器的數(shù)值(也是從0開始計數(shù)的)等于前面設置的期望傳輸?shù)腄MA次數(shù),就表示鏈式DMA傳輸操作結束。開發(fā)人員可以用這個狀態(tài)單元來察看本次傳輸是否結束,從而開始一個新的傳輸周期。
表1 描述符表表頭
31 16 15 0
控制區(qū)域表大小
描述符表高32位基地址
描述符表低32位基地址
保留RCLAST
表2 描述符
31222116150
保留控制區(qū)域DMA長度
PCIE端點地址
主機端高32位地址
主機端低32位地址
DMA長度用來設置本描述符對應的DMA傳輸?shù)拈L度,是以32位為單位的。主機端地址用來指示數(shù)據(jù)存放存放的位置。
3.2 實現(xiàn)范例
根據(jù)上面介紹的描述符表,下面給出一個鏈式DMA讀的驅動程序例子。首先生成一個描述符表,然后把描述符表表頭的4個字段的內容分別寫入BAR2地址偏移量為0x0,0x4,0x8和0xC寄存器中。寫完后即開始此次鏈式DMA讀傳輸,while循環(huán)用于等待鏈式DMA結束。從下面的代碼可以看出,2個描述符對應2次DMA操作[8-9]。
#define DMA BLOCK 16
/*描述符表頭*/
DmaTableVirtualAddress[0]=0x50002;
DmaTableVirtualAddress[1]=DmaTablePhysicalAddress.HighPart;
DmaTableVirtualAddress[2]=DmaTablePhysicalAddress.LowPart;
DmaTableVirtualAddress[3]=0x1;
/*2個描述符*/
DmaTableVirtualAddress[4]=DMA BLOCK;
DmaTableVirtualAddress[5]=0;
DmaTableVirtualAddress[6]= DmaBufferPhysicalAddress.HighPart;
DmaTableVirtualAddress[7]=DmaBufferPhysicalAddress.LowPart;
DmaTableVirtualAddress[8]=DMA BLOCK;
DmaTableVirtualAddress[9]=0;
DmaTableVirtualAddress[10]=DmaBufferPhysicalAddress.HighPart;;
DmaTableVirtualAddress[11]=DmaBufferPhysicalAddress.LowPart+DMA BLOCK*4;
/*填寫寄存器,啟動DMA傳輸*/
WRITE REGISTER ULONG((PULONG)(RegBase+0x0),DmaTableVirtualAddress[0]);
WRITE REGISTER ULONG((PULONG)(RegBase+0x4),DmaTableVirtualAddress[1]);
WRITE REGISTER ULONG((PULONG)(RegBase+0x8),DmaTableVirtualAddress[2]);
WRITE REGISTER ULONG((PULONG)(RegBase+0xc),DmaTableVirtualAddress[3]);
while(dx->DmaTableVirtualAddress[3]!=0x44040001)
{
}
圖1是用SignalTap工具獲取的鏈式DMA讀時序圖。PCIE核接收tx req0請求信號,然后給出一個tx ack0,同時將tx dv0置為有效,該信號套住的TX Data就是需要讀取的有效數(shù)據(jù)[10]。在每次DMA結束之后,PCIE核都會用同樣的控制邏輯給主機傳送1個已完成DMA次數(shù)的狀態(tài)字,如圖1中的44040000h。
圖1 鏈式DMA傳輸時序圖
4 性能測試
在做總線性能測試時,采用鏈式DMA傳輸方式,共4個描述符表。根據(jù)實際使用的PCIE總線通道數(shù)和DMA長度的不同,實際測試得到的總線速度也不同,表3給出了參考數(shù)據(jù)。
表3 實測數(shù)據(jù)
PCIE通道數(shù)
48
DMA長度 /B8 19216 38432 7688 19216 38432 768
總線傳輸速率 /(MB/s)5005806509801 0501 200
5 結 語
使用FPGA來設計PCIE總線擴展卡,可以省去專用的PCIE接口芯片,降低了硬件設計成本,提高了硬件的集成度。利用FPGA的可編程特性,大大提高了設計靈活性、適應性和可擴展性。PCIE總線提供了高速、獨享的數(shù)據(jù)交換通道,確保在大數(shù)據(jù)量的數(shù)據(jù)交換時不會出現(xiàn)瓶頸,而且作為新一代總線,它使系統(tǒng)在獲得更高性能的同時,具有了良好的升級性。
參考文獻
[1]田玉敏,王崧,張波.PCI Express系統(tǒng)體系結構標準教材[M].北京:電子工業(yè)出版社,2005.
[2]PCI Special Interest Group. PCI Express Base Specification Revision 1.0a[EB/OL]. [ 2009-10-16] . http://netyi.net/Book.
[3]PCI Special Interest Group.PCI Local Bus Specification 2.2[EB/OL]. [ 1998-12-02] . http://ftp.sandpile.org/docs/intel/PCI.htm.
[4]李貴山,戚得虎.PCI局部總線開發(fā)者指南[M].西安:西安電子科技大學出版社,1997.
[5]Altera Corporation.PCI Express Compiler User Guide 9.1[EB/OL]. [ 2010-04-03] . http://altera.com.cn.
[6]Chris Cant.Windows WDM設備驅動程序開發(fā)指南[M].北京:機械工業(yè)出版社,2001.
[7]ONEY Waher. Programming the Microsoft Windows Driver Model[M]. USA: Micorsoft, 2003.
[8]張惠娟,周利華,翟鴻嗚.Windows環(huán)境下的設備驅動程序設計[M].西安:西安電子科技大學出版社,2002.
[9]Microsoft. DDK Document[ M] . USA: Microsoft Press, 2000.
[10]姜立冬.VHDL語言程序設計及應用[M].北京:北京郵電大學出版社,2001.