摘 要:在闡述相關(guān)設(shè)計要求的基礎(chǔ)上,介紹了一種用于測試目的、基于PCI總線的模擬高速CCD數(shù)據(jù)輸出系統(tǒng)的開發(fā)過程,包括系統(tǒng)的硬件設(shè)計和相關(guān)軟件的開發(fā),著重對設(shè)計思路和方法做了詳細(xì)介紹。
關(guān)鍵詞:PCI總線 PCI 9054 WinDriver
[b][align=center]High Speed Data Outputting System Based on PCI Bus
Pi Hai-feng Li Zi-tian Xu Xiu-zhen Xue Li-jun[/align][/b]
Abstract: Followed the expatiation of design requirement, the development process for a system based on PCI bus is expounded, which is assumed as CCD high speed data outputting system and used for testing. The design idea and method is emphasized.
Key words: PCI bus PCI9054 WinDriver
光譜成像儀是集光學(xué)、光譜學(xué)、精密機(jī)械、電子技術(shù)及計算機(jī)技術(shù)于一體的新型探測儀器。其中,CCD(charge coupled device)成像系統(tǒng),將采集到的光譜信息轉(zhuǎn)換為可處理、存儲的電信號。由于數(shù)據(jù)量龐大,CCD成像系統(tǒng)所采集的數(shù)據(jù)在存儲之前通常都要經(jīng)過壓縮處理。在光譜成像儀的研制過程中,需要這樣一種測試設(shè)備,它模擬光譜成像儀CCD成像系統(tǒng),對外持續(xù)輸出已知數(shù)據(jù)及時序信號。通過將已知的發(fā)送數(shù)據(jù),和經(jīng)過壓縮后接收到的數(shù)據(jù)進(jìn)行對比,可以量化地檢測數(shù)據(jù)壓縮系統(tǒng)的性能指標(biāo)。
0. 系統(tǒng)要求及設(shè)計思路
本文中高速數(shù)據(jù)輸出卡的功能是完成對光譜成像儀CCD系統(tǒng)數(shù)據(jù)輸出過程的模擬。光譜成像儀CCD系統(tǒng)的數(shù)據(jù)輸出格式如下:
[align=center]
圖1 光譜成像儀CCD系統(tǒng)數(shù)據(jù)輸出格式[/align]
其中,圖象數(shù)據(jù)與輔助數(shù)據(jù)分時共用數(shù)據(jù)線,在幀正程傳送256(行) x 512(列) x 12bit圖像數(shù)據(jù),在幀逆程傳送128x12bit輔助數(shù)據(jù),一幀周期的數(shù)據(jù)共有131200x12bit,而一幅完整的光譜圖象要包含512幀數(shù)據(jù)。系統(tǒng)輸出時鐘為8.9M Hz,全部輸出信號為LVDS電平接口。
為達(dá)到模擬效果,要求數(shù)據(jù)輸出卡以相同的數(shù)據(jù)格式及接口,持續(xù)不間斷地對外輸出數(shù)據(jù);同時,為測試后續(xù)數(shù)據(jù)壓縮系統(tǒng)所采用壓縮算法針對不同特性圖像數(shù)據(jù)的有效性,還要求數(shù)據(jù)輸出卡能夠較為方便的更換輸出數(shù)據(jù)。
針對以上系統(tǒng)要求,選用了基于PCI總線的設(shè)計方案:將要輸出的圖像數(shù)據(jù)文件放置于特定內(nèi)存區(qū)中,作為為數(shù)據(jù)源,根據(jù)計算機(jī)控制,循環(huán)對該數(shù)據(jù)文件所在內(nèi)存區(qū)進(jìn)行讀取,并將讀取的數(shù)據(jù)向外發(fā)送。從而達(dá)到模擬CCD系統(tǒng)數(shù)據(jù)輸出的效果。如果要更換輸出數(shù)據(jù),只需將新的數(shù)據(jù)重新置入內(nèi)存區(qū),具有較強(qiáng)的靈活性,使測試過程更為簡潔。
1. 系統(tǒng)的硬件設(shè)計
高速數(shù)據(jù)輸出卡的硬件結(jié)構(gòu)框圖如下圖所示,PCI總線設(shè)備接口選用專用接口芯片PCI 9054,系統(tǒng)時鐘信號分別來自計算機(jī)所提供的PCI時鐘和卡自身所帶的8.9M Hz晶振。整個過程的時序控制由可編程邏輯器件完成,由其控制對PCI 9054產(chǎn)生定時中斷,PCI 9054響應(yīng)這個外部中斷,并在PCI總線上對計算機(jī)發(fā)出PCI中斷信號,當(dāng)上位機(jī)檢測到PCI 9054這個中斷信號后,就立即控制PCI 9054以連續(xù)DMA方式從上位機(jī)指定的內(nèi)存區(qū)域讀取數(shù)據(jù),并向外發(fā)送至大容量FIFO進(jìn)行數(shù)據(jù)緩沖。FIFO中的12位的圖象數(shù)據(jù)以及數(shù)據(jù)時鐘、幀同步兩個時序信號經(jīng)過LVDS驅(qū)動器轉(zhuǎn)換為差分信號,發(fā)送至后續(xù)設(shè)備進(jìn)行處理。
[align=center]
圖2 高速數(shù)據(jù)輸出卡硬件結(jié)構(gòu)框圖[/align]
在本系統(tǒng)中,將PCI 9054設(shè)定為C工作模式,即32位地址、32位數(shù)據(jù)、總線非復(fù)用工作模式。由于PCI 9054從上位機(jī)讀取數(shù)據(jù)均發(fā)送到FIFO一個設(shè)備,因此其Local端地址線不起任何作用,而數(shù)據(jù)線僅選用高12位。此外,在本設(shè)計中采用串行EEPROM 93LC56B對PCI 9054進(jìn)行配置,在上電后,PCI 9054自動讀取93LC56B中的數(shù)據(jù),設(shè)置相關(guān)寄存器,完成初始化操作。
鑒于本系統(tǒng)高速,大數(shù)據(jù)量的特點(diǎn),一般常用的FIFO無法適應(yīng)要求,因此選用了384K x 8 bit的視頻幀存儲器AL422B,作為數(shù)據(jù)緩沖。AL422B由3M位的DRAM組成,工作頻率最高可達(dá)50 MHz,有獨(dú)立的輸入、輸出接口及讀寫時鐘,可同時進(jìn)行讀寫操作;/RE,/WR,/REST及/WRST四個輸入信號分別控制AL422B的讀、寫與讀指針、寫指針復(fù)位操作。本系統(tǒng)中,將兩片AL422B并聯(lián),擴(kuò)展為384K x 16 bit的FIFO存儲器。
整個過程的時序控制由可編程邏輯器件完成,它的工作包括:向PCI 9054發(fā)出定時中斷信號,由其向上位計算機(jī)申請中斷;控制數(shù)據(jù)緩沖器AL422B的讀寫時序,包括其初始化復(fù)位操作;產(chǎn)生PCI 9054所需的時序信號。
2 系統(tǒng)軟件開發(fā)
整個系統(tǒng)的軟件包括PCI 9054驅(qū)動程序與上位機(jī)應(yīng)用程序,圖像數(shù)據(jù)預(yù)處理(格式轉(zhuǎn)換)程序及可編程邏輯器件CPLD的VHLD程序。在此,僅對PCI 9054驅(qū)動程序與應(yīng)用程序的開發(fā)作以簡要介紹。
WinDriver是Jungo公司出品的開發(fā)工具包,它支持的總線結(jié)構(gòu)包括PCI/CardBus/ISA/ISAPnP/EISA/CompactPCI和USB,可大大簡化生成硬件驅(qū)動程序和開發(fā)應(yīng)用程序的過程。本次開發(fā)使用的是WinDriver 6.03版。
WinDriver已經(jīng)內(nèi)置了包括PCI 9054在內(nèi)的多種PCI/USB接口芯片的驅(qū)動程序,因此只需將設(shè)計完成的PCI卡插入計算機(jī),然后運(yùn)行Windriver的向?qū)С绦颍⒃诹斜碇羞x擇相應(yīng)的PCI接口芯片,只要硬件接口連接正確,即可生成相應(yīng)的 .inf文件。inf文件包含了設(shè)備類型、生產(chǎn)廠商、型號及拷貝文件的路徑等PCI硬件設(shè)備的信息,通過inf文件,Windows才可以找到PCI卡并完成對其驅(qū)動程序的安裝。
[align=center]
圖3 使用WinDriver生成PCI卡硬件設(shè)備信息文件(.inf文件)界面[/align]
上位機(jī)軟件開發(fā)采用用戶模式,其流程圖如圖4所示:
[align=center]
圖4 上位機(jī)軟件流程圖[/align]
由于AL422B并不象其它通用FIFO那樣能提供數(shù)據(jù)空、半滿、全滿等邏輯信號,因此只能根據(jù)其數(shù)據(jù)發(fā)送速率、FIFO容量及PCI總線速率,來設(shè)定一個定時中斷。這個定時中斷設(shè)定為數(shù)據(jù)輸出卡向外發(fā)送一幀數(shù)據(jù)所需的時間,約為14.8ms,即數(shù)據(jù)輸出卡每向外發(fā)送一幀數(shù)據(jù),必定會從上位機(jī)緩沖區(qū)中讀入一幀數(shù)據(jù)。由于在啟動定時中斷前,數(shù)據(jù)輸出卡已經(jīng)預(yù)先讀取一幀,因此,即便上位機(jī)對定時中斷的響應(yīng)有一定延遲,也不會出現(xiàn)FIFO被讀空的情況。同時,由于FIFO的深度為384K,近似于3幀的數(shù)據(jù)量,因此也不可能出現(xiàn)FIFO被寫滿,而造成數(shù)據(jù)丟失的情況。定時中斷由卡上的CPLD根據(jù)輸入時鐘精確產(chǎn)生,在定時中斷服務(wù)程序中,程序依次讀取一幅完整光譜圖像中的一幀數(shù)據(jù),若全部512幀數(shù)據(jù)被讀完,則指針歸零,從頭再次開始,以此保證光譜圖像數(shù)據(jù)的循環(huán)發(fā)送。下面給出了中斷服務(wù)程序的部分源代碼。WinDriver針對PCI 9054芯片,提供了大量API函數(shù)可供調(diào)用,因此使對PCI 9054的編程操作非常方便。
void WINAPI PLX_IntHandlerRoutine(P9054_HANDLE hPlx, P9054_INT_RESULT *intResult) ——中斷服務(wù)程序
?。?DWORD dwIntStatus;
P9054_DMAReadWriteBlock(hPlx,0x0,(PVOID)pBuffer,SEND_BLOCK_SIZE,FALSE,P9054_MODE_WORD,P9054_DMA_CHANNEL_0);
—— 控制PCI 9054以DMA方式從上位機(jī)緩沖區(qū)讀取1幀數(shù)據(jù)
if(block_num
?。?pBuffer=pBuffer+SEND_BLOCK_SIZE;
block_num++;
?。?——每發(fā)送1幀數(shù)據(jù)后,數(shù)據(jù)指針向后移動一幀的數(shù)據(jù)量,已發(fā)送幀計數(shù)加1
else
?。?pBuffer=Buffer; block_num=0; ——512幀發(fā)送完后,指針回零,從而實(shí)現(xiàn)512幀數(shù)據(jù)的循環(huán)讀取
?。?
……
dwIntStatus = P9054_ReadReg (hPlx, P9054_INTCSR);
P9054_WriteReg (hPlx, P9054_INTCSR, dwIntStatus | 0x00000d00);
——開中斷,中斷服務(wù)程序結(jié)束,等待下一次中斷
?。?
3. 測試結(jié)果和結(jié)論
將高速數(shù)據(jù)輸出卡安裝在計算機(jī)上,運(yùn)行應(yīng)用程序,即可使數(shù)據(jù)輸出卡進(jìn)行工作。下圖是通過示波器采集的數(shù)據(jù)輸出卡上部分信號的時序圖。
[align=center]
圖5 PCI高速數(shù)據(jù)輸出卡部分信號時序圖[/align]
其中,LINTi#為PCI 9054的局域端中斷輸入,由CPLD的定時中斷信號產(chǎn)生;INTA為PCI 9054在PCI總線上輸出的中斷請求信號;WE\為數(shù)據(jù)輸出卡上FIFO的寫使能信號,當(dāng)其有效時,向FIFO寫入數(shù)據(jù);INT_EN\為定時中斷使能信號,由它控制CPLD開始產(chǎn)生定時中斷。有圖中可看出,在預(yù)讀取一幀數(shù)據(jù)后,定時中斷使能信號有效,CPLD開始向PCI 9054發(fā)出定時中斷信號;PCI 9054接收到此信號后,隨即通過PCI總線向上位計算機(jī)請求中斷;在經(jīng)過延時后,中斷被響應(yīng);在中斷服務(wù)程序中,數(shù)據(jù)輸出卡從計算機(jī)內(nèi)存中讀出數(shù)據(jù),讀取一幀數(shù)據(jù)的時間是14.6 ms。
由時序圖中可以看到,數(shù)據(jù)輸出卡讀取一幀數(shù)據(jù)的時間(即WE\信號有效時間),小于向外發(fā)送一幀數(shù)據(jù)的時間(即定時中斷間隔),由此可保證FIFO內(nèi)數(shù)據(jù)不會被讀空。根據(jù)以上的試驗結(jié)果,可以充分說明高速數(shù)據(jù)輸出卡已實(shí)現(xiàn)了設(shè)計要求。
在高速數(shù)據(jù)輸出卡的開發(fā)過程中,采用了專用PCI接口芯片PCI 9054和總線軟件開發(fā)工具包WinDriver,能使我們從繁瑣復(fù)雜的PCI協(xié)議和底層驅(qū)動程序中擺脫出來,將更多的精力投入硬件電路設(shè)計及軟件功能的實(shí)現(xiàn),大大節(jié)省了開發(fā)周期。目前此卡已用于實(shí)際的測試工作中,圓滿完成了設(shè)計要求。
參考文獻(xiàn):
[1]. 李貴山,陳金鵬. PCI局部總線及應(yīng)用. 西安電子科技大學(xué)出版社, 2003年
[2]. PCI Local Bus Specification,Revision 2.2. December 18, 1998
[3]. PCI 9054 Data Book,Version 2.1. http://www.plxtech.com January 2000
[4]. WinDriver v6.00 User’s Guide. Jungo Ltd, 17th March 2003
[5]. 李愛玲,張伯珩等. 基于CPLD的CCD相機(jī)圖像信號模擬器的設(shè)計 《微計算機(jī)信息》 2006年第1-2期 P151-152、P162