張 鑫,王曉東,曲洪豐,薛盼盼
(1.中國(guó)科學(xué)院長(zhǎng)春光學(xué)精密機(jī)械與物理研究所,吉林 長(zhǎng)春 130033;2.中國(guó)科學(xué)院研究生院,北京 100039)
CCD是Charge Coupled Device(電荷耦合器件)的簡(jiǎn)稱。被廣泛應(yīng)用于工業(yè)檢測(cè)、醫(yī)療儀器、天文觀測(cè)、航天遙感等成像領(lǐng)域[1]。CCD相機(jī)的數(shù)據(jù)傳輸電路主要采用USB或Camera Link接口進(jìn)行設(shè)計(jì)。USB是Universal Serial BUS(通用串行總線)的縮寫,具有連接簡(jiǎn)單,易于擴(kuò)展,支持熱插拔和標(biāo)準(zhǔn)統(tǒng)一等優(yōu)點(diǎn)[2],是目前使用最廣泛的計(jì)算機(jī)外設(shè)接口。Camera Link接口以Channel Link芯片組為硬件基礎(chǔ),定義了基于圖像采集系統(tǒng)的信號(hào)和接口形式,具有傳輸距離遠(yuǎn)(使用光纖傳輸時(shí)可達(dá)幾千米),速率高(最高達(dá)650 Mbit/s)等優(yōu)點(diǎn),被廣泛應(yīng)用于圖像數(shù)據(jù)采集[3]。然而使用USB作為數(shù)據(jù)傳輸接口時(shí),傳輸速率受上位機(jī)的硬件配置,軟件的運(yùn)行速度以及傳輸距離等因素制約,實(shí)際應(yīng)用時(shí)的傳輸速率遠(yuǎn)低于理論速度(480 Mbit/s),不能滿足高速數(shù)據(jù)傳輸?shù)囊蟆J褂肅amera Link接口進(jìn)行數(shù)據(jù)傳輸時(shí),上位機(jī)需要配置專用的圖像采集卡,成本高,且使用不方便,不具備通用性。
與目前的CCD相機(jī)數(shù)據(jù)傳輸時(shí),只單獨(dú)采用USB和Camera Link接口不同,設(shè)計(jì)中將兩種接口相結(jié)合,使上位機(jī)可以方便地通過(guò)USB接口發(fā)送命令,對(duì)CCD相機(jī)進(jìn)行控制和配置。而且可以根據(jù)不同的應(yīng)用要求,在傳輸速率較低時(shí),選擇USB接口進(jìn)行輸出;在USB接口不能滿足傳輸要求的高速數(shù)據(jù)采集時(shí),使用Camera Link接口。設(shè)計(jì)的系統(tǒng)結(jié)合了兩種接口的優(yōu)點(diǎn),使CCD相機(jī)的數(shù)據(jù)傳輸變得簡(jiǎn)單,方便,靈活,可靠。
FPGA采用Xilinx公司的XC3S400-PQ208。它的系統(tǒng)門數(shù)為40萬(wàn),提供288 kbyte的內(nèi)部RAM和141個(gè)用戶I/O引腳。FPGA的資源能夠滿足硬件設(shè)計(jì)和接口芯片管腳連接的要求,以及復(fù)雜邏輯電路的設(shè)計(jì)要求。
USB的接口芯片采用的是Cypress公司EZ-USB FX2系列的CY7C68013A。芯片內(nèi)部集成有1個(gè)增強(qiáng)型的8051核、1個(gè)智能USB串行接口引擎(SIE)、1個(gè)USB收發(fā)器、16 kbyte RAM和4 kbyte FIFO等。芯片支持USB2.0協(xié)議,支持控制傳輸、中斷傳輸、批量傳輸和同步傳輸模式等,且可以通過(guò)固件程序,按照使用要求對(duì)CY7C68013A進(jìn)行配置。將CY7C68013A配置成Slave FIFO模式時(shí),控制電路可以像使用普通FIFO一樣對(duì)CY7C68013A端點(diǎn)的數(shù)據(jù)緩存進(jìn)行讀寫操作。
Camera Link接口芯片采用的是DS90CR287。DS90 CR287最高的像素時(shí)鐘為85 MHz,可以將并行的28 bit數(shù)據(jù)以及時(shí)鐘信號(hào)轉(zhuǎn)化為4路串行LVDS信號(hào)和1路同步LVDS時(shí)鐘信號(hào)進(jìn)行發(fā)送,而且能夠根據(jù)數(shù)據(jù)引腳連接的不同,將Camera Link接口配置成不同的傳輸模式。
數(shù)據(jù)傳輸系統(tǒng)硬件結(jié)構(gòu)如圖1所示。

