《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計(jì)應(yīng)用 > PCI-E總線光纖接口卡的設(shè)計(jì)
PCI-E總線光纖接口卡的設(shè)計(jì)
來源:電子技術(shù)應(yīng)用2014年第4期
溫宇辰, 李明偉, 陳玉龍
(大連理工大學(xué) 電子信息與電氣工程學(xué)部, 遼寧 大連116024)
摘要: 針對遠(yuǎn)距離傳輸必須滿足頻帶寬、抗干擾能力強(qiáng)等特點(diǎn),實(shí)現(xiàn)一種直接光纖高分辨率、高幀率遠(yuǎn)傳監(jiān)控?cái)z像機(jī)的數(shù)據(jù)傳輸設(shè)計(jì)。采用 FPGA為主控器設(shè)計(jì)的PCI Express光纖接口卡,實(shí)現(xiàn)了監(jiān)控?cái)z像機(jī)與計(jì)算機(jī)之間的大量數(shù)據(jù)的實(shí)時(shí)遠(yuǎn)程傳輸。采用Windows DDK開發(fā)工具開發(fā)了高效率的WDM驅(qū)動程序,實(shí)現(xiàn)光纖接口卡在Windows XP系統(tǒng)環(huán)境中能夠穩(wěn)定、可靠地工作。驅(qū)動程序以直接存儲器訪問的傳輸方式將大量數(shù)據(jù)從光纖接口卡發(fā)送到計(jì)算機(jī)內(nèi)的指定內(nèi)存空間,完成驅(qū)動程序與應(yīng)用程序以及光纖接口卡之間指令數(shù)據(jù)的傳輸,設(shè)計(jì)了中斷響應(yīng)程序, 確保實(shí)時(shí)地處理接收到的數(shù)據(jù)。
中圖分類號: TP311.5
文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2014)04-0126-04
Design of fiber-optic interface card based on PCI express bus
Wen Yuchen, Li Mingwei, Chen Yulong
Department of Electronic Information and Electrical Engineering, Dalian University of Technology, Dalian 116024, China
Abstract: Optical fiber is used for mass data transmission in a long distance. This paper realizes a design of data transmission using direct optical fiber for high resolution and high frame surveillance cameras. Wide frequency band and anti-jamming capability are necessary to long distance transmission. In order to transfer mass data between surveillance camera and computer in real time, a PCI Express fiber-optic interface card which adopts FPGA as the main controller is designed. The PCI Express driver based on WDM, which is developed by Windows DDK tools, is stable and reliable in Windows XP operation system. The driver program realizes the result transferring the mass data transmission from fiber-optic card to host memory in DMA operation,completing the instruction data transmission among application program, driver program and fiber-optic card and designing a logical interrupt response in order to process the mass data immediately.
Key words : WDM driver program; PCI Express; direct memory access(DMA); Spartan-6 FPGA

    在高科技研究以及工業(yè)、醫(yī)療、交通、航空等眾多領(lǐng)域中,對高幀率和高分辨率的圖像數(shù)據(jù)需求逐漸加大,例如航天和軍工中高速物體運(yùn)動軌跡的捕捉、3D動漫、視頻定位和測量、高速公路交通監(jiān)控等。然而,連續(xù)的高幀率和高分辨率圖像采集將產(chǎn)生巨大的數(shù)據(jù)量,例如以10 f/s幀率傳輸分辨率為4 928 V×3 280H的視頻圖像時(shí),總線上的數(shù)據(jù)速率高達(dá)1.23 Gb/s;以500 f/s幀率傳輸分辨率為640 V×480 H的視頻圖像時(shí),總線上的數(shù)據(jù)速率也高達(dá)1.18 Gb/s。為了實(shí)現(xiàn)1 Gb/s以上的傳輸速度且滿足實(shí)時(shí)性和長距離傳輸?shù)囊?,選用光纖技術(shù)和PCI Express(簡稱PCI-E)總線技術(shù)設(shè)計(jì)了PCI-E總線光纖接口卡。
 光纖具有頻帶寬、傳輸距離長、損耗低、抗干擾能力強(qiáng)等優(yōu)點(diǎn)[1],適用于大量數(shù)據(jù)的遠(yuǎn)程傳輸。PCI-E總線采用了串行點(diǎn)對點(diǎn)通信技術(shù),使傳輸速率大幅度提高,PCI-E 1.0標(biāo)準(zhǔn)的單通道單向速率高達(dá)2.5 Gb/s,且最大支持32通道[2]。PCI-E 3.0標(biāo)準(zhǔn)單通道單向速率可達(dá)8 Gb/s,是傳輸高速、大數(shù)據(jù)量總線的首選,具有研究和應(yīng)用價(jià)值。
    本文基于Spartan-6芯片設(shè)計(jì)的PCI Express光纖接口卡的驅(qū)動程序,完成的功能有:(1)驅(qū)動程序?qū)饫w接口卡硬件資源的獲取; (2)光纖接口卡能夠?qū)⒋罅繑?shù)據(jù)及時(shí)發(fā)送到計(jì)算機(jī)內(nèi)存中; (3)合理的中斷機(jī)制能夠滿足處理高速圖像的需要; (4)計(jì)算機(jī)可以向光纖接口卡發(fā)送參數(shù)命令。
