??? 摘 要:依據(jù)PXI總線規(guī)范,應(yīng)用PCI9054總線控制器" title="總線控制器">總線控制器實(shí)現(xiàn)PXI總線接口,通過FPGA控制PCI9054總線控制器局部總線" title="局部總線">局部總線和FIFO的讀寫端口來實(shí)現(xiàn)高速數(shù)字" title="高速數(shù)字">高速數(shù)字輸入輸出。測試結(jié)果表明,該板卡能夠穩(wěn)定地傳輸不低16MHz的高速數(shù)字信號。
??? 關(guān)鍵詞: PXI; 數(shù)字輸入輸出; PCI9054; FPGA
?
??? PXI是PCI在儀器領(lǐng)域的擴(kuò)展(PCI Extension for Instrumentation),其技術(shù)規(guī)范是NI公司于 1997年9月1日推出的,現(xiàn)已有60多家聯(lián)盟[1]。PCI局部總線可以在33MHz和 32位數(shù)據(jù)通路的條件下達(dá)到峰值132Mb/s的帶寬,在66MHz和 64位數(shù)據(jù)通路的條件下達(dá)到峰值528Mb/s的帶寬[2]。PXI吸收了VXI的優(yōu)點(diǎn),同時(shí)受益于Compact PCI(CPCI),因而速度更快、結(jié)構(gòu)堅(jiān)固緊湊、系統(tǒng)可靠穩(wěn)定,在射頻和微波頻帶以下的低、中高頻段可以替代VXI而且價(jià)格優(yōu)勢明顯,深受廣大用戶歡迎,目前正朝氣蓬勃地向商用與軍用領(lǐng)域拓展。
??? PXI高速數(shù)字I/O卡是實(shí)現(xiàn)各種功能復(fù)雜的高速傳輸模塊的最基本單元。對它的深入研究設(shè)計(jì)有助于更好地理解PXI總線及其接口設(shè)計(jì)" title="接口設(shè)計(jì)">接口設(shè)計(jì)。
1 系統(tǒng)結(jié)構(gòu)與設(shè)計(jì)原理
??? 一個完整的數(shù)字I/O系統(tǒng)由PCI總線控制器、FPGA、FIFO等模塊組成。PCI總線控制器實(shí)現(xiàn)PXI總線接口,F(xiàn)IFO作為數(shù)據(jù)輸入輸出的緩存器件,經(jīng)FPGA控制后實(shí)現(xiàn)局部總線數(shù)據(jù)的讀寫操作。具體的結(jié)構(gòu)如圖1。
?
??? 數(shù)據(jù)傳輸流程為:輸入時(shí),外部數(shù)據(jù)通過寫入FIFO后讀出傳入PCI9054局部總線,經(jīng)PCI9054傳入到PXI總線;輸出時(shí),數(shù)據(jù)經(jīng)PXI總線送人PCI9054后經(jīng)局部總線傳到輸出FIFO后,通過讀取FIFO實(shí)現(xiàn)數(shù)據(jù)的輸出。整個傳輸過程的時(shí)序由FPGA嚴(yán)格控制。
2 硬件設(shè)計(jì)
??? 硬件設(shè)計(jì)包括接口設(shè)計(jì)和局部總線設(shè)計(jì)。
2.1接口設(shè)計(jì)
??? 當(dāng)前國際上實(shí)現(xiàn)PXI接口主要有兩種途徑:一種是直接通過FPGA進(jìn)行接口設(shè)計(jì),主要是調(diào)用FPGA中的PCI宏單元。另一種是直接通過專用的PCI接口芯片來實(shí)現(xiàn)接口設(shè)計(jì)。前一種方法要求對PCI總線規(guī)范十分了解,調(diào)試?yán)щy較大,開發(fā)周期較長,而直接購買PCI的IP核又太貴,所以這里采用第二種方案。目前提供PCI 通訊芯片的廠家很多,比較成熟的接口芯片有PLX公司的PCI90XX系列、AMCC公司的S59XX系列以及CYPRESS公司的CY7C094XX系列。
??? PCI9054是由美國PLX公司生產(chǎn)的先進(jìn)的PCI I/O Accelerator;符合PCI2.2協(xié)議,采用了先進(jìn)的數(shù)據(jù)流水線結(jié)構(gòu)技術(shù);局部總線提供了M、C、J 三種工作模式以適應(yīng)不同的局部處理器;具有可選的串行EEPROM接口,本地總線時(shí)鐘可和PCI時(shí)鐘異步。PCI9054內(nèi)部有6種可編程的FIFO,以實(shí)現(xiàn)零等待突發(fā)傳輸及本地總線與PCI總線之間的異步操作;本地時(shí)鐘可以達(dá)到 50MHz,且與 PCI 時(shí)鐘異步。它支持突發(fā)以及DMA傳輸,能在主模式和從模式、DMA模式下工作,是應(yīng)用非常廣泛的一款PCI接口芯片[3]。PXI接口框圖如圖2。
?
??? 數(shù)據(jù)總線和地址總線是復(fù)用的,分別為AD0-AD31;控制總線主要包括C/BE[0:3]#、FRAME#、IRDY#、DEVSEL#、TRDY#、STOP#、IDSEL#、LOCK#、PAR#、PEER#、SERR#、REQ#、GNT#等,在硬件連接時(shí)只要將PXI接口和PCI9054對應(yīng)的這些端口相連即可。與串行EEPROM對應(yīng)的端口為CS、SK、DI、DO,在電路中DI和DO是物理連接的,EEPROM的EEDI/EEDO引腳的配置要注意:當(dāng)不安裝EEPROM時(shí),該引腳一定要下拉,用1kΩ的下拉電阻即可,此時(shí)啟動后9054會按默認(rèn)值進(jìn)行配置;當(dāng)安裝空白的EEPROM時(shí),該引腳需要上拉;當(dāng)安裝燒錄好的EEPROM時(shí),該引腳需要上拉。
2.2局部總線設(shè)計(jì)
??? 由圖2可知,PCI9054的局部總線分別與FPGA和功能模塊相連。由于在功能模塊中用到的是FIFO緩存器,所以不需要局部地址總線,只需將數(shù)據(jù)總線分別連接到兩塊FIFO中,局部總線的控制信號和FIFO的控制信號連接到FPGA中,通過FPGA來控制FIFO的讀寫。為了靈活地改變數(shù)據(jù)的傳輸速率,在FPGA中調(diào)用鎖相環(huán)來給FIFO分配讀寫時(shí)鐘。局部總線的電路連線如圖3。
?
??? 為了配合外部電路的速度和匹配要求,在這里應(yīng)用了Altera的庫生成了PLL(Phase Locked Loop)。PLL具有低的時(shí)鐘偏移,應(yīng)用靈活,通過調(diào)整比例關(guān)系就可以得到所需要的時(shí)鐘頻率。其symbol如圖4,時(shí)序仿真如圖5。
?
?
??? 通過設(shè)置寄存器DMAMODE的第7位可以使能或禁止外部等待輸入控制信號READY#,以使PCI9054工作于外部等待或內(nèi)部等待狀態(tài)。當(dāng)READY#被禁止時(shí),則在每次傳輸?shù)牡刂泛蛿?shù)據(jù)間插入等待狀態(tài),其數(shù)目由內(nèi)部的等待狀態(tài)計(jì)數(shù)器決定;若READY#使能,則READY#信號的持續(xù)時(shí)鐘周期決定了附加的等待狀態(tài)。本設(shè)計(jì)采用C模式READY#使能方式。根據(jù)PCI9054的時(shí)序圖(見PCI9054 Data Book5.6節(jié)),每次數(shù)據(jù)傳輸時(shí),首先發(fā)出地址選通信號ADS#,當(dāng)總線準(zhǔn)備好則使READY#信號有效,開始數(shù)據(jù)傳輸;否則總線處于等待狀態(tài)。數(shù)據(jù)一旦開始傳輸,局部總線控制器將判斷傳輸結(jié)束標(biāo)志信號BLAST#,若BLAST#為高電平,則發(fā)出有效的READY#信號,數(shù)據(jù)持續(xù)傳輸,否則,在發(fā)出最后一個READY#信號后結(jié)束數(shù)據(jù)傳輸。狀態(tài)機(jī)轉(zhuǎn)換的具體過程如表1。
?
??? 本設(shè)計(jì)采用的是ALTERA公司的FPGA器件EP1C6,在Quartus Ⅱ軟件下編寫了整個的程序,軟件仿真結(jié)果如圖6。
?
3 驅(qū)動程序設(shè)計(jì)
??? 在Windows操作系統(tǒng)中,為了保證系統(tǒng)的安全性和可移植性,限制了應(yīng)用程序?qū)τ布牟僮鳎绕鋀indows 2000和Windows XP均不支持直接對系統(tǒng)的硬件資源的操作。因而在設(shè)計(jì)開發(fā)PCI設(shè)備時(shí),需要開發(fā)相應(yīng)的驅(qū)動程序來實(shí)現(xiàn)對PCI設(shè)備的操作,用戶應(yīng)用程序通過驅(qū)動程序來訪問PCI設(shè)備。
??? 開發(fā)WDM驅(qū)動程序的主要工具是微軟為各操作系統(tǒng)提供的開發(fā)軟件包DDK(Device Driver Kits) ,該軟件包為驅(qū)動程序開發(fā)者提供了用于驅(qū)動程序開發(fā)的資源文件、編譯連接程序、開發(fā)技術(shù)文檔等。還有第三方提供的開發(fā)工具:NuMega公司的DriverStudio和Jungo公司的WinDriver,這些工具是在DDK的基礎(chǔ)上為方便開發(fā)用戶而開發(fā)的工具[4]。在使用中,雖然利用DDK開發(fā)驅(qū)動程序難度較大,但是代碼非常簡潔,結(jié)構(gòu)清晰,效率也高。利用第三方開發(fā)工具使用簡單,開發(fā)速度較快,但對于驅(qū)動程序的理解和深入開發(fā)不如DDK。因此選擇DDK開發(fā)PCI設(shè)備驅(qū)動程序" title="設(shè)備驅(qū)動程序">設(shè)備驅(qū)動程序,雖然開始會覺得非常復(fù)雜,但從執(zhí)行效率和功能上會更有利。
??? 在WDM中,采用了分層的驅(qū)動程序體系結(jié)構(gòu),總線驅(qū)動程序或類驅(qū)動程序在最底層直接與設(shè)備打交道,設(shè)備功能驅(qū)動程序在上層通過與低層驅(qū)動程序打交道,實(shí)現(xiàn)設(shè)備的功能,中間還可以有類過濾驅(qū)動程序或設(shè)備過濾驅(qū)動程序用于數(shù)據(jù)的過濾或轉(zhuǎn)換。在PCI總線的驅(qū)動程序?qū)又?,其層次圖如圖7。
?
??? 在實(shí)際開發(fā)中,一般無需分很多層次,只需要開發(fā)一個設(shè)備驅(qū)動程序即可。設(shè)備驅(qū)動程序直接與PCI總線驅(qū)動程序打交道,進(jìn)行硬件操作,以實(shí)現(xiàn)PCI設(shè)備的功能。
4 PCB設(shè)計(jì)要點(diǎn)和硬件測試結(jié)果
??? 為了提高設(shè)備工作穩(wěn)定性和抗干擾性,在布局布線時(shí)采取了如下措施:采用四層板,模擬地與數(shù)字地用磁珠隔離;為了避免信號線間串?dāng)_,兩條信號線應(yīng)采取垂直交叉方式,要拉開兩線的距離,并在兩條平行的信號線之間增設(shè)一條線;采用鐵氧體磁心加電容濾波的方法對每組電源分別去耦,以取得最好的濾波效果。
??? 最后對設(shè)計(jì)出來的板卡進(jìn)行了硬件測試,在應(yīng)用程序中編寫如下簡單程序:
??? void CPDC4000DemoDlg::OnBlockDmaPciToLocalDemo() //DMA模式輸出數(shù)據(jù)
??? {
???????? unsigned char pData[0x100];//待輸出的數(shù)組
?????? for (int i = 0; i < 0x100; i ++)
?????? {
???????????????????? pData[i] = i + 0x0;
???? }
???? m_iStatus = STATUS_BLOCK_WRITE;
???? BlockDmaPciToLocal(pData, 0x100);
??? }
??? 通過邏輯分析儀測量板卡的輸出波形,得到輸出低8位結(jié)果,見圖8。波形符合寫入的數(shù)據(jù),數(shù)據(jù)輸出的速率為16MHz。
?
??? 本模塊已達(dá)到預(yù)定的設(shè)計(jì)指標(biāo),運(yùn)行穩(wěn)定可靠。該模塊的優(yōu)點(diǎn)是設(shè)計(jì)簡單,開發(fā)周期短,開發(fā)成本低。缺點(diǎn)是功能比較單一。如有需要,可以將該模塊擴(kuò)展為功能更為復(fù)雜的應(yīng)用單元。隨著PXI總線的不斷發(fā)展,基于PXI總線的產(chǎn)品設(shè)計(jì)具有十分廣闊的前景。
參考文獻(xiàn)
[1]? National Instrumen.The PXI System Architecture[S],1997.
[2]? 尹勇,李寧.PCI總線設(shè)備開發(fā)寶典.北京:北京航空航天大學(xué)出版社, 2005.
[3]? Plx Technology. PCI9054 Data Book, Version 2.1. Plx Technology, 2000.
[4]? CANT C.Windows WDM設(shè)備驅(qū)動程序開發(fā)指南.孫義,譯. 北京:機(jī)械工業(yè)出版社,2000.