圖1 硬件電路結(jié)構(gòu)
使用FPGA作為控制芯片,接收CCD相機(jī)發(fā)送的數(shù)據(jù),進(jìn)行緩存,然后控制接口芯片向上位機(jī)進(jìn)行發(fā)送。由于數(shù)據(jù)傳輸系統(tǒng)對(duì)CCD相機(jī)輸入的圖像數(shù)據(jù)是實(shí)時(shí)發(fā)送的,緩存的作用為匹配數(shù)據(jù)輸入和輸出之間速率的不同。因此設(shè)計(jì)中沒(méi)有使用外部緩存,而是將FPGA提供的內(nèi)部RAM配置成雙端口FIFO,實(shí)現(xiàn)數(shù)據(jù)的緩存,降低了設(shè)計(jì)難度。使用USB接口進(jìn)行數(shù)據(jù)傳輸時(shí),F(xiàn)PGA通過(guò)標(biāo)志信號(hào)(FLAGA,F(xiàn)LAGC),端點(diǎn)選擇信號(hào)(FIFOADDR),讀控制信號(hào)(SLRD),和寫控制信號(hào)(SLWR)實(shí)現(xiàn)和CY7C68013A的通信控制,進(jìn)行16 bit數(shù)據(jù)的傳輸。同步時(shí)鐘由FPGA根據(jù)傳輸速率,輸出不同頻率的時(shí)鐘信號(hào)。使用Camera Link接口進(jìn)行數(shù)據(jù)傳輸時(shí),F(xiàn)PGA輸出DVAL(數(shù)據(jù)有效)信號(hào)、FVAL(幀有效)信號(hào)和(LVAL)行有效信號(hào),作為數(shù)據(jù)傳輸?shù)耐娇刂疲?]。FPGA根據(jù)不同的數(shù)據(jù)傳輸要求,輸出不同頻率的同步時(shí)鐘,實(shí)現(xiàn)向DS90CR287發(fā)送數(shù)據(jù)。
設(shè)計(jì)中使用VHDL硬件描述語(yǔ)言實(shí)現(xiàn)邏輯電路的功能。邏輯電路分為數(shù)據(jù)接收模塊和數(shù)據(jù)發(fā)送模塊,分別完成對(duì)命令數(shù)據(jù)的接收和成像系統(tǒng)圖像數(shù)據(jù)的輸出。
數(shù)據(jù)接收模塊的作用為控制USB接口,接收上位機(jī)發(fā)送的命令數(shù)據(jù),并輸出相應(yīng)的控制信號(hào)。通過(guò)固件將CY7C68013A的端點(diǎn)2配置成數(shù)據(jù)接收端點(diǎn)。使用VHDL語(yǔ)言設(shè)計(jì)狀態(tài)機(jī)來(lái)實(shí)現(xiàn)邏輯電路功能。數(shù)據(jù)接收模塊狀態(tài)轉(zhuǎn)換如圖2所示。