1 PCI Express接口卡的硬件結(jié)構(gòu)
    PCI Express接口卡基于Xilinx公司的Spartan-6 LTX系列FPGA設(shè)計(jì),完成圖像數(shù)據(jù)收發(fā)、數(shù)據(jù)緩存以及PCI-E協(xié)議等工作,并將采集到的圖像數(shù)據(jù)通過PCI-E總線傳輸給計(jì)算機(jī)。Spartan-6 LTX系列FPGA內(nèi)部包含一個PCI-E端點(diǎn)硬核,完整實(shí)現(xiàn)了PCI-E1.0標(biāo)準(zhǔn)協(xié)議中的數(shù)據(jù)鏈路層和物理層的功能,可以完成1鏈路的PCI-E總線傳輸[3]。光纖接口卡采用單片高性能FPGA設(shè)計(jì),具有系統(tǒng)集成度高、硬件設(shè)計(jì)簡潔且便于擴(kuò)展的特點(diǎn)。末端利用計(jì)算機(jī)對采集的圖像進(jìn)行顯示、存儲以及回放等操作。PCI Express接口卡的硬件結(jié)構(gòu)如圖1所示。
    利用ISE中的IP核生成工具CORE Generator對PCIE端點(diǎn)硬核進(jìn)行定制:設(shè)備ID采用默認(rèn)值,Vendor ID = 0x10EE,Device ID = 0x0007,這是驅(qū)動程序識別該硬件的廠商號和設(shè)備號; 基址寄存器的類型選擇為Memory,開辟一個32 位尋址的1 KB大小的存儲器空間;中斷設(shè)置為采用INTA的傳統(tǒng)中斷類型。
   基址寄存器設(shè)計(jì)是實(shí)現(xiàn)接口卡功能關(guān)鍵內(nèi)容,按照偏移地址將1 KB的存儲器空間劃分成功能不同的寄存器,部分定義如表1所示。

2 PCI Express接口卡的驅(qū)動程序
2.1 開發(fā)工具Windows DDK簡介

    Windows DDK是微軟提供的驅(qū)動程序開發(fā)工具包,包括了設(shè)備驅(qū)動開發(fā)的文檔、頭文件和庫文件、調(diào)試工具和程序示例。先將Windows DDK導(dǎo)入VC++軟件開發(fā)工具,然后用C語言編寫驅(qū)動程序代碼,編譯后再用Windows DDK中的調(diào)試軟件調(diào)試,生成可執(zhí)行的驅(qū)動程序。使用Windows DDK能夠開發(fā)出真正意義上的核心態(tài)驅(qū)動程序,它所開發(fā)的驅(qū)動程序效率也是最高的,但必須詳細(xì)了解操作系統(tǒng)的內(nèi)核工作方式,開發(fā)難度較大[4]。
    常用開發(fā)工具還有WinDriver和DriverStudio,為了獲得最大的驅(qū)動程序效率,選擇采用Windows DDK來設(shè)計(jì)PCI Express接口卡的驅(qū)動程序。
