摘 要:本文通過(guò)一套數(shù)據(jù)采集卡的設(shè)計(jì)介紹了PCI總線(xiàn)數(shù)據(jù)傳輸?shù)幕具^(guò)程,給出了系統(tǒng)整體設(shè)計(jì)方案和PCI接口通信方式及驅(qū)動(dòng)程序?qū)崿F(xiàn),并著重討論了PCI數(shù)據(jù)傳輸中影響傳輸速率的各個(gè)方面。
關(guān)鍵詞:PCI總線(xiàn),WinDriver,直接存儲(chǔ)器存取
1 引言
計(jì)算機(jī)總線(xiàn)擴(kuò)展技術(shù)使得基于計(jì)算機(jī)的數(shù)據(jù)采集技術(shù)迅速得到應(yīng)用,基于PC機(jī)的數(shù)據(jù)采集系統(tǒng)是目前應(yīng)用最為廣泛的數(shù)據(jù)采集系統(tǒng)之一,不但廣泛應(yīng)用于電力設(shè)備監(jiān)控、遙測(cè)遙感等測(cè)控領(lǐng)域,在聲納、雷達(dá)、通訊、地質(zhì)、醫(yī)療器械等領(lǐng)域中也有著重要的應(yīng)用。高速數(shù)據(jù)傳輸始終是計(jì)算機(jī)相關(guān)領(lǐng)域研究的重點(diǎn),它是計(jì)算機(jī)感知外部世界并對(duì)其進(jìn)行控制的基礎(chǔ)。PCI總線(xiàn)協(xié)議是Intel公司1992年提出,為滿(mǎn)足高速數(shù)據(jù)輸入/輸出要求而設(shè)計(jì)的一種低成本,高性能的局部總線(xiàn)協(xié)議。32位PCI總線(xiàn)的峰值傳輸速率為132MB/s(33MHz×4Byte)。在PC機(jī)的數(shù)據(jù)傳輸中,PCI總線(xiàn)以其卓越的性能得到了廣泛的應(yīng)用。高速的數(shù)據(jù)傳輸要求提高PCI總線(xiàn)的帶寬利用率,使其盡量接近PCI總線(xiàn)的極限速率。本文詳細(xì)介紹了PCI總線(xiàn)高速數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)的關(guān)鍵技術(shù),并實(shí)現(xiàn)了一套高速數(shù)據(jù)采集系統(tǒng)。
2 硬件電路設(shè)計(jì)
該系統(tǒng)硬件電路板的結(jié)構(gòu)框圖如圖1所示。其中PCI9054總線(xiàn)控制器負(fù)責(zé)局部總線(xiàn)與PCI總線(xiàn)間的接口通信。由于PCI9054 Local總線(xiàn)部分信號(hào)時(shí)序也比較復(fù)雜,用門(mén)電路不但難以實(shí)現(xiàn)而且所需要芯片數(shù)量較多,影響電路板的擴(kuò)充能力及通用性,故采用CPLD實(shí)現(xiàn)PCI9054 Local端的控制。從框圖中可以看到, PCI9054局部數(shù)據(jù)總線(xiàn)高五位數(shù)據(jù)線(xiàn)接到CPLD引腳上,這五根數(shù)據(jù)線(xiàn)可以接受和發(fā)送數(shù)據(jù),根據(jù)接收到的數(shù)據(jù)對(duì)其譯碼產(chǎn)生控制信息,還可以發(fā)出數(shù)據(jù)使PCI9054產(chǎn)生門(mén)鈴中斷和MailBox中斷。
PCI接口數(shù)據(jù)傳輸效率非常高而A/D采集數(shù)據(jù)效率較低,所以本設(shè)計(jì)采用FIFO來(lái)緩存數(shù)據(jù),也可以同時(shí)采集多路數(shù)據(jù)。PCI9054局部總線(xiàn)支持50MHz時(shí)鐘,為配合A/D工作,本設(shè)計(jì)選用40M時(shí)鐘。PCI9054的所有地址線(xiàn)和控制信號(hào)都只與CPLD連接,產(chǎn)生CPLD的工作狀態(tài)和各種控制信息。FIFO采用TI公司生產(chǎn)的SN74V3690芯片,該芯片非常適合于網(wǎng)絡(luò),視頻,信號(hào)處理,電話(huà),數(shù)據(jù)通信和其他需要大量數(shù)據(jù)和非對(duì)等總線(xiàn)匹配的應(yīng)用。
[align=center]
圖1 硬件電路框圖[/align]
3 DMA傳輸方式設(shè)計(jì)
3.1改進(jìn)的狀態(tài)機(jī)設(shè)計(jì)
一般情況下?tīng)顟B(tài)機(jī)的轉(zhuǎn)換圖如圖2所示。該狀態(tài)機(jī)有三種傳輸狀態(tài),空閑狀態(tài)、等待狀態(tài)和傳輸狀態(tài)。該狀態(tài)機(jī)能成功完成與PCI9054的配合數(shù)據(jù)傳輸,傳輸性能穩(wěn)定,效果較好。是現(xiàn)在PCI9054局部總線(xiàn)狀態(tài)機(jī)設(shè)計(jì)的一般方法。通過(guò)實(shí)際測(cè)試,在用戶(hù)模式下,采用該狀態(tài)機(jī)查詢(xún)方式DM,A傳輸速率可以穩(wěn)定達(dá)到68M Byte/s.
[align=center]
圖2 一般狀態(tài)轉(zhuǎn)換圖[/align]
PCI總線(xiàn)峰值速率為132M Byte/s,而以上狀態(tài)機(jī)和傳輸狀態(tài)下DMA速率只有68MByte/s說(shuō)明其中存在不少漏洞。對(duì)比該狀態(tài)機(jī)的時(shí)序與PCI9054給出的標(biāo)準(zhǔn)DMA傳輸時(shí)序可知,一般狀態(tài)機(jī)在ADS#信號(hào)為低后先進(jìn)入等待狀態(tài)用來(lái)配置各種信號(hào)線(xiàn),然后才開(kāi)始傳輸狀態(tài)。所以每次啟動(dòng)傳輸都要浪費(fèi)一個(gè)時(shí)鐘周期的時(shí)間,這種浪費(fèi)在高速數(shù)據(jù)傳輸過(guò)程中特別是DMA傳輸中是非??捎^的。
而PCI9054標(biāo)準(zhǔn)DMA傳輸在ADS#信號(hào)為低后立刻開(kāi)始數(shù)據(jù)傳輸并不需要等待周期,所以等待周期可以省略,狀態(tài)機(jī)只需要兩個(gè)狀態(tài)用來(lái)產(chǎn)生時(shí)序,即空閑狀態(tài)和數(shù)據(jù)傳輸狀態(tài),這樣狀態(tài)機(jī)轉(zhuǎn)換過(guò)程可以簡(jiǎn)化。但是由于PCI9054不只需要DMA傳輸,還需要一些其他操作,比如讀寫(xiě)某些控制字和狀態(tài)標(biāo)志位等,所以在CPLD中還要區(qū)分地址。所以本設(shè)計(jì)采用了新的狀態(tài)機(jī),改進(jìn)的狀態(tài)機(jī)狀態(tài)轉(zhuǎn)換圖如圖3所示。
實(shí)際測(cè)得在同一臺(tái)機(jī)器上,新?tīng)顟B(tài)機(jī)在用戶(hù)模式下,查詢(xún)方式DMA傳輸速率可以穩(wěn)定達(dá)到88MByte/s。所以在同種情況下,改進(jìn)的狀態(tài)機(jī)速率可以比原狀態(tài)機(jī)速率高出20MByte/s。由傳輸速率的大幅提高可以看出,這種改進(jìn)方式是非常成功的。
[align=center]
圖3 改進(jìn)的狀態(tài)轉(zhuǎn)換圖[/align]
3.2 DMA傳輸模式選擇
PCI9054支持兩種DMA傳輸方式:連續(xù)模式和集散模式。連續(xù)模式即一般的DMA傳輸方式(塊傳輸),它要求PCI端的物理存儲(chǔ)地址連續(xù),Local端地址連續(xù)或不變(如從FIFO中讀取數(shù)據(jù),地址始終不變)。集散模式DMA傳輸可以申請(qǐng)一個(gè)鏈表式的描述符表用來(lái)存儲(chǔ)各個(gè)物理地址不連續(xù)的和傳輸大小不固定的多塊數(shù)據(jù)的描述寄存器值,PCI9054可以自動(dòng)通過(guò)控制寄存器指針從PCI端或LOCAL端讀取寄存器的值并配置寄存器,開(kāi)始一次次的傳輸。通過(guò)集散模式DMA傳輸,可以一次傳遞更多的數(shù)據(jù)。但是集散模式DMA傳輸在傳輸完一塊數(shù)據(jù)之后要重新配置寄存器的值,所以速度比連續(xù)模式稍慢。
本設(shè)計(jì)對(duì)兩種DMA傳輸模式進(jìn)行了對(duì)比,在其他條件相同的情況下,通過(guò)邏輯分析儀測(cè)得連續(xù)模式下DMA傳輸速率為95.3M Byte/s,集散模式下DMA傳輸速率為91.2M Byte/s。 可以看出,連續(xù)模式在同種情況下速度要比集散模式高出4M Byte/s。但是連續(xù)模式由于只能單次啟動(dòng)DMA,所以傳輸數(shù)據(jù)量大小有限,這在大量的數(shù)據(jù)傳輸是非常不利。而集散模式由于可以在傳輸過(guò)程中通過(guò)描述符表重新配置寄存器,所以可以一次傳輸較大的數(shù)據(jù)量,且重新配置寄存器的工作不需要驅(qū)動(dòng)程序干預(yù),PCI9054會(huì)自動(dòng)完成該過(guò)程,所以可以在傳輸速度降低不多的情況下得到更大的數(shù)據(jù)量。集散模式傳輸是PCI9054支持的DMA傳輸?shù)奶厣J?。?shí)際測(cè)得,在賽揚(yáng)1GHz,256M內(nèi)存機(jī)器上,相同條件下,連續(xù)模式最多可以一次傳輸4MByte數(shù)據(jù),而集散模式最多可以一次傳輸32MByte。集散模式可以傳輸?shù)臄?shù)據(jù)量遠(yuǎn)遠(yuǎn)大于連續(xù)模式。所以在需要一次傳輸?shù)臄?shù)據(jù)量較大而速度要求相對(duì)不太嚴(yán)格情況下集散模式是較為理想的選擇。
3.3 終止方式選擇
DMA過(guò)程的終止可以通過(guò)查詢(xún)和中斷兩種方式檢測(cè)到。查詢(xún)方式DMA傳輸原理為在啟動(dòng)DMA之后一直讀取寄存器DMACSR0[4]的值,當(dāng)該位為1時(shí)表示DMA傳輸完畢。中斷方式DMA為在啟動(dòng)DMA時(shí)使能DMA完成中斷,系統(tǒng)接收到中斷之后在中斷處理例程中講清空中斷,并讀取DMA傳來(lái)的數(shù)據(jù)。
在相同條件下測(cè)得查詢(xún)方式下連續(xù)DMA傳輸速率為95MByte/s.中斷方式下連續(xù)DMA傳輸速率為114.2MByte/s。
由兩種終止方式速度比較可知中斷方式在同樣條件下能比查詢(xún)方式速度提高將近20MByte/s 。PCI總線(xiàn)極限速度為132MByte/s,而這種傳輸方式速率已經(jīng)達(dá)到114MByte/s,所以這種方式DMA速度已接近PCI總線(xiàn)的峰值速度。
4 驅(qū)動(dòng)程序設(shè)計(jì)
4.1驅(qū)動(dòng)程序的引出
從最廣泛的意義講,一個(gè)“驅(qū)動(dòng)程序”是操作一個(gè)硬件設(shè)備的一組函數(shù)。在任何操作系統(tǒng)上,設(shè)備驅(qū)動(dòng)程序都必須與基本的系統(tǒng)代碼進(jìn)行和諧的作用。Microsoft為保證系統(tǒng)的安全性、穩(wěn)定性、可移植性,對(duì)應(yīng)用程序訪問(wèn)硬件資源進(jìn)行了限制,不能直接進(jìn)行物理內(nèi)存、I/O端口的訪問(wèn)以及中斷處理等硬件操作。
4.2 使用WinDriver開(kāi)發(fā)設(shè)備驅(qū)動(dòng)程序
1)驅(qū)動(dòng)程序開(kāi)發(fā)環(huán)境選擇
開(kāi)發(fā)設(shè)備驅(qū)動(dòng)程序的軟件平臺(tái)有很多種,如DDK、VTOOSD、WinDriver、DriverStudio等.本設(shè)計(jì)采用WinDriver來(lái)開(kāi)發(fā)設(shè)備驅(qū)動(dòng)程序.WinDriver對(duì)常見(jiàn)的PCI接口芯片(AMCC、PLX系列)提供了很好的支持,有專(zhuān)門(mén)的函數(shù)供開(kāi)發(fā)人員利用,方便了驅(qū)動(dòng)程序的開(kāi)發(fā).
2)本設(shè)計(jì)用戶(hù)模態(tài)下的驅(qū)動(dòng)程序介紹
WinDriver驅(qū)動(dòng)程序可以分為兩種工作模式,即用戶(hù)模式和內(nèi)核模式。本設(shè)計(jì)用戶(hù)模式下的驅(qū)動(dòng)程序的功能包括:PCI配置寄存器訪問(wèn)、映射到局部空間的各種寄存器訪問(wèn)(包括局部控制寄存器、RunTime寄存器、DMA寄存器、和消息隊(duì)列寄存器),各種PCI設(shè)備選擇,EEPROM訪問(wèn),IO操作,LOCAL映射的各個(gè)空間的訪問(wèn),DMA操作,中斷處理等。
3)本設(shè)計(jì)中內(nèi)核驅(qū)動(dòng)程序的設(shè)計(jì)
數(shù)據(jù)采集需要傳送大量的數(shù)據(jù),需要快速的將采集到的數(shù)據(jù)傳遞給主機(jī),數(shù)據(jù)傳送占用時(shí)間越短,應(yīng)用程序能利用的時(shí)間也就越多,從而對(duì)于數(shù)據(jù)采集卡和主機(jī)之間的相互通信和數(shù)據(jù)傳輸提出了較高的要求。編寫(xiě)該設(shè)備驅(qū)動(dòng)程序的關(guān)鍵性問(wèn)題在于:快速可靠的DMA傳輸、響應(yīng)及時(shí)的中斷處理等。WinDriver提供了Kernel PlugIn技術(shù),能夠?qū)崿F(xiàn)理想的中斷響應(yīng)速度,解決對(duì)于高性能的需求。為了提高系統(tǒng)的整體性能,在用戶(hù)模式下驅(qū)動(dòng)程序的基礎(chǔ)上采用了Kernel PlugIn技術(shù)。將中斷,DMA處理轉(zhuǎn)移到內(nèi)核模式下執(zhí)行。從而大大提高了系統(tǒng)的處理速度。
4)DMA速率探討
系統(tǒng)數(shù)據(jù)傳輸不僅需要傳遞數(shù)據(jù),還要通過(guò)中斷來(lái)引發(fā)數(shù)據(jù)傳輸和傳輸結(jié)束呼叫。
傳輸時(shí)間 = 中斷時(shí)間 + DMA傳輸時(shí)間
通過(guò)邏輯分析儀查看硬件波形圖可以計(jì)算出內(nèi)核模式下中斷觸發(fā)DMA傳輸速率為105.4MByte/s。所以數(shù)據(jù)持續(xù)傳輸速率可達(dá)105MByte/s??梢钥吹?,中斷響應(yīng)時(shí)間也影響數(shù)據(jù)傳輸?shù)淖罱K速度。
由第四章DMA部分討論可知,用戶(hù)模式下測(cè)得的DMA傳輸期間最快速度為95MB/s。內(nèi)核模式下DMA速度最快為114MB/s。而最初的DMA傳輸速度為68MB/s。從最初到現(xiàn)在,DMA傳輸期間傳輸速度提高了46MB/s。
結(jié)束語(yǔ)
在現(xiàn)代信號(hào)處理技術(shù)中,通過(guò)PCI總線(xiàn)進(jìn)行快速數(shù)據(jù)傳輸是實(shí)現(xiàn)主機(jī)與外設(shè)間通信的主要方式。作者在實(shí)驗(yàn)室利用PCI9054接口芯片設(shè)計(jì)了一個(gè)帶有12通道的高速信號(hào)采集器。對(duì)影響數(shù)據(jù)傳輸速率的各個(gè)環(huán)節(jié)逐一考慮,提出了一整套數(shù)據(jù)傳輸方案。將數(shù)據(jù)持續(xù)傳輸速率提高到100MByte/s以上。接近PCI總線(xiàn)的極限速率。
本文的創(chuàng)新點(diǎn)是:對(duì)局部總線(xiàn)狀態(tài)機(jī)狀態(tài)轉(zhuǎn)換進(jìn)行了研究。局部總線(xiàn)狀態(tài)機(jī)采用改進(jìn)的狀態(tài)轉(zhuǎn)換邏輯,將DMA數(shù)據(jù)傳輸效率提高了約20MByte/s。
參考文獻(xiàn):
[1]裴喜龍,童莉.基于PCI總線(xiàn)的高速數(shù)據(jù)采集卡系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].微機(jī)算計(jì)信息,2006,7-1:129-131。
[2]WinDriver v6.23 User’s Guide[DB/OL].http://www.jungo.com.2004。
[3]PCI9054 Data Book[DB/OL].http://www.plxtech.com.2000-01。
[4] 李貴山,陳金鵬主編.PCI局部總線(xiàn)及其應(yīng)用.西安:西安電子科技大學(xué)出版社[M].2003。
[5] 侯伯亨,顧新著.VHDL硬件描述語(yǔ)言與數(shù)字邏輯電路設(shè)計(jì).西安:西安電子科技大學(xué)出版社[M].1997。
[6] 喬林,楊志剛著.Visual C++高級(jí)編程技術(shù)DirectX篇.北京:中國(guó)鐵道出版社[M].1998。
[7] 胡波,原新晶.WinDriver 開(kāi)發(fā)驅(qū)動(dòng)程序的KernelPlugIn技術(shù)的研究與應(yīng)用[J].計(jì)算機(jī)應(yīng)用,2003,23(11)。