圖2 狀態(tài)轉(zhuǎn)換示意圖
上位機(jī)發(fā)送的命令由4個(gè)16 bit數(shù)據(jù)構(gòu)成:同步頭(FDFDH),命令,參數(shù),同步尾(FBFBH)。工作時(shí),狀態(tài)機(jī)首先處于IDLE,當(dāng)CY7C68013A的標(biāo)志信號(hào)FLAGA為高電平時(shí),表示端點(diǎn)2已經(jīng)接收到上位機(jī)發(fā)送的數(shù)據(jù),并存儲(chǔ)在內(nèi)部FIFO中;READ狀態(tài)時(shí),使FIFOADDR輸出“00”(選擇端點(diǎn)2),并使SLRD信號(hào)輸出低電平,在SLRD有效的期間,讀取數(shù)據(jù)。當(dāng)FLAGA為低電平時(shí),表示端點(diǎn)2的數(shù)據(jù)已經(jīng)被完全讀出;CONTROL狀態(tài)時(shí)判斷數(shù)據(jù)內(nèi)容,如果數(shù)據(jù)為FDFDH,則之后兩個(gè)16 bit數(shù)據(jù)為有效命令參數(shù);CMD狀態(tài)時(shí),讀取第二個(gè)命令字,根據(jù)相應(yīng)的命令給出控制信號(hào);VALUE狀態(tài)時(shí),讀取第三個(gè)命令字,對(duì)成像系統(tǒng)進(jìn)行參數(shù)配置,完成后進(jìn)入IDLE狀態(tài),等待進(jìn)行下一次命令數(shù)據(jù)的接收。
數(shù)據(jù)發(fā)送模塊的作用是對(duì)CCD相機(jī)輸入的圖像數(shù)據(jù)通過(guò)FIFO進(jìn)行緩存,并將數(shù)據(jù)通過(guò)USB接口或Camera Link輸出。使用狀態(tài)機(jī)來(lái)實(shí)現(xiàn)邏輯電路的功能。數(shù)據(jù)輸出模塊結(jié)構(gòu)如圖3所示。

