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

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

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

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

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

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

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

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

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

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

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

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