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

圖1 硬件電路結構
使用FPGA作為控制芯片,接收CCD相機發送的數據,進行緩存,然后控制接口芯片向上位機進行發送。由于數據傳輸系統對CCD相機輸入的圖像數據是實時發送的,緩存的作用為匹配數據輸入和輸出之間速率的不同。因此設計中沒有使用外部緩存,而是將FPGA提供的內部RAM配置成雙端口FIFO,實現數據的緩存,降低了設計難度。使用USB接口進行數據傳輸時,FPGA通過標志信號(FLAGA,FLAGC),端點選擇信號(FIFOADDR),讀控制信號(SLRD),和寫控制信號(SLWR)實現和CY7C68013A的通信控制,進行16 bit數據的傳輸。同步時鐘由FPGA根據傳輸速率,輸出不同頻率的時鐘信號。使用Camera Link接口進行數據傳輸時,FPGA輸出DVAL(數據有效)信號、FVAL(幀有效)信號和(LVAL)行有效信號,作為數據傳輸的同步控制[6]。FPGA根據不同的數據傳輸要求,輸出不同頻率的同步時鐘,實現向DS90CR287發送數據。
設計中使用VHDL硬件描述語言實現邏輯電路的功能。邏輯電路分為數據接收模塊和數據發送模塊,分別完成對命令數據的接收和成像系統圖像數據的輸出。
數據接收模塊的作用為控制USB接口,接收上位機發送的命令數據,并輸出相應的控制信號。通過固件將CY7C68013A的端點2配置成數據接收端點。使用VHDL語言設計狀態機來實現邏輯電路功能。數據接收模塊狀態轉換如圖2所示。

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

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

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

圖5 光柵成像圖(載圖)
采用USB和Camera Link接口設計的數據傳輸系統,結構簡單,性能穩定,使用靈活方便,結合了 USB和Camera Link接口的優點。數據傳輸系統使CCD相機和上位機之間可以進行控制命令和高速率、大容量圖像數據的傳輸。能夠適用于不同數據傳輸要求的CCD成像系統中,有很好的通用性和使用價值。
[1]王慶有.CCD應用技術[M].天津:天津大學出版社,2002.
[2]戴進,徐志祥.基于USB2.0的紅外圖像采集系統的設計與實現[J].激光與紅外,2005,35(1):22-25.
[3]徐志躍,張田甜.基于Camera Link的串行圖像采集系統設計[J].計算機應用,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低功耗實時數據采集系統的設計[J].儀表技術與傳感器,2009(4):33-35.
[6]李寧,王俊發.基于Camera Link的高速數據采集系統[J].紅外,2005(7):31-37.
[7]戴小俊,楊緒光,丁鐵夫,等.基于USB2.0的高速數據通信接口設計[J].電子器件,2006,29(4):1320-1324.
[8]李文宮,武傳華.采用CY7C68013A的USB系統固件程序設計[J].電子工程,2007(4):33-35.
[9]Huanor,USB2.0+FPGA 開發文檔[EB/OL].[2011-06-12].http://www.huanor.com.