基于PCI總線的高速數(shù)據(jù)采集卡的設(shè)計(jì)
一、引言
數(shù)據(jù)采集是數(shù)字信號(hào)處理中的重要環(huán)節(jié)。針對(duì)不同任務(wù),數(shù)據(jù)采集要達(dá)到的技術(shù)指標(biāo)也不同。對(duì)于瞬態(tài)信號(hào)、雷達(dá)信號(hào)和圖象處理都要求幾MB/S甚至幾十MB/S的速度。而目前用于PC機(jī)的數(shù)據(jù)采集卡大部分是基于ISA總線的,其最大缺點(diǎn)是傳輸速度太低,不能實(shí)現(xiàn)實(shí)時(shí)傳輸[1]。PCI總線是一種目前較為流行的、先進(jìn)的高速同步總線,它的歷史較短,正式的2.2版本于1999年2月發(fā)布。其優(yōu)點(diǎn)在于能夠?qū)崿F(xiàn)設(shè)備間的快速訪問,33MHZ/32位的PCI總線可以實(shí)現(xiàn)132MB/S的數(shù)據(jù)傳輸率,目前已經(jīng)有66MHZ/64位的PCI總線,傳輸速率更快[2]。PCI是獨(dú)立于處理器的同步總線,不需CPU的介入便可進(jìn)行數(shù)據(jù)傳輸。此外,還支持突發(fā)傳遞、即插即用功能。PCI以其突出的性能備受計(jì)算機(jī)和通信界的青睞,將取代以往的總線,成為高檔機(jī)及高性能工作站外設(shè)的基石。
二、數(shù)據(jù)采集卡的結(jié)構(gòu)及性能
本數(shù)據(jù)采集卡主要由一個(gè)PCI總線控制器(PCI9050)[3],一塊采集控制芯片(MAX7128),以及一個(gè)A/D轉(zhuǎn)換模塊構(gòu)成,其具體的結(jié)構(gòu)框圖如圖1所示。該數(shù)據(jù)采集卡的性能可以達(dá)到每秒采樣20M個(gè)樣本,A/D字長(zhǎng)為8位,數(shù)據(jù)傳輸率在20MB/S以上,這對(duì)以往基于ISA總線的數(shù)據(jù)采集系統(tǒng)來說,根本無法實(shí)現(xiàn)。
圖中粗線表示數(shù)據(jù)/地址總線,細(xì)線表示控制線。前端信號(hào)經(jīng)過提取、放大后,進(jìn)入A/D;在CPLD控制下,高速A/D芯片將模擬信號(hào)轉(zhuǎn)為數(shù)字信號(hào),并將數(shù)據(jù)輸出,存儲(chǔ)在雙口RAM中;當(dāng)一組數(shù)據(jù)存儲(chǔ)完畢后,由CPLD通過PCI控制芯片向主機(jī)申請(qǐng)中斷,主機(jī)響應(yīng)中斷后通過PCI控制芯片直接讀取RAM中的數(shù)據(jù)。
三、數(shù)據(jù)采集卡的設(shè)計(jì)方案
1、PCI總線控制器的實(shí)現(xiàn)
由于PCI總線協(xié)議的復(fù)雜度較高,其接口電路實(shí)現(xiàn)起來相對(duì)困難。因此,目前主要有兩種方案來實(shí)現(xiàn)PCI總線的控制:一種是采用專用的PCI接口芯片;另一種是用可嵌入PLD中的IP核。前者由于芯片本身已完成大部分PCI協(xié)議,不需設(shè)計(jì)者精通PCI協(xié)議的各種細(xì)節(jié),開發(fā)周期短,但系統(tǒng)集成度較低,并且費(fèi)用稍高;后者需要設(shè)計(jì)者根據(jù)PCI協(xié)議自己設(shè)計(jì)接口邏輯,要求設(shè)計(jì)人員完全掌握PCI協(xié)議,設(shè)計(jì)的難度相對(duì)較大,但由于可將PCI接口邏輯與用戶邏輯集成在一片PLD中,提高了電路板的集成度和系統(tǒng)的性能。根據(jù)設(shè)計(jì)需求和實(shí)際情況,我們最終選擇了第一種方式,采用了PLX公司的PLX9050作為PCI總線控制器,它即能滿足設(shè)計(jì)需要,并且價(jià)格較低。
PLX9050是PLX公司推出的用于低成本適配器的PCI總線目標(biāo)接口芯片,支持32位、33MHZ的PCI總線規(guī)范。它提供用于適配卡的小型而高性能的PCI總線目標(biāo)接口,主要功能與性能如下:
(1)符合PCI2.1規(guī)范,接口芯片支持低成本從屬適配器;
(2)五個(gè)本地總線地址空間和四個(gè)片選信號(hào)
(3)支持復(fù)用和非復(fù)用8位、16位和32位通用本地總線;
(4)串行EEPROM用于裝載配置信息;
(5)可將兩個(gè)來自本地總線的中斷轉(zhuǎn)換成PCI中斷;
(6)支持本地總線與PCI總線時(shí)鐘異步運(yùn)行。
本設(shè)計(jì)方案采用了非復(fù)用方式(C模式),8位本地總線,兩個(gè)地址空間,一個(gè)本地中斷,接口電路的設(shè)計(jì)很簡(jiǎn)單,在此不作具體介紹。
如果不用PCI9050的默認(rèn)配置(大多數(shù)情況不用),設(shè)計(jì)者需要對(duì)其進(jìn)行配置。配置數(shù)據(jù)預(yù)先燒入EEPROM中,上電后PCI9050自動(dòng)裝入。PCI9050的配置寄存器分為兩類。一類是PCI配置寄存器,另一類是本地配置寄存器。PCI配置寄存器配置PCI9050的PCI總線接口方面的屬性,根據(jù)文檔說明進(jìn)行配置即可。本地配置寄存器配置PCI9050的本地總線接口的屬性,由21個(gè)雙字配置寄存器組成,要根據(jù)實(shí)際開發(fā)的硬件板卡的硬件資源進(jìn)行配置。本地配置寄存器共分六類:本地地址空間范圍寄存器(LASxRR)和擴(kuò)展ROM范圍寄存器、本地地址空間的本地基地址寄存器(重新映射寄存器LASxBA)、本地地址空間總線屬性描述寄存器(LASxBRD)、片選基地址寄存器類(CSxBASE)、中斷控制寄存器、混合控制寄存器。在編寫配置EEPROM時(shí),要注意各屬性寄存器和控制寄存器的設(shè)置不要前后矛盾,地址范圍和基址寄存器的設(shè)置要符合要求。在設(shè)計(jì)中,用了兩個(gè)空間,一個(gè)為存貯器空間(對(duì)應(yīng)雙口RAM),一個(gè)為I/O空間(用于主機(jī)對(duì)采集卡的控制)。
下面以本地地址空間1為例說明將本地地址總線映射到PCI總線的過程。首先設(shè)置LAS3RR,初始化時(shí)PCI9050芯片將從EEPROM中讀出此值,放入PCI基地址寄存器5中,主機(jī)先寫入FFFFFFFFH后,再讀回其值,為1的位表示需要分配地址。例如當(dāng)LAS3RR的內(nèi)容為FFF00000H時(shí),PCI總線給本地地址空間3分配的PCI基地址可能是12300000H(此值是隨機(jī)的)。該例中內(nèi)存區(qū)域的大小是1M。接下來設(shè)置LAS3BA,即填入PCI地址12300000H對(duì)應(yīng)的本地總線地址。例如若填入04000001H。表明PCI總線上對(duì)PCI地址12300000H的訪問亦即對(duì)本地地址04000000H的訪問(注意C模式時(shí)最多只有28條地址線,J模式時(shí)可以有32位)。然后設(shè)置對(duì)應(yīng)的片選寄存器3,以便當(dāng)PCI總線對(duì)本地總線地址空間3的地址進(jìn)行訪問時(shí),片選信號(hào)3有效。其值設(shè)為04080001H,表示片選3的基地址是04080000H,其地址范圍計(jì)算:基地址第一個(gè)不是零的位前面有19個(gè)零,則范圍是2的19次冪再乘以2。這樣當(dāng)PCI的訪問地址落入片選3寄存器定義的范圍內(nèi)時(shí),片選3信號(hào)CS3#有效,用來選擇本地總線上的外圍設(shè)備。最后配置本地地址空間3的本地總線描述寄存器,具體請(qǐng)查看相應(yīng)參考文檔。
2、CPLD的內(nèi)部邏輯設(shè)計(jì)
CPLD中集成了DMA控制器、PCI局部總線及A/D控制等功能,是設(shè)計(jì)中的重點(diǎn)。設(shè)計(jì)中選用ALTERA的EPM7128芯片,其內(nèi)部邏輯框圖如圖2所示。其中,9050接口主要完成與PCI總線的握手,例如根據(jù)9050的時(shí)序要求產(chǎn)生相應(yīng)的響應(yīng)信號(hào)、當(dāng)一組數(shù)據(jù)寫入完畢后產(chǎn)生中斷請(qǐng)求信號(hào)等;時(shí)鐘部分用于產(chǎn)生片內(nèi)各種時(shí)鐘信號(hào);控制部分主要根據(jù)主機(jī)命令開啟(關(guān)閉)A/D及對(duì)CPLD片內(nèi)其它部分進(jìn)行控制;DMA控制器的關(guān)鍵部分是地址控制器,寫入RAM時(shí)地址控制器根據(jù)A/D頻率產(chǎn)生遞增的RAM地址,另外還有RAM片選信號(hào)等其它必要的邏輯。
主機(jī)通過向本地I/O空間的特定地址單元寫入特定值來發(fā)出啟動(dòng)命令,控制部分使A/D相應(yīng)引腳置有效,以啟動(dòng)A/D。A/D數(shù)據(jù)線上數(shù)據(jù)有效的同時(shí),DMA控制器輸出RAM寫地址和RAM片選信號(hào),將數(shù)據(jù)存入RAM。當(dāng)RAM地址大于特定值(此值小于RAM容量)時(shí),PCI局部總線部分產(chǎn)生LINT信號(hào),申請(qǐng)中斷。同時(shí),A/D仍繼續(xù)按地址遞增方式將變換后數(shù)據(jù)存入RAM,當(dāng)RAM寫地址為最高有效地址后,地址控制器歸零,重新向RAM低地址寫入數(shù)據(jù)。由于PCI總線速度比A/D變換速度快,不會(huì)出現(xiàn)未讀數(shù)據(jù)被覆蓋的情況。主機(jī)收到中斷信號(hào)后,進(jìn)入中斷處理程序,從低地址開始讀取數(shù)據(jù)采集卡上的RAM。PLX9050的數(shù)據(jù)線/地址線與RAM的數(shù)據(jù)線/地址線直接相連,讀寫控制線與CPLD相連,中斷過程中,CPLD根據(jù)邏輯產(chǎn)生控制信號(hào), PLX9050直接讀RAM中的數(shù)據(jù)。
四、驅(qū)動(dòng)程序的開發(fā)
在WINDOWS系統(tǒng)下,外設(shè)欲與主機(jī)進(jìn)行數(shù)據(jù)交換,必須有自己的設(shè)備驅(qū)動(dòng)程序。設(shè)備驅(qū)動(dòng)程序的編寫,也是對(duì)設(shè)計(jì)者要求較高的一部分[4]?,F(xiàn)在比較流行的驅(qū)動(dòng)開發(fā)工具有DDK、VtoolsD和WinDriver等,其中WinDriver是專門用于快速開發(fā)PCI/ISA設(shè)備的驅(qū)動(dòng)程序開發(fā)組件。利用它開發(fā)設(shè)備驅(qū)動(dòng)程序不需要熟悉操作系統(tǒng)的內(nèi)核,整個(gè)驅(qū)動(dòng)程序中的所有函數(shù)都是工作在用戶模式下的,通過與WinDriver的.Vxd或.Sys文件交互來達(dá)到驅(qū)動(dòng)硬件的目的。WinDriver的主要特征如下:
(1)提供了從用戶層直接訪問硬件的方法;
(2)無需DDK以及核心態(tài)驅(qū)動(dòng)程序的開發(fā)經(jīng)驗(yàn);
(3)對(duì)主流的PCI接口芯片(PLX、AMCC、V3系列)提供了很好的支持;
(4)支持I/O、DMA、中斷處理,支持PCI、ISA、USB、PCMCIA的開發(fā);
(5)對(duì)于性能要求特別苛刻的部分通過WinDriver提供的API插入到核心態(tài)模式運(yùn)行,以提高執(zhí)行效率。
(6)可利用常見的軟件開發(fā)平臺(tái)(Visual C++、Borland C++、Delphi等);
有兩種利用WinDriver開發(fā)驅(qū)動(dòng)程序的方法,現(xiàn)分別介紹如下:
(1)利用WinDriver自帶的WinDriver Wizard分析用戶開發(fā)的插卡,看其是否像設(shè)計(jì)的那樣正常工作,然后自動(dòng)生成驅(qū)動(dòng)程序的框架代碼 ,修改代碼并加入定制功能,在用戶態(tài)執(zhí)行和調(diào)試代碼并將性能要求苛刻的部分插入到核心態(tài)。
(2)另一種方法是直接應(yīng)用WinDriver提供的API函數(shù)來編寫驅(qū)動(dòng)程序,實(shí)踐證明這種方法比用Wizard生成框架代碼的方法更靈活方便。但要求編程人員對(duì)驅(qū)動(dòng)程序的框架有一定的了解。 一般來說,驅(qū)動(dòng)程序的結(jié)構(gòu)如下所示:
a、打開WinDriver設(shè)備;
b、查找要訪問的PCI設(shè)備;
c、枚舉該設(shè)備的資源(內(nèi)存、I/O、中斷);
d、鎖定該設(shè)備的資源;
e、訪問插卡上的資源(讀寫內(nèi)存、讀寫I/O、響應(yīng)中斷);
f、解鎖資源;
g、關(guān)閉WinDriver設(shè)備。
本設(shè)計(jì)中主要用到中斷調(diào)用。在用戶態(tài),理論上WinDriver能夠處理每秒兩萬次的中斷,若所用RAM為1K,則最高數(shù)據(jù)傳輸速率為20M/B。實(shí)際上,中斷處理速度達(dá)不到2萬次/秒,可考慮增加RAM容量以提高傳輸速度。也可以考慮將速率要求高的部分插入到核心態(tài)運(yùn)行。
以下是一段使用WinDriver開發(fā)的PLX9050的驅(qū)動(dòng)代碼,從中可以看出WinDriver驅(qū)動(dòng)程序的框架結(jié)構(gòu),只要對(duì)其稍作修改就可作為其他PCI卡的一部分。程序中沒有給出變量說明,具體說明請(qǐng)查閱WinDriver的設(shè)計(jì)文檔。
hWD=WD_open();//打開WinDriver設(shè)備,得到一個(gè)文件句柄; Pciscan..searchId.dwVenderId=0x10b5;//PLX公司供貨號(hào); Pciscan..searchId.dwDeviceId=0x9050;//PXL9050的設(shè)備號(hào); WD_PCIScanCards(hWD,&Pciscan)//檢測(cè)PCI插槽上的設(shè)備; PciSlot=Pciscan.cardslot[0];//將插卡的地址傳遞給變量PCICardInfo來 PCICardInfo.pcislot=PciSlot;//檢測(cè)卡上的資源信息; WD_PciGetCardInfo(hWD,&PciCardInfo);//檢測(cè)卡上的資源信息; Card=PciCardInfo.card; Cardreg.card=Card; WD_CardRegister(hWD,&Cardreg);//向系統(tǒng)登記檢測(cè)到的資源信息; Item=Card.Item[0];//將卡上的0號(hào)資源賦給變量Item; If (Item.item==ITEM_MEMORY) RegAddress=Item.I.Mem.dwTrans.Addr;//得到PCI卡上的內(nèi)存映射到用戶態(tài)的地址; Trans.dwport=RegAddress; Trans.CmdTrans=RM_B;//設(shè)為內(nèi)存字節(jié)讀命令; Trans.fAutoinc=True; WD_Transfer(hWD,&Trans)//進(jìn)行數(shù)據(jù)傳遞; WD_CardUnregister(hWD,&Cardreg)//釋放注冊(cè)到的資源; WD_Close(hWD)//關(guān)閉WinDriver設(shè)備
五、結(jié)束語
現(xiàn)在A/D芯片的采樣速率可達(dá)幾百兆次/秒,數(shù)據(jù)采集的速度取決于與計(jì)算機(jī)的接口和設(shè)備驅(qū)動(dòng)程序的編寫。雖然PCI9050具有簡(jiǎn)單的用戶接口和低廉的價(jià)格,不失為低成本PCI接口控制芯片的較佳選擇,但仍會(huì)成為超高速數(shù)據(jù)采集卡瓶頸。PCI9030是PLX公司最新推出的PCI芯片,與PCI9050具有相似的結(jié)構(gòu),支持高達(dá)66MHZ的局部總線時(shí)鐘,將能滿足超高速的需要。利用Windriver編寫的設(shè)備驅(qū)動(dòng),不是真正的核心態(tài)程序,效率不是太高,對(duì)于超高速外設(shè),可以考慮用微軟的DDK編寫高效的核心態(tài)程序。總之,利用PCI總線的高速特性實(shí)時(shí)傳輸和存貯采集數(shù)據(jù),有效的解決了數(shù)據(jù)傳輸和處理的實(shí)時(shí)性。PCI總線可以滿足從高速到超高速不同等級(jí)數(shù)據(jù)采集卡的需要,基于PCI總線的數(shù)據(jù)采集系統(tǒng)有很大的發(fā)展空間,十分廣闊的前景。
提交
超越傳統(tǒng)直覺,MATLAB/Simulink助力重型機(jī)械的智能化轉(zhuǎn)型
新大陸自動(dòng)識(shí)別精彩亮相2024華南國際工業(yè)博覽會(huì)
派拓網(wǎng)絡(luò)被Forrester評(píng)為XDR領(lǐng)域領(lǐng)導(dǎo)者
智能工控,存儲(chǔ)強(qiáng)基 | ??低晭砭手黝}演講
展會(huì)|Lubeworks路博流體供料系統(tǒng)精彩亮相AMTS展會(huì)