《電子技術應用》
您所在的位置:首頁 > 其他 > 業(yè)界動態(tài) > 基于VHDL的PCI總線數(shù)據(jù)采集卡的研究

基于VHDL的PCI總線數(shù)據(jù)采集卡的研究

2010-01-27
作者:林青松,王光輝

摘 要:提出了應用VHDL語言實現(xiàn)PCI數(shù)據(jù)采集卡的設計方法,對PCI總線主模式控制器的結(jié)構(gòu)、時序和Windows XP環(huán)境下PCI設備WDM驅(qū)動程序的開發(fā)進行了研究;在單片F(xiàn)PGA中實現(xiàn)了A/D轉(zhuǎn)換器的時序控制、FIFO存儲器和PCI總線接口控制器的設計。仿真結(jié)果表明,該數(shù)據(jù)采集卡符合PCI 2.2協(xié)議,具有DMA傳輸功能。
關鍵詞:PCI總線;現(xiàn)場可編程邏輯陣列(FPGA);DMA傳輸;VHDL;WDM驅(qū)動

  目前,利用個人計算機作為數(shù)據(jù)采集和處理的平臺,通過數(shù)據(jù)總線將采集的數(shù)據(jù)高速地傳輸?shù)接嬎銠C的存儲設備中,是實現(xiàn)數(shù)據(jù)采集存儲和處理的主要手段。最常用的個人計算機總線有ISA總線、USB總線及PCI總線。3種總線的特點是ISA總線采用程序請求I/O方式與CPU通信,CPU資源占用大,傳輸速率低;USB2.0標準的理論傳輸率雖然高達480 Mb/s,但是它的CPU占用率較高;PCI總線理論傳輸速率可達132 Mb/s,穩(wěn)定傳輸速率一般也可達80 Mb/s [1],而且可靠性高。因此PCI總線已經(jīng)廣泛應用于數(shù)據(jù)采集、測控等領域。
  隨著超大規(guī)模集成電路技術的發(fā)展,F(xiàn)PGA(現(xiàn)場可編程門陣列)的集成度和運行速度得到提高,并且FPGA易于實現(xiàn)邏輯控制,時鐘頻率高、內(nèi)部時延小,可以實現(xiàn)乘法器、地址發(fā)生器、狀態(tài)機、譯碼器等功能,具有比單片機和DSP更高的靈活性[2]。基于以上優(yōu)點本文提出了一種在單片F(xiàn)PGA上實現(xiàn)PCI總線數(shù)據(jù)采集的設計方案。
1 PCI數(shù)據(jù)采集系統(tǒng)構(gòu)成
  本設計中數(shù)據(jù)采集卡包括A/D轉(zhuǎn)換單元、數(shù)據(jù)緩沖存儲單元和基于PCI總線的數(shù)據(jù)傳輸單元。被測信號經(jīng)過前置預處理部分,直接進入A/D采樣,采樣后的數(shù)據(jù)經(jīng)過FIFO(先進先出存儲器)緩沖,通過PCI總線傳輸?shù)絇C機中,最后通過計算機軟件平臺對采集到的數(shù)據(jù)進行信號分析和處理。整個數(shù)據(jù)采集卡的工作時序是在單片F(xiàn)PGA控制下進行的,其內(nèi)部包含A/D和FIFO的時序控制模塊、FIFO存儲器模塊和PCI接口邏輯模塊。其硬件設計框圖如圖1所示。

  為了使FPGA能夠?qū)崿F(xiàn)上述三大功能并具有升級空間,本設計選用了Altera公司的Cyclone系列,具體型號為EP1C6Q240C8,該FPGA具有較高的性價比,主要特點如下:
  (1) 邏輯單元LE(Logic Elements)數(shù)目達到了5 980個,除去電源和配置引腳,為用戶提供了185個I/O引腳;
  (2) 內(nèi)嵌了20個M4K RAM塊,可方便地配置成FIFO或RAM;
  (3) 內(nèi)嵌了2個鎖相環(huán),有利于FPGA內(nèi)部的時鐘管理,提高系統(tǒng)的穩(wěn)定性;
  (4) 支持66 MHz、32位PCI總線標準。