2.2 WDM啟動程序的結(jié)構(gòu)
    通常WDM驅(qū)動程序都是基于分層的結(jié)構(gòu)設(shè)計(jì),由功能驅(qū)動函數(shù)、總線驅(qū)動程序和過濾器驅(qū)動程序三部分組成。完成一個設(shè)備的操作,至少要有兩個驅(qū)動設(shè)備共同完成[5],一個是總線驅(qū)動程序生成的物理設(shè)備對象(PDO),另一個是功能驅(qū)動程序生成的功能設(shè)備對象(FDO)。
 Windows XP系統(tǒng)檢測到PCI-E接口卡插入主板卡槽時(shí),總線驅(qū)動會自動創(chuàng)建出一個PDO。但是PDO不能單獨(dú)操作設(shè)備,還需要將實(shí)現(xiàn)功能的FDO掛載在總線驅(qū)動生成的PDO上,即相當(dāng)于功能驅(qū)動程序掛載到了指定的硬件設(shè)備上[6],實(shí)現(xiàn)驅(qū)動程序?qū)τ布O(shè)備的控制。
2.3 接口卡發(fā)送數(shù)據(jù)
    為了提高接口卡的傳輸效率,采用DMA的傳輸方式將圖像數(shù)據(jù)通過PCI-E總線發(fā)送到計(jì)算機(jī)。在DMA傳輸過程中,PCI-E接口卡作為DMA傳輸?shù)闹骺仄?,?shù)據(jù)的傳輸速度基本由PCI-E總線的傳輸速度決定[7]。
2.3.1 獲取接口卡的資源信息
    接口卡發(fā)送圖像數(shù)據(jù)之前,驅(qū)動程序要將DMA傳輸?shù)哪繕?biāo)地址以及數(shù)據(jù)負(fù)載的大小發(fā)送給接口卡,驅(qū)動程序需要先獲取接口卡上的硬件資源,如接口卡端點(diǎn)內(nèi)存的物理地址等。
    首先根據(jù)設(shè)備類型和設(shè)備擴(kuò)展的大小,利用函數(shù)IoCreateDevice生成并初始化一個FDO;其次利用函數(shù)IoAttachDeviceToDeviceStack將生成的FDO附加在系統(tǒng)生成的PDO上;然后向PDO轉(zhuǎn)發(fā)一個IRP_MN_START_DEVICE類型的I/O 請求包(IRP),PDO會根據(jù)設(shè)備的類型自動枚舉該設(shè)備的所有資源。為了使FDO能夠得到底層PDO處理IRP的結(jié)果,需要同時(shí)將一個同步事件發(fā)送給底層PDO。PDO處理完IRP后立刻激發(fā)同步事件,通知FDO查詢此次IRP的結(jié)果; PDO完成了對IRP_
MN_START_DEVICE命令的響應(yīng)后,將獲取到的接口卡設(shè)備資源存儲在IRP中名為IO_STACK_LOCATION結(jié)構(gòu)的設(shè)備堆棧中[8],流程如圖2所示。

    利用函數(shù)IoGetCurrentIrpStackLocation可以獲得該IO_STACK_LOCATION結(jié)構(gòu),主要包含接口卡的中斷信息、端點(diǎn)內(nèi)存寄存器資源以及接口卡的物理地址等設(shè)備硬件資源。
