1引言
隨著數(shù)字信號(hào)處理器性能的不斷提高及其成本與售價(jià)的大幅下降,數(shù)字信號(hào)處理應(yīng)用領(lǐng)域飛速擴(kuò)展,信號(hào)處理進(jìn)入了一個(gè)新的發(fā)展時(shí)期。同時(shí)隨著計(jì)算機(jī)技術(shù)以及互聯(lián)網(wǎng)絡(luò)技術(shù)的不斷發(fā)展,越來越多的數(shù)據(jù)需要經(jīng)過計(jì)算機(jī)來進(jìn)行處理、存儲(chǔ)、傳輸籌操作。計(jì)算機(jī)的應(yīng)用已經(jīng)遍及我們生活的每一個(gè)角落。由于計(jì)算機(jī)本身的特點(diǎn),通用計(jì)算機(jī)通常僅負(fù)責(zé)沒有實(shí)時(shí)性要求的工作,而不適于進(jìn)行實(shí)時(shí)性要求很高的數(shù)字信號(hào)處理。將計(jì)算機(jī)和DSP有機(jī)地結(jié)合起來,充分利用各自的優(yōu)點(diǎn),它們將會(huì)相得益彰,滿足現(xiàn)實(shí)應(yīng)用中對(duì)數(shù)據(jù)實(shí)時(shí)處理能力、數(shù)據(jù)傳輸能力以及數(shù)據(jù)管理能力提出的越來越高的要求。PCI總線以其眾多優(yōu)點(diǎn)在計(jì)算機(jī)中具有不可取代的作用,采用PCI總線使DSP與計(jì)算機(jī)通信可以很好地滿足其對(duì)高速數(shù)據(jù)傳輸?shù)囊?。本文以?shí)際開發(fā)系統(tǒng)為背景,以TI公司的TMS320VC5402與PLX公司的PCI9052為基礎(chǔ)。詳細(xì)論述了基于DSP的PCI總線結(jié)構(gòu)的數(shù)據(jù)采集系統(tǒng)硬件及軟件設(shè)計(jì)方案和實(shí)現(xiàn)方法。
2數(shù)據(jù)采集系統(tǒng)硬件設(shè)計(jì)
2.1系統(tǒng)結(jié)構(gòu)及原理
基于DSP的PCI總線高速數(shù)據(jù)采集系統(tǒng)的結(jié)構(gòu)如圖1所示,它主要由A/D轉(zhuǎn)換器、DSP數(shù)據(jù)讀取及處理、PCI通信接口和PC機(jī)等部分組成。模擬信號(hào)經(jīng)A/D采樣后由DSP通過并行I/O讀取,并將處理后的數(shù)據(jù)通過PCI總線送到通用計(jì)算機(jī)做進(jìn)一步處理[1]。
A/D轉(zhuǎn)換器采用TI公司的TLC5510,TLC5510為8bit、20MS/s的高速并行A/D轉(zhuǎn)換器。TLC5510在每個(gè)時(shí)鐘的下降沿采樣,該采樣點(diǎn)的轉(zhuǎn)換數(shù)據(jù)經(jīng)過2.5個(gè)延遲后,在時(shí)鐘的上升沿輸出,也就是每個(gè)點(diǎn)的轉(zhuǎn)換時(shí)間為2.5個(gè)時(shí)鐘周期,一旦轉(zhuǎn)換流水線啟動(dòng),則在每個(gè)時(shí)鐘的上升沿都有一個(gè)轉(zhuǎn)換數(shù)據(jù)輸出。
DSP與計(jì)算機(jī)之間的通信由接口電路PCI9052實(shí)現(xiàn)。PCI9052是PLX公司推出的一種簡單、高效的PCI從設(shè)備接口,可實(shí)現(xiàn)多種外設(shè)局部總線和PCI總線的互連。根據(jù)PCI規(guī)范,主設(shè)備和從設(shè)備的劃分本質(zhì)上是確定數(shù)據(jù)傳輸雙方訪問與被訪問的能力和關(guān)系。在此,PCI9052只能由主機(jī)或其它擁有總線主控制能力的設(shè)備進(jìn)行數(shù)據(jù)的讀寫操作。但由于其內(nèi)部有64Byte寫FIFO和32Byte讀FIFO,使PCI9052的局部總線和PCI總線能互相獨(dú)立工作,可支持傳輸速度為132Mb/s的突發(fā)傳輸[2]。
DSP采用TI公司的TMS320VC5402,它的處理能力可達(dá)到100Mb/s,具有改進(jìn)型的8位HPI接口,有16K*16BitDARAM,以及4K*l6BitROM存儲(chǔ)空間。具有較高的性價(jià)比[3]。
2.2PCI9052與TMS320VC5402的接口
PCI9052的局部總線設(shè)置為8位局部總線,采用地址數(shù)據(jù)非復(fù)用模式,PCI9052和TMS320VC5402的接口電路如圖2所示[4,5]。此時(shí),LBE1為LA1,LBE0為LA0。將PCI9052的LBE0接HPI的HBIL,用以區(qū)分第一字節(jié)和第二字節(jié)。PCI9052的LA17接TMS320VC5402的HCNTL1,LA16接HC-NTL0,以選擇HPI寄存器。PCI9052的LAD[0:7]接TMS320VC5402的HD[7:0]。TMS320VC5402的HINT反向后接至PCI9052的LINT1,之所以反向是由于HINT低電平有效,而UNT1是高電平有效。PCI9052的LW/R反向后接至TMS320VC5402的HR/W,因?yàn)長W/R高電平表示寫,低電平表示讀;而HR/W高電平表示主機(jī)要讀HPI,低電平表示主機(jī)要寫HPI。PCI9052的CS0與CS1相或后連接至HCS,RD和WR分別連接到HDS1,HDS2。TMS320VC5402的LRDY通過一定的邏輯組合再加上一個(gè)D觸發(fā)器與PCI9052的LRDY相連以實(shí)現(xiàn)PCI9052與HPI的同步。PCI9052局部時(shí)鐘采用40MHz。其中CPLD選用EPM7128,使用MAX+PLUSⅡ進(jìn)行設(shè)計(jì)。
HPI主機(jī)接口采用訪問寄存器的方式來進(jìn)行DSP內(nèi)部數(shù)據(jù)的讀寫,把HPI口單純映射到PCI的I/O空間或者存儲(chǔ)器空間都有不可避免的缺點(diǎn),因此本接口電路采用雙映射方式,利用映射來訪問控制、地址寄存器和單個(gè)數(shù)據(jù)口,而利用存儲(chǔ)器映射來訪問連續(xù)數(shù)據(jù)口。以實(shí)現(xiàn)TMS320VC5402與PCI9052之間方便、高效的數(shù)據(jù)通信[6]。
3數(shù)據(jù)采集系統(tǒng)軟件的設(shè)計(jì)
數(shù)據(jù)采集系統(tǒng)的軟件設(shè)計(jì)包括三個(gè)部分:DSP上的采集程序及響應(yīng)程序。數(shù)據(jù)采集卡的驅(qū)動(dòng)程序,在驅(qū)動(dòng)程序上構(gòu)建的應(yīng)用程序。驅(qū)動(dòng)程序是實(shí)現(xiàn)DSP與計(jì)算機(jī)通信的關(guān)鍵,本文主要介紹設(shè)備驅(qū)動(dòng)模型及其初始化的設(shè)計(jì)方法。
3.1驅(qū)動(dòng)程序模型
Win2000不支持直接訪問硬件,虛擬驅(qū)動(dòng)器依賴運(yùn)行在內(nèi)核模式的真正的驅(qū)動(dòng)器。內(nèi)核模式驅(qū)動(dòng)程序使用系統(tǒng)級(jí)代碼編寫,且運(yùn)行在內(nèi)核模式下,因?yàn)閮?nèi)核模式允許直接硬件訪問。內(nèi)核驅(qū)動(dòng)程序可被進(jìn)一步分成遺留模式的驅(qū)動(dòng)程序和Windows驅(qū)動(dòng)模式的驅(qū)動(dòng)程序(WDM)。
Windows驅(qū)動(dòng)程序模型(WDM)如圖3所示。圖中左邊是一個(gè)設(shè)備對(duì)象堆棧。設(shè)備對(duì)象是系統(tǒng)為幫助軟件管理硬件而創(chuàng)建的數(shù)據(jù)結(jié)構(gòu)。處于堆棧最底層的設(shè)備對(duì)象稱為物理設(shè)備對(duì)象(PDO)。在設(shè)備對(duì)象堆棧的中間某處有一個(gè)功能設(shè)備對(duì)象(FDO)。FDO的上面和下面還會(huì)有一些過濾設(shè)備對(duì)象。位于FDO上面的過濾設(shè)備對(duì)象稱為上層過濾器,位于FDO下面的過濾器設(shè)備對(duì)象稱為下層過濾器。
總線驅(qū)動(dòng)器的任務(wù)之一就是枚舉總線上的設(shè)備。并為每個(gè)設(shè)備創(chuàng)建一個(gè)PDO。一旦總線驅(qū)動(dòng)器程序檢查到新硬件存在,PnP管理器就創(chuàng)建一個(gè)PDO,創(chuàng)建完P(guān)DO后,PnP管理器參照注冊(cè)表中的信息查找與這個(gè)PDO相關(guān)的過濾器和功能驅(qū)動(dòng)程序。系統(tǒng)安裝程序負(fù)責(zé)這些注冊(cè)表項(xiàng),而驅(qū)動(dòng)程序包中控制硬件安裝的INF文件負(fù)責(zé)添加其他表項(xiàng)。這些表項(xiàng)定義了過濾器和功能驅(qū)動(dòng)程序在堆棧中的次序。
3.2驅(qū)動(dòng)程序的初始化
PnP管理器先裝入硬件需要的驅(qū)動(dòng)程序,然后再調(diào)用驅(qū)動(dòng)程序中的AddDevice函數(shù)。一個(gè)驅(qū)動(dòng)程序可以被多個(gè)類似的硬件使用。但驅(qū)動(dòng)程序的某些全局初始化操作只能在第一次被裝入時(shí)執(zhí)行一次。而DriverEntry例程就是用于這個(gè)目的。DriverEntry是內(nèi)核模式驅(qū)動(dòng)程序主入口點(diǎn)常用的名字。I/O管理器按下面方式調(diào)用該例程:
DriverEntry的第一個(gè)參數(shù)是一個(gè)指針,指向一個(gè)被初始化的驅(qū)動(dòng)程序?qū)ο?,該?duì)象代表用戶的驅(qū)動(dòng)程序。DriverEntry的第二個(gè)參數(shù)是設(shè)備服務(wù)鍵鍵名,其主要工作是把各種函數(shù)指針填入驅(qū)動(dòng)程序?qū)ο?。這些指針為操作系統(tǒng)指明了驅(qū)動(dòng)程序容器中各種子例程的位置。
PnP管理器先裝入最底層的過濾器驅(qū)動(dòng)程序并調(diào)用其AddDevice函數(shù)。該函數(shù)創(chuàng)建一個(gè)FiDO,這樣就在過濾器驅(qū)動(dòng)程序和FiDO之間建立了水平連接。然后AddDevice把PDO連接到FiDO上。PnP管理器繼續(xù)下上執(zhí)行,裝入并調(diào)用每個(gè)底層過濾器、功能驅(qū)動(dòng)程序、高層過濾器,直到完成這個(gè)堆棧。該函數(shù)的原型如下:
DriverObject參數(shù)指向一個(gè)驅(qū)動(dòng)程序?qū)ο?,就是在DriverEntry例程中初始化的那個(gè)驅(qū)動(dòng)程序?qū)ο?。PDO參數(shù)指向設(shè)備堆棧底部的物理設(shè)備對(duì)象。AddDevice函數(shù)的基本任務(wù)是創(chuàng)建一個(gè)設(shè)備對(duì)象并把它連接到以PDO為底的設(shè)備堆棧中。
當(dāng)AddDevice函數(shù)將FDO和FiDO創(chuàng)建且連接好后,PnP管理器分配資源且發(fā)送PRP_MN_START_DEVICE,功能驅(qū)動(dòng)程序需要在這個(gè)IRP上做大量工作,包括分配并配置額外的軟件資源以及為設(shè)備操作做準(zhǔn)備。處理這個(gè)IRP主要通過PnPStartDevice函數(shù)完成。PnPStartDevice函數(shù)首先將IRP傳遞到底層驅(qū)動(dòng)程序。等待完成后,調(diào)用IoGetCurrentIrpStackLocation函數(shù)得到當(dāng)前自己的堆棧單元。I/O堆棧單元的Parameters聯(lián)合有一個(gè)名為StarDevice的子結(jié)構(gòu),該結(jié)構(gòu)包含了資源分配信息。在StarDevice里就可以將分配的資源填充到PDO的設(shè)備擴(kuò)展域中,并且調(diào)用IoConnectInterrupt函數(shù)連接中斷。
層次結(jié)構(gòu)可以使I/O請(qǐng)求過程更加明了。每個(gè)影響到設(shè)備的操作都使用I/O請(qǐng)求包。通常IRP先被送到設(shè)備堆棧的最上層驅(qū)動(dòng)程序,然后逐漸過濾到下面的驅(qū)動(dòng)程序。內(nèi)核通常通過發(fā)送I/O請(qǐng)求包(IRP)來運(yùn)行驅(qū)動(dòng)程序中的代碼。
4結(jié)束語
基于DSP的PCI總線數(shù)據(jù)采集系統(tǒng)充分利用了DSP豐富的內(nèi)部資源、強(qiáng)大的數(shù)字信號(hào)處理能力及PCI總線的高傳輸速度,能夠方便的開發(fā)數(shù)據(jù)壓縮、語音壓縮存儲(chǔ)等新功能信號(hào),并進(jìn)行預(yù)處理與分析處理。通過PCI總線進(jìn)行數(shù)據(jù)傳送可大大提高傳輸速度。本系統(tǒng)適用于高速數(shù)據(jù)的采集和處理以及需要進(jìn)行大量數(shù)據(jù)傳輸?shù)膽?yīng)用場合。