1.1 模數(shù)轉(zhuǎn)換單元
  采用ADI公司的14位、10M/s高性能模數(shù)轉(zhuǎn)換器AD9240。該芯片自帶采樣保持電路(SHA)和輸出緩沖器(OUTPUT BUFFER)。AD9240的時序控制與傳統(tǒng)的A/D有所不同,完全依靠時鐘控制采樣、轉(zhuǎn)換和數(shù)據(jù)輸出[3]。如圖2所示,在第1個時鐘的上升沿開始采樣轉(zhuǎn)換,第4個時鐘上升沿到來時,數(shù)據(jù)將出現(xiàn)在D1~D14端口上。數(shù)據(jù)輸出采用直接二進制編碼格式,根據(jù)需要可以配置芯片的DRVDD引腳構(gòu)成+3.3 V或+5 V邏輯系列接口,而不需使用電平轉(zhuǎn)換芯片,簡化了電路設計。硬件上,采用系統(tǒng)自通電起,A/D和時鐘電路始終處于工作狀態(tài),對數(shù)據(jù)不停進行轉(zhuǎn)換,獨立的模擬和數(shù)字電源、模擬地和數(shù)字地設計,減小數(shù)字信號對模擬信號的干擾。

1.2 數(shù)據(jù)緩沖存儲單元
  Cyclone系列FPGA是一款高性能、低價格的可編程邏輯器件,具有豐富的邏輯單元和存儲單元。其內(nèi)部的M4K RAM塊可以配置大小不同的各種類型存儲器,如RAM和FIFO,其中FIFO具有兩套數(shù)據(jù)線而無地址線,可在其一端寫操作而在另一端進行讀操作,數(shù)據(jù)在其中順序移動,從而達到很高的傳輸速度和效率。因此,F(xiàn)IFO更適合作為A/D采樣時數(shù)據(jù)高速寫入的緩沖存儲器。
  在設計中采用FPGA來實現(xiàn)FIFO和數(shù)據(jù)傳輸?shù)臅r序控制。使用QuartusⅡ 8.0集成開發(fā)環(huán)境中的MegaWizard Plug-In Manager工具來構(gòu)建FIFO,首先在向?qū)е性O置參數(shù),構(gòu)建一個14位寬、512B深的FIFO,并設置FIFO的空滿標志位,寫使能、讀使能等控制位,以便實現(xiàn)與A/D轉(zhuǎn)換器和PCI總線的邏輯接口。所構(gòu)建的FIFO如圖3所示。

  用FIFO構(gòu)成高速A/D采樣緩存時,由于轉(zhuǎn)換速度較快,直接將ADC采樣后的數(shù)據(jù)存儲到FIFO中,此過程對時序配置要求非常嚴格,如果兩者時序關系配合不當,就會發(fā)生數(shù)據(jù)存儲出錯或者掉數(shù)。針對這一問題,把A/D轉(zhuǎn)換時鐘和FIFO寫時鐘設置為同一時鐘源,自上電起,A/D和時鐘電路一直處于工作狀態(tài),不停地進行數(shù)據(jù)的轉(zhuǎn)換,但數(shù)據(jù)是否寫入到FIFO中,由FIFO的寫使能信號(wrreq)來決定,當時序控制模塊發(fā)出寫使能信號有效時,轉(zhuǎn)換的數(shù)據(jù)才能存儲到FIFO中。從圖2可知,A/D轉(zhuǎn)換數(shù)據(jù)的輸出和轉(zhuǎn)換時鐘有一定的相位差tOD,在FPGA內(nèi)部可通過延時或時鐘管理器來滿足建立時間和保持時間,保證數(shù)據(jù)不失碼地傳輸?shù)紽IFO中。