2.3.2 分配內(nèi)存空間并實(shí)現(xiàn)乒乓操作
    為了盡可能提高計(jì)算機(jī)內(nèi)存資源利用率,驅(qū)動程序分配的內(nèi)存空間大小與每次DMA傳輸?shù)膱D像數(shù)據(jù)大小需保持一致。先利用函數(shù)IoGetDmaAdapter獲取一個DMA適配器,包含了開辟內(nèi)存空間的函數(shù)AllocateCommonBuffer,調(diào)用此函數(shù)獲得一段指定大小的連續(xù)物理內(nèi)存,保存物理內(nèi)存的邏輯地址作為DMA傳輸?shù)哪繕?biāo)地址。
    預(yù)先在計(jì)算機(jī)中分配了多塊內(nèi)存空間,使計(jì)算機(jī)可以在處理一塊寫滿了圖像數(shù)據(jù)的內(nèi)存緩沖區(qū)的同時(shí),用另一塊閑置的內(nèi)存緩沖區(qū)接收DMA傳輸?shù)膱D像數(shù)據(jù),從而實(shí)現(xiàn)乒乓操作,提高傳輸效率[9]。
    接收到DMA傳輸開始的指令后,PCI-E接口卡會根據(jù)分配好的內(nèi)存空間地址和設(shè)定好的DMA傳輸負(fù)載長度,不斷地向計(jì)算機(jī)發(fā)送帶有圖像數(shù)據(jù)的TLPs數(shù)據(jù)包[10]。每次DMA傳輸結(jié)束后,驅(qū)動程序都會根據(jù)是否希望繼續(xù)進(jìn)行DMA傳輸選擇輪轉(zhuǎn)一塊新的內(nèi)存地址發(fā)送給接口卡或者釋放相關(guān)資源。DMA傳輸操作流程圖如圖3所示。

2.4 驅(qū)動程序的中斷處理
    驅(qū)動程序接收到PCI-E接口卡產(chǎn)生的中斷信號,表明PCI-E接口卡已經(jīng)向計(jì)算機(jī)指定的內(nèi)存空間完成了一次DMA傳輸,要通知應(yīng)用層程序?qū)?nèi)存中的數(shù)據(jù)進(jìn)行訪問,完成顯示、存儲等功能。先利用函數(shù)IoConnectInterrupt將中斷例程與設(shè)備產(chǎn)生的中斷信號綁定。根據(jù)計(jì)算機(jī)中斷優(yōu)先級的規(guī)則,硬件中斷會得到操作系統(tǒng)的優(yōu)先響應(yīng)[11]。
    計(jì)算機(jī)操作系統(tǒng)檢測到PCI-E接口卡的中斷信號來臨時(shí),立即進(jìn)入中斷服務(wù)例程(ISR)。由于接口卡采用的傳統(tǒng)中斷是一種電平中斷信號,還需要驅(qū)動程序在ISR中進(jìn)一步完成對中斷來源的判斷和清除中斷的操作。
    采用同步事件方式實(shí)現(xiàn)中斷信號的同步處理,先在應(yīng)用程序中定義一個與驅(qū)動程序共享的同步事件,并通過DeviceIoControl函數(shù)把該事件句柄傳遞給驅(qū)動程序,等待事件觸發(fā)之后再進(jìn)行讀數(shù)據(jù)操作。驅(qū)動程序根據(jù)所傳遞的這個事件句柄創(chuàng)建一個相應(yīng)的內(nèi)核事件[12]。中斷發(fā)生時(shí)驅(qū)動程序調(diào)用KeSetEvent函數(shù)將同步事件設(shè)置為激發(fā)態(tài),通知應(yīng)用程序中斷已經(jīng)發(fā)生。盡量減少ISR程序的運(yùn)行時(shí)間,將激發(fā)同步事件的動作設(shè)計(jì)發(fā)生在擁有較低中斷等級的延遲過程調(diào)用例程(DPC)中[13]。中斷處理流程如圖4所示。

 

 