圖3 數(shù)據(jù)輸出模塊結(jié)構(gòu)
將FPGA內(nèi)部的RAM配置成雙端口FIFO,數(shù)據(jù)讀出模塊通過(guò)Prog_full,Empty,En_rd信號(hào)對(duì)FIFO進(jìn)行讀出控制。Prog_full有效時(shí)表示FIFO內(nèi)已經(jīng)存入2000個(gè)16 bit數(shù)據(jù)(由配置FIFO時(shí)設(shè)置);Empty信號(hào)有效時(shí)表示FIFO中數(shù)據(jù)被完全讀出;En_rd為讀FIFO使能信號(hào)。為了在對(duì)數(shù)據(jù)的處理時(shí)能夠正確的識(shí)別和顯示每一幅圖像,在每一行的圖像數(shù)據(jù)中分別添加了標(biāo)識(shí):同步頭(FDFDH),幀號(hào),行號(hào),同步尾(FBFBH)。數(shù)據(jù)讀出模塊中,當(dāng)狀態(tài)機(jī)處于IDLE時(shí),如果Prog_full有效,狀態(tài)機(jī)跳轉(zhuǎn)到READ狀態(tài);在READ狀態(tài)時(shí),使En_rd信號(hào)有效,讀出FIFO中的圖像數(shù)據(jù),并傳輸給接口控制模塊進(jìn)行輸出;當(dāng)Empty信號(hào)有效時(shí),狀態(tài)機(jī)跳轉(zhuǎn)到IDLE狀態(tài),等待下一次數(shù)據(jù)的讀出。通過(guò)狀態(tài)機(jī)的循環(huán)控制,將每一幀圖像數(shù)據(jù)完整地傳輸?shù)紺amera Link或USB接口控制模塊。
選擇Camera Link接口進(jìn)行傳輸時(shí),控制信號(hào)為DVAL、FVAL、LVAL,高電平有效。設(shè)計(jì)中使 DVAL 和FVAL在每一幀數(shù)據(jù)傳輸時(shí)有效,在一幀的時(shí)間內(nèi)保持高電平;LVAL信號(hào)則是在讀出FIFO數(shù)據(jù)時(shí)有效,當(dāng)數(shù)據(jù)為同步頭(FDFDH)時(shí),LVAL開始輸出高電平,當(dāng)數(shù)據(jù)為同步尾(FBFBH)時(shí),表示一行數(shù)據(jù)結(jié)束,LVAL輸出低電平。使DVAL和FVAL信號(hào)對(duì)一幀圖像數(shù)據(jù)進(jìn)行同步,LVAL對(duì)一行圖像數(shù)據(jù)進(jìn)行同步。
選擇USB接口進(jìn)行傳輸時(shí),F(xiàn)PGA選擇CY7C68013A的端點(diǎn)6進(jìn)行數(shù)據(jù)輸出。通過(guò)狀態(tài)機(jī)對(duì)數(shù)據(jù)輸出進(jìn)行控制:處于IDLE狀態(tài)時(shí),如果FLAGC信號(hào)為高電平,則表明上位機(jī)發(fā)出讀數(shù)請(qǐng)求,端點(diǎn)6的FIFO未滿,可以向CY7C68013A發(fā)送數(shù)據(jù),使FIFOADDR輸出“10”(選擇端點(diǎn)6),跳轉(zhuǎn)入SEND狀態(tài)。SEND狀態(tài)時(shí),使SLWR信號(hào)輸出高電平,將FIFO1中的數(shù)據(jù)輸出。如果FLAGC為低,表明端點(diǎn)6中FIFO已滿,停止數(shù)據(jù)傳輸,并跳轉(zhuǎn)到IDLE狀態(tài),等待重新開始數(shù)據(jù)傳輸[7-8]。
軟件設(shè)計(jì)主要包括兩個(gè)部分:USB固件程序設(shè)計(jì)和應(yīng)用程序設(shè)計(jì)。
固件程序是指運(yùn)行在CY7C68013A中8051核的程序,負(fù)責(zé)初始化,設(shè)置工作模式等。使用Keil軟件,對(duì)Cypress公司提供的固件程序框架進(jìn)行修改,下載到芯片中,進(jìn)行重新配置,實(shí)現(xiàn)USB設(shè)備的重枚舉。設(shè)計(jì)時(shí),調(diào)用用戶函數(shù)TD_Poll(),對(duì)重要寄存器進(jìn)行賦值:IFCONFIG=0x03,選擇數(shù)據(jù)傳輸?shù)耐綍r(shí)鐘由FPGA提供;EP2CFG=0xA0,將2端點(diǎn)配置為數(shù)據(jù)輸出端點(diǎn),設(shè)置4倍緩存;EP6CFG=0xE0,將6端點(diǎn)配置為數(shù)據(jù)輸入端點(diǎn),設(shè)置4倍緩存[9]。固件程序通過(guò)上位機(jī)進(jìn)行配置,打開應(yīng)用程序時(shí),自動(dòng)讀取指定路徑的固件程序bit文件,完成對(duì)固件程序的加載。
Camera Link使用接口發(fā)送數(shù)據(jù)時(shí),使用的是數(shù)據(jù)采集卡,配有專用的軟件,應(yīng)用程序主要完成的是控制USB接口進(jìn)行數(shù)據(jù)接收和發(fā)送,以及圖像數(shù)據(jù)的存儲(chǔ)和顯示。使用VC++6.0進(jìn)行設(shè)計(jì),應(yīng)用程序的流程如圖4所示。