1.3 PCI總線接口模塊
  目前PCI接口的設計有兩種方法:一種是采用現(xiàn)成的PCI總線橋接器件;另一種方法是采用大規(guī)??删幊踢壿嬈骷?,通過軟件編程完成硬件設計[4]??紤]到使用PCI接口專用芯片,如AMCC S5933、PLX9054等,仍需要外部擴展FPGA來進行IO接口處理,這種方法成本較高且占用PCB板面積較大。于是設計中用VHDL(硬件描述語言)對FPGA編程開發(fā)PCI接口邏輯,使單片F(xiàn)PGA既包含用戶邏輯又包含接口邏輯,從而使電路大大簡化,使設計更加緊湊。其次,當系統(tǒng)升級時,只需對可編程器件重新進行邏輯設計,而無需更新PCB板圖。
  數(shù)據(jù)采集卡中設計的PCI總線接口電路具有32位總線寬度,工作在33 MHz,具有Target/Initiator模式,在Initiator模式下可以進行DMA傳輸,主要包含地址命令鎖存、地址命令譯碼、奇偶校驗、數(shù)據(jù)通路、配置空間和有限狀態(tài)機六部分。其中Initiator模塊扮演著總線控制者的角色,它的核心是主模式狀態(tài)機。主模式狀態(tài)機處理DMA傳輸時總線上的各個狀態(tài),控制總線的時序,因此主模式狀態(tài)機的設計是PCI接口模塊中的設計重點,下面將主要介紹設計中PCI主模式狀態(tài)機的設計。
  如圖4所示主模式狀態(tài)機由IDLE、REQ、ADDR、WAIT、READ、 WRITE、LAST、RETRY、ABORT9種狀態(tài)組成。

  IDLE:總線空閑狀態(tài)。當未發(fā)起DMA傳輸時,總線應停留在空閑狀態(tài),各信號均無效。
  REQ:當接收到start信號,由IDLE狀態(tài)跳轉(zhuǎn)到REQ狀態(tài),將req#信號拉低,申請對總線的控制權(quán),若得到仲裁器允許,即gnt#有效,則跳轉(zhuǎn)到ADDR狀態(tài),否則停留在REQ狀態(tài)。
  ADDR:該狀態(tài)使frame#有效,并同時給出要訪問的Host物理首地址和命令,在下一個時鐘給出irdy#,跳轉(zhuǎn)到WAIT狀態(tài)。
  WAIT:該狀態(tài)等待Target準備好,若trdy#無效則停留在WAIT狀態(tài);若有效則判斷是讀還是寫,跳轉(zhuǎn)到READ或WRITE,并開始接收或發(fā)送數(shù)據(jù);若Target在16個周期內(nèi)未有效trdy#,則跳轉(zhuǎn)到RETRY。
  READ:接收pci_ad[31:0]上的數(shù)據(jù),一直有效frame#和irdy#,并檢測當前傳輸是否是倒數(shù)第二次傳輸,若是則在下一個時鐘無效frame#信號,并跳轉(zhuǎn)到LAST狀態(tài);若不是則停留在READ狀態(tài);在此過程中,若target有數(shù)據(jù)的斷開(disconnect with data),則跳轉(zhuǎn)到RETRY狀態(tài);若target終止傳輸(target abort),則跳轉(zhuǎn)到ABORT狀態(tài)。
  WRITE:將后端待發(fā)送的數(shù)據(jù)放到pci_ad[31,0]總線上,一直使frame#和irdy#信號處于低電平,并檢測當前傳輸是否是倒數(shù)第二次傳輸,若是則在下一個時鐘無效frame#信號,并跳轉(zhuǎn)到LAST狀態(tài);若不是則停留在WRITE狀態(tài);在此過程中,若target有數(shù)據(jù)的斷開(disconnect with data),則跳轉(zhuǎn)到RETRY狀態(tài);若target終止傳輸(target abort),則跳轉(zhuǎn)到ABORT狀態(tài)。
  RETRY:該狀態(tài)保存當前剩余字節(jié)數(shù)、當前內(nèi)存物理地址,跳轉(zhuǎn)到IDLE狀態(tài),等待重新發(fā)起傳輸。
  LAST:完成最后一次傳輸,在下一時鐘周期將irdy#無效,回到IDLE狀態(tài)。
  ABORT:無效所有信號,回到IDLE狀態(tài)。
  需要說明的是,PCI配置空間定義在Target模塊中,PCI的配置讀寫操作也由Target模塊完成。系統(tǒng)開始工作時,首先由主機通過從模式寫操作設置DMA寄存器,如傳輸字節(jié)數(shù)、內(nèi)存物理首地址,最后給出start信號,通知Initiator模塊申請總線控制權(quán),在得到仲裁其允許后啟動DMA傳輸。
  圖5是在Quartus Ⅱ環(huán)境下PCI總線上DMA傳輸?shù)臅r序仿真圖,信號配合過程是:master接收到slave發(fā)送的dma_start#請求信號后,發(fā)送req#請求占用PCI總線,接到gnt#允許信號后,發(fā)送幀信號frame#。在frame#有效的第一個時鐘,發(fā)送讀數(shù)據(jù)塊的地址pci_ad[31:0](addr)及讀命令CMD,在隨后的時鐘當irdy#、devsel#、trdy#有效且stop#無效時,在字節(jié)使能信號c/be[3:0]#的同步下,接收讀數(shù)據(jù)塊(data)。結(jié)束后,發(fā)intr_a#中斷且釋放PCI總線。以上信號帶“#”的表示低電平有效。