2.5 驅(qū)動程序向接口卡發(fā)送指令
    指令發(fā)送可以分為兩個子過程,首先應(yīng)用程序與驅(qū)動程序?qū)崿F(xiàn)交互,然后驅(qū)動程序再根據(jù)交互獲得的參數(shù),修改PCI-E接口卡端點(diǎn)內(nèi)存中寄存器的值[14]。
 用函數(shù)IoRegisterDeviceInterface將一個名為GUID的128位二進(jìn)制數(shù)字標(biāo)識符與PDO綁定在一起。應(yīng)用程序利用函數(shù)OpenDeviceByGuid獲取被綁定的驅(qū)動程序的設(shè)備句柄,再利用這個設(shè)備句柄和函數(shù)DeviceIoControl完成應(yīng)用程序與驅(qū)動程序之間的通信與交互。DeviceIoControl函數(shù)可以將指定字節(jié)數(shù)量的數(shù)據(jù)傳入驅(qū)動程序,同時(shí)也可以接收驅(qū)動程序返回的數(shù)據(jù)。
    下面舉例給出一個發(fā)送光纖相機(jī)幀的行大小的參數(shù)指令代碼:
    #define  IOCTL_LINE    CTL_CODE (// 定義控制碼
    FILE_DEVICE_UNKNOWN,//對象類型0x828,//驅(qū)動程序定義的IOCTL碼METHOD_BUFFERED, //操作模式FILE_
ANY_ACCESS)    // 訪問權(quán)限
    hDevice = OpenDeviceByGuid(// 打開驅(qū)動
    (LPGUID) &GuidDriver);     //接口卡設(shè)備句柄
    ULONG  value=0;    //初始化輸出緩沖區(qū)
    value = (m_Line<<16)|0x03; //光纖相機(jī)幀的行大小
    DeviceIoControl          (//發(fā)送相機(jī)參數(shù)命令到驅(qū)動程序
    hDevice, //上文打開設(shè)備后返回的句柄
    IOCTL_LINE //控制代碼名稱
    &value  //輸入緩沖區(qū)地址
    sizeof(value)    //輸入緩沖區(qū)大小
    NULL,//返回緩沖區(qū)地址
    NULL 0  //返回緩沖區(qū)大小為0
    &nOutput    // 記錄返回的數(shù)據(jù)大小
    NULL)// 默認(rèn)為NULL
    &hellip;
    switch (ioStack->Parameters.DeviceIoControl
    .IoControlCode)      //    驅(qū)動程序獲取IOCTL碼
    case     IOCTL_LINE:  // 驅(qū)動程序接收到命令
    address=(ULONG)deviceExtension->
    MemoryStart[FPGA]+LINE;  //設(shè)定PIO傳輸?shù)哪繕?biāo)地址
    WRITE_REGISTER_ULONG((PULONG)address,
    *pBuffer);                          //寫接口卡寄存器
    應(yīng)用層將相機(jī)參數(shù)和指令一同發(fā)送給了驅(qū)動程序,驅(qū)動程序利用在獲取PCI-E接口卡硬件資源時(shí),保存接口卡物理地址和端點(diǎn)內(nèi)存的寄存器偏移地址,完成對寄存器中數(shù)據(jù)的修改,實(shí)現(xiàn)對前端相機(jī)的控制。
    利用FPGA內(nèi)的計(jì)數(shù)器不斷產(chǎn)生數(shù)據(jù),使PCI-E接口卡不停地進(jìn)行DMA傳輸。應(yīng)用程序使用QueryPerformanceFrequency獲取處理器頻率,使用QueryPerformanceCounter查詢定時(shí)器計(jì)數(shù)值。經(jīng)多次反復(fù)測試,系統(tǒng)實(shí)際最大有效傳輸速度為1.5 Gb/s,高于利用DriverStudio工具開發(fā)的驅(qū)動程序?qū)崿F(xiàn)的720 Mb/s有效傳輸速度[15]。
    PCI-E總線采用8b/10b編碼, 因此使用1.0標(biāo)準(zhǔn)的PCI-E總線的理論有效輸速度為2.0 Gb/s[16],分析實(shí)際有效傳輸速度沒能達(dá)到理論值的原因是: (1)驅(qū)動程序基于Windows XP系統(tǒng)設(shè)計(jì),該操作系統(tǒng)不支持MSI中斷方式,在響應(yīng)DMA傳輸?shù)膫鹘y(tǒng)中斷時(shí)會占用一定時(shí)間; (2)發(fā)起DMA傳輸前需要設(shè)置FPGA內(nèi)相關(guān)寄存器,這也需要一定的時(shí)間。
    經(jīng)安裝光纖相機(jī)后測試,能夠清晰、流暢地顯示圖像大小為1 280 H&times;720 V、幀率為120 f/s、傳輸速率為842 Mb/s的圖像數(shù)據(jù)。驅(qū)動程序工作穩(wěn)定,并且可滿足多種數(shù)據(jù)類型的傳輸。