圖4 應(yīng)用程序流程圖
使用Windows提供的CreateFile函數(shù)來(lái)完成對(duì)USB設(shè)備的操作,該函數(shù)返回設(shè)備對(duì)象的句柄,設(shè)備的句柄是Windows指定給每個(gè)設(shè)備唯一的標(biāo)示符。應(yīng)用程序得到設(shè)備的句柄后,就可以使用各個(gè)Win32函數(shù)訪問(wèn),如ReadFile、WriteFile、DeviceIoControl和 CloseHandle 等。通過(guò)這些函數(shù)完成啟動(dòng)USB線程,打開USB設(shè)備,自動(dòng)加載指定路徑的固件程序,以及數(shù)據(jù)接收和數(shù)據(jù)發(fā)送。
發(fā)送數(shù)據(jù)時(shí),應(yīng)用程序向CY7C68013A寫入512個(gè)16 bit數(shù)據(jù),前4個(gè)16 bit數(shù)據(jù)為有效的命令數(shù)據(jù),包括同步頭(FDFDH)、命令、參數(shù)、同步尾(FBFBH)。數(shù)據(jù)接收時(shí),在上位機(jī)內(nèi)存中開辟緩存,然后將數(shù)據(jù)以TXT文本的形式存入硬盤。圖像顯示時(shí),通過(guò)判斷同步頭,幀號(hào),行號(hào),同步尾,將一幀圖像的每一行識(shí)別出來(lái),將同步頭FDFDH和同步尾FBFBH之間的有效數(shù)據(jù),按照像素順序,進(jìn)行顯示。通過(guò)不斷的識(shí)別每行數(shù)據(jù)的幀號(hào)、行號(hào),將一幀圖像完整的顯示出來(lái)[9]。
采用以背照式CCD47-10為傳感器設(shè)計(jì)的相機(jī)對(duì)數(shù)據(jù)傳輸系統(tǒng)進(jìn)行驗(yàn)證。該相機(jī)用于對(duì)微弱目標(biāo)的探測(cè),CCD的像元數(shù)為1072×1027,雙通道輸出。相機(jī)工作時(shí),上位機(jī)通過(guò)USB接口發(fā)出命令,設(shè)置CCD的像素讀出速率為5 MHz,設(shè)置積分時(shí)間為100 ms,配置視頻處理器中的增益和偏置等參數(shù),控制相機(jī)開始或停止工作。成像系統(tǒng)輸出的數(shù)據(jù)速率為160 Mbit/s,采用Camera Link接口向上位機(jī)進(jìn)行數(shù)據(jù)發(fā)送。如圖5所示,是CCD47-10相機(jī)對(duì)光柵所成的圖像。實(shí)驗(yàn)結(jié)果表明,數(shù)據(jù)傳輸系統(tǒng)能夠?qū)D像數(shù)據(jù)完整、準(zhǔn)確、實(shí)時(shí)地傳輸?shù)缴衔粰C(jī),并正確的顯示。

圖5 光柵成像圖(載圖)
采用USB和Camera Link接口設(shè)計(jì)的數(shù)據(jù)傳輸系統(tǒng),結(jié)構(gòu)簡(jiǎn)單,性能穩(wěn)定,使用靈活方便,結(jié)合了 USB和Camera Link接口的優(yōu)點(diǎn)。數(shù)據(jù)傳輸系統(tǒng)使CCD相機(jī)和上位機(jī)之間可以進(jìn)行控制命令和高速率、大容量圖像數(shù)據(jù)的傳輸。能夠適用于不同數(shù)據(jù)傳輸要求的CCD成像系統(tǒng)中,有很好的通用性和使用價(jià)值。
[1]王慶有.CCD應(yīng)用技術(shù)[M].天津:天津大學(xué)出版社,2002.
[2]戴進(jìn),徐志祥.基于USB2.0的紅外圖像采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].激光與紅外,2005,35(1):22-25.
[3]徐志躍,張?zhí)锾?基于Camera Link的串行圖像采集系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)應(yīng)用,2010,30(6):1071-1073.
[4]CCD47-10 AIMO back illuminated compact pack high performance CCD sensor[EB/OL].[2011-06-15].http://www.ccd.com/pdf/ccd_47.pdf.
[5]周彬,牛俊邦,魏嬌.基于USB2.0低功耗實(shí)時(shí)數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)[J].儀表技術(shù)與傳感器,2009(4):33-35.
[6]李寧,王俊發(fā).基于Camera Link的高速數(shù)據(jù)采集系統(tǒng)[J].紅外,2005(7):31-37.
[7]戴小俊,楊緒光,丁鐵夫,等.基于USB2.0的高速數(shù)據(jù)通信接口設(shè)計(jì)[J].電子器件,2006,29(4):1320-1324.
[8]李文宮,武傳華.采用CY7C68013A的USB系統(tǒng)固件程序設(shè)計(jì)[J].電子工程,2007(4):33-35.
[9]Huanor,USB2.0+FPGA 開發(fā)文檔[EB/OL].[2011-06-12].http://www.huanor.com.