摘要:介紹了采用PCI9054實現PCI接口數據采集卡的設計方案及實現,其中包括從模式下單周期讀寫和主模式下DMA的實現。結合開發實例,介紹了如何開發PCI接口的DMA驅動程序。
關鍵詞:PCI;單周期讀寫;DMA;驅動
中圖分類號:TP274文獻標識碼:A文章編號:1009-3044(2009)26-7520-02
PCI9054 Data Acquisition Card Based on the Design and Implementation
WANG Song-tao
(Chinese Academy of air-to-air missile, Luoyang 471009, China)
Abstract: This paper introduces the realization of PCI9054 data acquisition card PCI interface design and implementation,including from the single-cycle read and write mode and the main mode of realization of DMA.Combined with the development of examples of how the development of PCI interface DMA driver.
Key words: PCI; single-cycle read and write; DMA; driver
高速數據采集在嵌入式系統、工控領域中有廣泛的應用。采集的數據需要和存儲陣列或者數據處理模塊進行互連。所以標準的、高速的總線選取顯得尤為重要。目前PCI接口的開發方式主要有兩種:一是使用專用的PCI 接口芯片,例如PLX公司的9054,AMCC公司的S593X等;二是使用CPLD/FPGA,自己開發或采用FPGA廠家提供的IPcore實現PCI接口。如果使用第一種方式,用戶可能只會用到專用芯片的一部分功能,會造成資源的浪費,并且PCI接口芯片面積比較大,會給密集型板卡的布線帶來困難。而使用第二種方式則有如下兩個優點:一是設計者可以根據自己的需要開發出PCI接口相應的功能;二是設計者可以將PCI接口宏模塊與用戶邏輯集成在一塊FPGA中,并且可以在頂層通過仿真來驗證PCI接口及用戶邏輯的正確性,這樣可以提高調試速度,縮短開發周期,降低功耗和成本,提高電路板的集成度和性能。本文將詳細討論基于FPGA PCI接口設計,主要包括基于FPGA PCIcore的PCI接口的實現和PCI驅動程序的開發 。
1 存儲器硬件結構介紹及芯片的選型
本板卡是一個高速數據采集板卡AD板卡由高速AD和FPGA、PCI9054組成。其硬件結構如圖所示。
FPGA為整個板卡的控制核心。板卡的控制核心芯片采用Altera公司的EP2 S30 F672C5芯片,它屬于STRA TIXⅡ系列,適合復雜時序邏輯的設計及高速數據的傳輸緩存,也完全適合用PCI IPcore實現PCI接口功能。FPGA實現的主要模塊包括PCI接口模塊、讀FIFO、寫FIFO、接口控制模塊。其中PCI接口實現的功能如下:采數據時,主機通過PCI接口實時存儲,主機通過PCI接口回顯數據波形,判斷數據的有效性;采完數據后,主機通過PCI接口讀回數據并存儲在硬盤中。讀寫FIFO實現異步時鐘同步。
2 PCI模式的讀和寫
2.1 PCI IP core的選擇
Altera 的IP核包括四種類型:PCI_MT64,PCI_MT32,PCI_ T64和PCI_T32。由于我們設計的是32位PCI,并且DMA 控制器必須工作在主模式下,因此選擇了PCI_MT32。
2.2 從模式單周讀寫的實現
在開發PCI接口初期,實現了PCI 從模式下單周讀寫,其時序仿真圖如圖2所示。
周期讀寫適合少量數據傳輸,在第1節中提到的通過PCI接口發命令和地址以及下文將要提到的DMA寄存器的設置都是通過從模式下單周期讀寫實現的。
2.3 主模式下DMA的實現
針對高速傳輸數率的要求,實現了基于PCI_MT32主模式下的DMA傳輸方式。DMA模式是PCI_MT32配合自主設計的DMA控制器來實現的,所以DMA控制器是整個設計的關鍵。于 PCI_MT32沒有DMA控制器,必須自己在 FPGA里面實現DMA控制器。DMA控制器由DMA寄存器、DMA時序狀態機組成。DMA寄存器是主機控制DMA的窗口。DMA狀態機是控制PCI總線數據傳輸的核心,其結構框圖如圖3所示 。
PCI9054是一款高性能的橋接芯片,它把復雜的PCI協議(CPCI與PCI軟件協議一致)轉化為簡單的局部端協議。在設計中它是板卡與主機通信的橋梁。本設計實現了從模式的讀和寫。從模式的寫過程為主機(上層軟件配合驅動程序)把數據通過CPCI總線寫入PCI9054的FIFO,PCI9054檢測到數據后發動局部端總線周期把數據寫出;從模式的讀過程為主機向PCI9054發出地址和讀請求,PCI9054從局部端讀數,然后驅動給主機。由于PCI協議完全得到實現,這里我們只要關心其局部端操作時序的實現。PCI9054有三種局部總線接口模式(M,C,J),本設計選用了C模式,數據線地址線不復用。
·C模式局部端接口所采用的信號如下:
·LCLK:局部端時鐘,輸入信號,本設計時鐘由FPGA驅動,時鐘速率50M;
·LHOLD:局部總線請求,由PCI9054驅動;
·LHOLDA:總線確認信號,由FPGA驅動;
·/ADS:一次讀寫周期的發起信號,由PCI9054發起;
·/BLAST:突發模式的最后一個數據指示,由PCI9054驅動;
·LW/R:讀寫信號,由PCI9054驅動;
·LA[31:2]:地址總線,由于設計采用數據包分發的方式,地址信息隱藏在數據包的首部,所以LA不用;
·LD[31:0]:數據總線;
·/BTERM:持續突發終止信號,由FPGA驅動;
·/READY:當次操作完成信號,由FPGA驅動,若有效則表示可以進行下一個傳送;否則產生等待信號。/READY信號的使用接口協議實現的關鍵。
FPGA與PCI9054的信號連接如圖4所示。
PCI9054的操作時序比較簡單,這里不再詳細分析,不突發的時序有下面三個過程:
1)當主機發起數據傳輸,PCI9054發起LHOLD請求局部端總線控制權,FPGA 有效LHOLDA,允許PCI9054發起操作;
2)檢測到/ADS信號為低時,判斷讀寫操作,如果是讀,檢測讀FIFO是否為空,不為空則拉低/READY,同時驅動數據,數據將在下一周期有效;為空則驅動/READY為高,進入等待。如果是寫,檢測寫FIFO是否為滿,不為滿則拉低/READY,在下一周期從LD上取數據存入FIFO,否則驅動/READY為高,進入等待。
3)PCI9054檢測到/READY為高,進入等待,直到/READY信號為低,此時如果還有數據要發送,回到第二步。
PCI9054支持4字突發以及無限突發模式,這通過設置PCI9054的LBRD0/LBRD1寄存器來實現。突發可以提高局部端接口速度,時序上沒太大區別,多了檢測/BLAST信號及在合適的時候驅動/BTERM,限于篇幅,這里不再贅述。
3 PCI 驅動程序開發
3.1 WDM 驅動程序的工作原理
在 Win2000下,應用程序直接訪問硬件設備是受限制的。為了使用戶應用程序能對硬件資源進行存取,我們開發了工作在內核模式下的PCI驅動程序。WDM模型(Window s Driver Mo del)是現在流行的驅動程序設計的一種構架。我們選用Numega公司的Driver Works來開發運行在 Win2000下的WDM 模式PCI設備驅動程序。在開機或者是掃描即插即用硬件時,總線驅動程序枚舉總線上的設備,并為設備創建一個PDO(Physical Device Object),通知PnP管理器。當PnP管理器發現一個新加入的PDO,就向總線驅動程序發送一個IRP以獲取標識這個設備的符號。PnP管理器通過這個符號參考注冊表以確定這個設備需要哪個驅動程序,接著PnP管理器調用其Ad2dDevice,AddDevice例程創建功能設備對象并將其連入設備堆棧。此后PnP管理器將為所有的設備驅動程序分配資源,一旦資源分配確定,PnP管理器通過向設備發送一個帶有IRP_MN _STAR T_D EVICE 次功能代碼的PnP請求來通知設備。此PnP請求的派遣例程獲分配資源,此后其他派遣例程就可以對獲得的資源進行處理。分配了資源的驅動程序接下來就可以處理其他的IRP,包括對硬件資源存取的IRP。
3.2 驅動開發實例
3.2.1 普通讀寫模式
普通讀寫過程的關鍵是驅動程序如何獲得應用程序的緩沖區。Windows 2000為驅動程序訪問用戶模式數據緩沖區提供了三種方法:Buffered 方式、Direct方式和Neit her方式。在此次開發中,我們使用的是 Direct方式,I/O管理器把用戶輸入緩沖區數據復制到一個系統緩沖區,驅動程序可以用KIrp::IoctlBUffer訪問這個緩沖區。輸出緩沖區被類KMemory對象映射,驅動程序可以用KIrp::Mdl訪問這個緩沖區。
3.2.2 DMA模式讀寫
上面的普通讀寫模式傳輸數據速率很低,所以又實現了DMA模式傳輸。在DMA模式下,讀寫數據都是由PCI_M T32發起的。本例開發使用的是BlockDMA方式,在應用程序以事件驅動,調用Win32A PI函數將其傳到驅動程序,應用程序無限等待事件的觸發,在驅動程序中讀完或寫完數據后觸發事件。事件觸發后,應用程序開始從驅動程序中讀取DMA傳輸的結果。由于篇幅有限,現僅對驅動程序的關鍵幾步介紹一下:
1) 在 Driver St udio 的 Driver Wizard中添加資源,如DMA適配器、內存空間和中斷等等。
2) 在OnStartDevice 例程中初始化硬件中斷并連接到相應的中斷服務程序,建立延遲過程調用,分配一段公共緩沖區來存放DMA傳輸的數據,緩沖區的大小影響DMA速度。
3) 在讀寫例程中設置和DMA、中斷有關的寄存器,啟動DMA傳輸。通過向m_Memo ryRange0表示的存儲器空間寫數,設置DMA寄存器。
4) 在中斷服務例程中,先判斷中斷是否為本設備產生的中斷,是則清除中斷,啟動DPC延遲調用。
5) 在DPC延遲調用中,觸發內核事件,通知應用程序DMA傳輸結束,可以讀取數據。
6) 在DMA讀回例程中,將數據從公共緩沖區拷到用戶模式緩沖區。
4 總結
針對采集數據時所需的高速傳輸速率,本文討論了基于FPGA PCI IPcore的PCI接口中單周期模式讀寫和DMA模式讀寫的實現及其驅動程序的開發。這種設計方法具有電路板集成性能高、功耗低、傳輸速率高的優點。另外用Driv2er Works所開發的DMA模式PCI驅動程序具有通用性,在兩者的結合下很好地實現了主機應用程序對數據進行快速的存取 。
參考文獻:
[1] PCI compiler user guide(vision 4.0)[EB/OL].Altera Corporation,2005.http://www.altera.com.cn/literature/ug/ug_pci.pdf.
[2] 李貴山,陳金鵬.PCI局部總線及其應用[M].西安:西安電子科技大學出版社,2003.
[3] 武安河,邰銘,于洪濤.Windows2000/XP WDM,設備驅動程序開發[M].北京:北京電子工業出版社,2003.