2 WDM驅(qū)動程序的設計
  WDM(Windows Driver Model)是Windows 32模式驅(qū)動程序模型,這種驅(qū)動程序為Windows 98/2000/XP的設備驅(qū)動程序提供了統(tǒng)一的框架[5]。它來源于Windows NT的分層32位色設備驅(qū)動程序模型(Layered 32-bits Device Driver Model);支持更多的特性,如即插即用(Plug&Play)、電源管理(Power Management)、Windows管理診斷(Windows Management Instrumentation)和NT事件等。
  PCI設備驅(qū)動程序除驅(qū)動程序入口例程、即插即用例程、分發(fā)例程、電源管理例程和卸載例程等基本部分外,在框架上與其他類型的設備驅(qū)動程序基本相同,是很標準的WDM設備驅(qū)動程序。另外,為實現(xiàn)PCI設備的系統(tǒng)中斷等功能,還應包括中斷服務(IRP)例程和延時過程調(diào)度DPC(Deferred Procedure Call)例程等其他例程[6]。圖6描述了PCI設備驅(qū)動程序的基本組成部分。

  結(jié)合WDM驅(qū)動程序特性,在Windows XP操作系統(tǒng)下,對PCI數(shù)據(jù)采集卡編寫驅(qū)動程序。采用DriverStido工具生成的WDM驅(qū)動程序框架,在VC++ 6.0中開發(fā)支持I/O、內(nèi)存和DMA操作的驅(qū)動程序。
 在驅(qū)動程序開發(fā)中,DMA操作的實現(xiàn)方法如下:首先在即插即用例程中調(diào)用IoGetDmaAdapter函數(shù)得到一個DMA適配器對象。當驅(qū)動程序的分發(fā)例程收到應用程序的IRP_Mj_READ IRP包后,調(diào)用IoStartPacket函數(shù)讓系統(tǒng)啟動入口例程中的DriverStartIo函數(shù)。在DriverStartIo函數(shù)中設置DMA寄存器,將IRP的MDL(Memory Descriptor List)所描述的內(nèi)存區(qū)組裝成分散/集中列表,最后啟動DMA數(shù)據(jù)傳輸,由DMA適配器產(chǎn)生數(shù)據(jù)傳輸周期。驅(qū)動程序收到DMA傳輸結(jié)束中斷后,在ISP例程中首先禁止PCI設備的DMA中斷,防止中斷程序嵌套,然后在返回前調(diào)用IoRequestDpc函數(shù)請求一個DPC。在DPC例程中首先清除DMA中斷源,然后將數(shù)據(jù)從PCI驅(qū)動內(nèi)存中復制到IRP的MDL用戶緩沖區(qū)內(nèi)供應用程序存儲和后續(xù)處理。這樣就完成了一次DMA操作。
  隨著FPGA技術的發(fā)展,硬件設計和軟件設計的界限已經(jīng)被打破。本文用VHDL語言實現(xiàn)了PCI總線數(shù)據(jù)采集卡的設計,在Quartus Ⅱ中經(jīng)功能仿真、時序驗證,符合PCI總線2.2標準,支持DMA操作。本數(shù)據(jù)采集卡的各邏輯模塊僅占用了FPGA中1 956個LE,大大降低了開發(fā)成本,提高了系統(tǒng)集成度。同時,由于FPGA的體系結(jié)構(gòu)和編程的靈活性,使得系統(tǒng)具有很強的擴展性和移植性,為將來系統(tǒng)功能的改進和完善提供了便利。采用DriverStido編寫驅(qū)動程序,使難度較大的Windows驅(qū)動開發(fā)變得容易,縮短了開發(fā)時間。
參考文獻
[1] PIMG.PCI Local Bus Specification.Revision 2.2 18,1998.
[2] 王友波,劉明業(yè).PCI總線接口控制器的FPGA實現(xiàn) [J].北京理工大學學報, 2004,25(5):423-426.
[3]  AD9240 Datasheet. http://www.analog.com. 2008,12.
[4] 李貴山.PCI局部總線開發(fā)者指南[M].西安:西安電子科技大學出版社,1997.
[5] 張惠鵑,周利華.Windows環(huán)境下的設備驅(qū)動程序設計 [M].西安:西安電子科技大學出版社,2002.
[6] 曹榮榮,闕沛文.PCI數(shù)據(jù)采集卡及其WDM驅(qū)動程序設計 [J].
計算機測量與控制,2006,14(3):415-417.
 

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。