參考文獻(xiàn)
[1] 吳德明.光纖通信原理與技術(shù)[M].北京:科學(xué)出版社, 2004.
[2] 王齊.PCI Express體系結(jié)構(gòu)導(dǎo)讀[M].北京:機(jī)械工業(yè)出版社,2010.
[3] XILINX. Xilinx solutions guide for PCI express user guide [EB/OL].[2009-09-16]. Http://www.xilinx.com/.
[4] 李忠輝,張志文.PCI設(shè)備驅(qū)動程序的開發(fā)和應(yīng)用[J].西安工業(yè)學(xué)院學(xué)報(bào),2005,25(1):8-11.
[5] 張帆,史彩成. Windows驅(qū)動開發(fā)技術(shù)形式詳解[M]. 北京:電子工業(yè)出版社,2008.
[6] 蹇紅梅,居錦武,王蘭英. Windows設(shè)備驅(qū)動程序的開發(fā)[J]. 四川理工學(xué)院學(xué)報(bào)(自然科學(xué)版), 2007(4):11-13.
[7] 席華偉.基于Verilog語言的DMA控制器的設(shè)計(jì)與仿真[D]. 西安:西安電子科技大學(xué),2007.
[8] 武安河.Windows 2000/XP WDM設(shè)備驅(qū)動程序開發(fā)[M]. 北京:電子工業(yè)出版社,2003.
[9] 何柳,陳勇,吳斌.PCI/PCI-E高速實(shí)時(shí)DMA傳輸驅(qū)動設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2012,38(11):143-145.
[10] 董永吉,陳庶樵,李玉峰,等.Xilinx PCI-Express核總線接口設(shè)計(jì)與實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,2011,37(8):135-138.
[11] 田澤, 劉娟, 王琦卉.基于WDM的PCIE驅(qū)動設(shè)計(jì)和實(shí)現(xiàn)[J]. 軟件導(dǎo)刊,2010,9(4):9-10.
[12] 司剛,付少鋒,周利華.WDM驅(qū)動程序中設(shè)備事件通知技術(shù)研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2006,16(4):144-146.
[13] 梁國龍,何昕,魏仲慧,等.PCIE數(shù)據(jù)采集系統(tǒng)的驅(qū)動程序開發(fā)[J].計(jì)算機(jī)工程與應(yīng)用,2009,45(31):63-65.
[14] Peng Yu, Li Bo, Liu Datong, et al. A High Speed DMA transaction method for PCI express devices[J]. Journal of Electronic Science and Technology of China, 2009,7(4):380-384.
[15] 王維,蔣景宏,劉垚.基于PCI Express總線光纖采集卡WDM驅(qū)動程序設(shè)計(jì)[J].計(jì)算機(jī)測量與控制,2013,21(1):272-275.
[16] PCI-SIG. PCI Express card electromechanical specification revision 1.0[S].2002.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。