摘 要:提出了應用VHDL語言實現PCI數據采集卡的設計方法,對PCI總線主模式控制器的結構、時序和Windows XP環境下PCI設備WDM驅動程序的開發進行了研究;在單片FPGA中實現了A/D轉換器的時序控制、FIFO存儲器和PCI總線接口控制器的設計。仿真結果表明,該數據采集卡符合PCI 2.2協議,具有DMA傳輸功能。
關鍵詞:PCI總線;現場可編程邏輯陣列(FPGA);DMA傳輸;VHDL;WDM驅動
目前,利用個人計算機作為數據采集和處理的平臺,通過數據總線將采集的數據高速地傳輸到計算機的存儲設備中,是實現數據采集存儲和處理的主要手段。最常用的個人計算機總線有ISA總線、USB總線及PCI總線。3種總線的特點是ISA總線采用程序請求I/O方式與CPU通信,CPU資源占用大,傳輸速率低;USB2.0標準的理論傳輸率雖然高達480 Mb/s,但是它的CPU占用率較高;PCI總線理論傳輸速率可達132 Mb/s,穩定傳輸速率一般也可達80 Mb/s [1],而且可靠性高。因此PCI總線已經廣泛應用于數據采集、測控等領域。
隨著超大規模集成電路技術的發展,FPGA(現場可編程門陣列)的集成度和運行速度得到提高,并且FPGA易于實現邏輯控制,時鐘頻率高、內部時延小,可以實現乘法器、地址發生器、狀態機、譯碼器等功能,具有比單片機和DSP更高的靈活性[2]。基于以上優點本文提出了一種在單片FPGA上實現PCI總線數據采集的設計方案。
1 PCI數據采集系統構成
本設計中數據采集卡包括A/D轉換單元、數據緩沖存儲單元和基于PCI總線的數據傳輸單元。被測信號經過前置預處理部分,直接進入A/D采樣,采樣后的數據經過FIFO(先進先出存儲器)緩沖,通過PCI總線傳輸到PC機中,最后通過計算機軟件平臺對采集到的數據進行信號分析和處理。整個數據采集卡的工作時序是在單片FPGA控制下進行的,其內部包含A/D和FIFO的時序控制模塊、FIFO存儲器模塊和PCI接口邏輯模塊。其硬件設計框圖如圖1所示。
為了使FPGA能夠實現上述三大功能并具有升級空間,本設計選用了Altera公司的Cyclone系列,具體型號為EP1C6Q240C8,該FPGA具有較高的性價比,主要特點如下:
(1) 邏輯單元LE(Logic Elements)數目達到了5 980個,除去電源和配置引腳,為用戶提供了185個I/O引腳;
(2) 內嵌了20個M4K RAM塊,可方便地配置成FIFO或RAM;
(3) 內嵌了2個鎖相環,有利于FPGA內部的時鐘管理,提高系統的穩定性;
(4) 支持66 MHz、32位PCI總線標準。
1.1 模數轉換單元
采用ADI公司的14位、10M/s高性能模數轉換器AD9240。該芯片自帶采樣保持電路(SHA)和輸出緩沖器(OUTPUT BUFFER)。AD9240的時序控制與傳統的A/D有所不同,完全依靠時鐘控制采樣、轉換和數據輸出[3]。如圖2所示,在第1個時鐘的上升沿開始采樣轉換,第4個時鐘上升沿到來時,數據將出現在D1~D14端口上。數據輸出采用直接二進制編碼格式,根據需要可以配置芯片的DRVDD引腳構成+3.3 V或+5 V邏輯系列接口,而不需使用電平轉換芯片,簡化了電路設計。硬件上,采用系統自通電起,A/D和時鐘電路始終處于工作狀態,對數據不停進行轉換,獨立的模擬和數字電源、模擬地和數字地設計,減小數字信號對模擬信號的干擾。
1.2 數據緩沖存儲單元
Cyclone系列FPGA是一款高性能、低價格的可編程邏輯器件,具有豐富的邏輯單元和存儲單元。其內部的M4K RAM塊可以配置大小不同的各種類型存儲器,如RAM和FIFO,其中FIFO具有兩套數據線而無地址線,可在其一端寫操作而在另一端進行讀操作,數據在其中順序移動,從而達到很高的傳輸速度和效率。因此,FIFO更適合作為A/D采樣時數據高速寫入的緩沖存儲器。
在設計中采用FPGA來實現FIFO和數據傳輸的時序控制。使用QuartusⅡ 8.0集成開發環境中的MegaWizard Plug-In Manager工具來構建FIFO,首先在向導中設置參數,構建一個14位寬、512B深的FIFO,并設置FIFO的空滿標志位,寫使能、讀使能等控制位,以便實現與A/D轉換器和PCI總線的邏輯接口。所構建的FIFO如圖3所示。
用FIFO構成高速A/D采樣緩存時,由于轉換速度較快,直接將ADC采樣后的數據存儲到FIFO中,此過程對時序配置要求非常嚴格,如果兩者時序關系配合不當,就會發生數據存儲出錯或者掉數。針對這一問題,把A/D轉換時鐘和FIFO寫時鐘設置為同一時鐘源,自上電起,A/D和時鐘電路一直處于工作狀態,不停地進行數據的轉換,但數據是否寫入到FIFO中,由FIFO的寫使能信號(wrreq)來決定,當時序控制模塊發出寫使能信號有效時,轉換的數據才能存儲到FIFO中。從圖2可知,A/D轉換數據的輸出和轉換時鐘有一定的相位差tOD,在FPGA內部可通過延時或時鐘管理器來滿足建立時間和保持時間,保證數據不失碼地傳輸到FIFO中。
1.3 PCI總線接口模塊
目前PCI接口的設計有兩種方法:一種是采用現成的PCI總線橋接器件;另一種方法是采用大規模可編程邏輯器件,通過軟件編程完成硬件設計[4]。考慮到使用PCI接口專用芯片,如AMCC S5933、PLX9054等,仍需要外部擴展FPGA來進行IO接口處理,這種方法成本較高且占用PCB板面積較大。于是設計中用VHDL(硬件描述語言)對FPGA編程開發PCI接口邏輯,使單片FPGA既包含用戶邏輯又包含接口邏輯,從而使電路大大簡化,使設計更加緊湊。其次,當系統升級時,只需對可編程器件重新進行邏輯設計,而無需更新PCB板圖。
數據采集卡中設計的PCI總線接口電路具有32位總線寬度,工作在33 MHz,具有Target/Initiator模式,在Initiator模式下可以進行DMA傳輸,主要包含地址命令鎖存、地址命令譯碼、奇偶校驗、數據通路、配置空間和有限狀態機六部分。其中Initiator模塊扮演著總線控制者的角色,它的核心是主模式狀態機。主模式狀態機處理DMA傳輸時總線上的各個狀態,控制總線的時序,因此主模式狀態機的設計是PCI接口模塊中的設計重點,下面將主要介紹設計中PCI主模式狀態機的設計。
如圖4所示主模式狀態機由IDLE、REQ、ADDR、WAIT、READ、 WRITE、LAST、RETRY、ABORT9種狀態組成。
IDLE:總線空閑狀態。當未發起DMA傳輸時,總線應停留在空閑狀態,各信號均無效。
REQ:當接收到start信號,由IDLE狀態跳轉到REQ狀態,將req#信號拉低,申請對總線的控制權,若得到仲裁器允許,即gnt#有效,則跳轉到ADDR狀態,否則停留在REQ狀態。
ADDR:該狀態使frame#有效,并同時給出要訪問的Host物理首地址和命令,在下一個時鐘給出irdy#,跳轉到WAIT狀態。
WAIT:該狀態等待Target準備好,若trdy#無效則停留在WAIT狀態;若有效則判斷是讀還是寫,跳轉到READ或WRITE,并開始接收或發送數據;若Target在16個周期內未有效trdy#,則跳轉到RETRY。
READ:接收pci_ad[31:0]上的數據,一直有效frame#和irdy#,并檢測當前傳輸是否是倒數第二次傳輸,若是則在下一個時鐘無效frame#信號,并跳轉到LAST狀態;若不是則停留在READ狀態;在此過程中,若target有數據的斷開(disconnect with data),則跳轉到RETRY狀態;若target終止傳輸(target abort),則跳轉到ABORT狀態。
WRITE:將后端待發送的數據放到pci_ad[31,0]總線上,一直使frame#和irdy#信號處于低電平,并檢測當前傳輸是否是倒數第二次傳輸,若是則在下一個時鐘無效frame#信號,并跳轉到LAST狀態;若不是則停留在WRITE狀態;在此過程中,若target有數據的斷開(disconnect with data),則跳轉到RETRY狀態;若target終止傳輸(target abort),則跳轉到ABORT狀態。
RETRY:該狀態保存當前剩余字節數、當前內存物理地址,跳轉到IDLE狀態,等待重新發起傳輸。
LAST:完成最后一次傳輸,在下一時鐘周期將irdy#無效,回到IDLE狀態。
ABORT:無效所有信號,回到IDLE狀態。
需要說明的是,PCI配置空間定義在Target模塊中,PCI的配置讀寫操作也由Target模塊完成。系統開始工作時,首先由主機通過從模式寫操作設置DMA寄存器,如傳輸字節數、內存物理首地址,最后給出start信號,通知Initiator模塊申請總線控制權,在得到仲裁其允許后啟動DMA傳輸。
圖5是在Quartus Ⅱ環境下PCI總線上DMA傳輸的時序仿真圖,信號配合過程是:master接收到slave發送的dma_start#請求信號后,發送req#請求占用PCI總線,接到gnt#允許信號后,發送幀信號frame#。在frame#有效的第一個時鐘,發送讀數據塊的地址pci_ad[31:0](addr)及讀命令CMD,在隨后的時鐘當irdy#、devsel#、trdy#有效且stop#無效時,在字節使能信號c/be[3:0]#的同步下,接收讀數據塊(data)。結束后,發intr_a#中斷且釋放PCI總線。以上信號帶“#”的表示低電平有效。
2 WDM驅動程序的設計
WDM(Windows Driver Model)是Windows 32模式驅動程序模型,這種驅動程序為Windows 98/2000/XP的設備驅動程序提供了統一的框架[5]。它來源于Windows NT的分層32位色設備驅動程序模型(Layered 32-bits Device Driver Model);支持更多的特性,如即插即用(Plug&Play)、電源管理(Power Management)、Windows管理診斷(Windows Management Instrumentation)和NT事件等。
PCI設備驅動程序除驅動程序入口例程、即插即用例程、分發例程、電源管理例程和卸載例程等基本部分外,在框架上與其他類型的設備驅動程序基本相同,是很標準的WDM設備驅動程序。另外,為實現PCI設備的系統中斷等功能,還應包括中斷服務(IRP)例程和延時過程調度DPC(Deferred Procedure Call)例程等其他例程[6]。圖6描述了PCI設備驅動程序的基本組成部分。
結合WDM驅動程序特性,在Windows XP操作系統下,對PCI數據采集卡編寫驅動程序。采用DriverStido工具生成的WDM驅動程序框架,在VC++ 6.0中開發支持I/O、內存和DMA操作的驅動程序。
在驅動程序開發中,DMA操作的實現方法如下:首先在即插即用例程中調用IoGetDmaAdapter函數得到一個DMA適配器對象。當驅動程序的分發例程收到應用程序的IRP_Mj_READ IRP包后,調用IoStartPacket函數讓系統啟動入口例程中的DriverStartIo函數。在DriverStartIo函數中設置DMA寄存器,將IRP的MDL(Memory Descriptor List)所描述的內存區組裝成分散/集中列表,最后啟動DMA數據傳輸,由DMA適配器產生數據傳輸周期。驅動程序收到DMA傳輸結束中斷后,在ISP例程中首先禁止PCI設備的DMA中斷,防止中斷程序嵌套,然后在返回前調用IoRequestDpc函數請求一個DPC。在DPC例程中首先清除DMA中斷源,然后將數據從PCI驅動內存中復制到IRP的MDL用戶緩沖區內供應用程序存儲和后續處理。這樣就完成了一次DMA操作。
隨著FPGA技術的發展,硬件設計和軟件設計的界限已經被打破。本文用VHDL語言實現了PCI總線數據采集卡的設計,在Quartus Ⅱ中經功能仿真、時序驗證,符合PCI總線2.2標準,支持DMA操作。本數據采集卡的各邏輯模塊僅占用了FPGA中1 956個LE,大大降低了開發成本,提高了系統集成度。同時,由于FPGA的體系結構和編程的靈活性,使得系統具有很強的擴展性和移植性,為將來系統功能的改進和完善提供了便利。采用DriverStido編寫驅動程序,使難度較大的Windows驅動開發變得容易,縮短了開發時間。
參考文獻
[1] PIMG.PCI Local Bus Specification.Revision 2.2 18,1998.
[2] 王友波,劉明業.PCI總線接口控制器的FPGA實現 [J].北京理工大學學報, 2004,25(5):423-426.
[3] AD9240 Datasheet. http://www.analog.com. 2008,12.
[4] 李貴山.PCI局部總線開發者指南[M].西安:西安電子科技大學出版社,1997.
[5] 張惠鵑,周利華.Windows環境下的設備驅動程序設計 [M].西安:西安電子科技大學出版社,2002.
[6] 曹榮榮,闕沛文.PCI數據采集卡及其WDM驅動程序設計 [J].
計算機測量與控制,2006,14(3):415-417.