基于AC6102_V2開發板的USB Video Class攝像頭實驗,實現了通過AC6102開發板上的USB3.0芯片將OV5640攝像頭采集到的圖像數據傳輸到PC機上,并使用UVC圖像顯示軟件顯示的功能。
USB3.0速率等級
YUV422圖像格式傳輸
1280*720@30fps幀率
UVC,全稱為:USB video class 或USB video device class。是Microsoft與另外幾家設備廠商聯合推出的為USB視頻捕獲設備定義的協議標準,目前已成為USB org標準之一。
如今的主流操作系統(如Windows XP SP2 and later, Linux 2.4.6 and later, MacOS 10.5 andlater)都已提供UVC設備驅動,因此符合UVC規格的硬件設備在不需要安裝任何的驅動程序下即可在主機中正常使用。使用UVC技術的包括攝像頭、數碼相機、類比影像轉換器、電視棒及靜態影像相機等設備。
最新的UVC版本為UVC 1.5,由USB Implementers Forum定義包括基本協議及負載格式。
網絡攝像頭是第一個支持UVC而且也是數量最多的UVC設備,目前,操作系統只要是 Windows XP SP2 之后的版本都可以支持 UVC,當然 Vista 就更不用說了。Linux系統自2.4以后的內核都支持了大量的設備驅動,并可以支持UVC設備。
使用 UVC 的好處 USB 在 Video這塊也成為一項標準了之后,硬件在各個程序之間彼此運行會更加順利,而且也省略了驅動程序安裝這一環節。
本實驗基于Cypress廠家提供的應用手冊AN75779。在該應用手冊中,并未使用到FPGA芯片,而是直接使用FX3芯片連接圖像傳感器,如下圖1所示。即一個最精簡的基于FX3芯片的UVC攝像頭是不需要FPGA芯片的參與的。但在實際的應用中,可能需要先對圖像進行一定的預處理再送往PC端顯示處理,為了降低PC端的運算開銷,往往將這一部分預處理工作分配到FPGA中,利用FPGA強大的并行處理優勢實現。
在AC6102開發板上,設計了一款擁有30K邏輯單元的FPGA主芯片EP4CE30和一個FX3芯片,FX3芯片的所有數據線和控制線,除IIC、IIS、SPI等以外,全部連接到了FPGA上。因此當使用AC6102開發板進行UVC實驗時,需要通過FPGA芯片進行一個簡單的橋接。
橋接有兩種方式,一種是直接使用組合邏輯,將輸入連接到輸出,例如:
assign LV = cmos_href; assign FV = cmos_vsync; assign DQ ={8'd0,cmos_data}; |
當使用這種方式時,是直接的輸入IO的信號經過布線直接連接到了輸出IO上,沒有D觸發器,因此難以進行時序約束。
另一種能夠支持時序約束的橋接方式是,使用cmos_pclk將所有信號打2拍之后輸出,如下圖2所示。這樣的話即每個信號從輸入到輸出,會經過2級寄存器傳輸,這樣在進行時序約束時就非常方便了,一級寄存器作為輸入寄存器,另一級作為輸出寄存器,既方便布局布線,也利于時序分析。
本實驗中采用第二種方式進行橋接,即在輸入和輸出信號之間插入2級寄存器的方式。
reg LV_r,FV_r,PCLK_r; reg[15:0]DQ_r;
always@(posedge cmos_pclk)begin LV_r <= cmos_href; FV_r <= cmos_vsync; DQ_r <={8'd0,cmos_data}; end
always@(posedge cmos_pclk)begin LV <= LV_r; FV <= FV_r; DQ <= DQ_r; end
assign PCLK = cmos_pclk; |
由此,整個基于AC6102開發板的UVC攝像頭框圖如下圖3所示。
可以看到,與Cypress提供的UVC應用方案不同,該應用方案在圖像傳感器和FX3之間插入了一片FPGA,用作圖像的轉發,并將原本的控制圖像傳感器的IIC功能從FX3中移植到了FPGA中。實際上,直接使用FX3原本的IIC控制器來實現圖像傳感器的設置也是可以的,不過這涉及到FX3固件的修改,而且不同的圖像傳感器需要使用不同的初始化代碼,也就意味著需要使用不同的FX 3固件,會增加開發工作量,因此在本例中使用FPGA來完成圖像傳感器的配置初始化工作。這樣,對于FPGA開發工程師來說,可以避開不熟悉的FX3固件開發,能夠有效減少開發工作量。
AC6102 UVC應用工程共提供以下幾個文件
OV5640_USB30_UVC.qar
OV5640_UVC_30FPS.png
OV5640V2+AC6102V2.JPG
UVC_AN75779.img
UVC_AN75779.rar
VirtualDub_1_10_4_35456.1400664289.zip
? OV5640_USB30_UVC.qar文件為基于AC6102V2開發板和OV5640V2攝像頭模塊的FPGA應用工程,該工程主要實現了攝像頭數據到FX3芯片的轉發工作和OV5640攝像頭的初始化配置工作。將該文件放置在一個非中文目錄下,雙擊就可以直接使用Quartus軟件打開。
? OV5640_UVC_30FPS.png文件為使用該工程進行圖像采集顯示的效果圖
? OV5640V2+AC6102V2.JPG文件為進行試驗時的硬件連接圖
? UVC_AN75779.img文件為USB芯片的固件,由于該固件尺寸為139KB,超過了EEPROM存儲器的128K容量,因此實驗時只能燒寫到RAM或SPI FLASH中。
? UVC_AN75779.rar文件為USB芯片的固件源碼,基于Cypress廠家提供的工程源碼,我們進行了一定的修改,主要就是屏蔽了IIC部分,因為本例中沒有用到IIC,實際上廠家的源碼不做任何修改也是可以直接使用的。當初屏蔽這部分是為了降低固件尺寸,以期能夠降低到128KB以內,不過沒有降下來。
? VirtualDub_1_10_4_35456.1400664289.zip文件是PC端的UVC圖像顯示軟件。
連接USB Blaster到JTAG下載口,連接OV5640攝像頭到網口左側的Camera接口,將USB3.0數據線一端插入AC6102開發板,另一端插入PC端的USB3.0接口。將電源開關撥到ON位置。如下圖5所示:
注意,這里一定要插入電腦的USB3.0接口,現在的電腦一般都帶有USB3.0接口了,識別某USB接口為USB3.0還是2.0的方式很簡單,可以通過以下三種方式識別。
1、根據USB協會標準定義,USB3.0的typeA母口應該為天藍色,如果您發現您的USB接口為藍色,那一定是USB3.0接口。如下圖6所示。當然,現在很多電腦廠商在生產時并未嚴格遵守這一協定,因此,有的電腦單憑顏色還是無法區分USB3.0和USB2.0。
2、查看USB接口附近的圖案標識。USB3.0一般稱作SuperSpeed USB,因此如果該USB接口對應的圖案有SS標識,那一定是USB3.0接口。如下圖7,右側的帶有SS標識的為USB3.0接口,而左側的沒有SS標識的則不是USB3.0接口。
3、如果上述兩種方法還是無法區分的話,可以用最直接的辦法,看看這個USB接口里有幾個觸點和簧片,USB3.0的只有4個,而USB3.0的有9個,如下圖8所示:
雙擊OV5640_USB30_UVC.qar文件,打開之后進行全編譯以得到sof文件。并將sof文件下載到FPGA中。
打開Cypress的Control Center軟件,燒寫UVC_AN75779.img文件到FX3芯片的RAM中。該軟件需要用戶已經安裝了FX3-SDK,如未安裝,可參看AC6102的USB3.0開發教程相關章節先安裝軟件。如何燒寫img文件,也可參看AC6102的USB3.0開發教程相關章節。
燒寫完成后,系統會自動安裝驅動,安裝完成后會在設備管理器下的圖像設備中出現一個名為FX3的設備,如下圖9所示。該設備就是我們的UVC攝像頭了。
將文件包提供的VirtualDub_1_10_4_35456.1400664289.zip解壓,并運行VirtualDub.exe文件,如下圖10所示。打開之后,選擇File—>Capture AVI以進入圖像捕獲模式,如下圖11所示:
然后選擇Device—>FX3(DirectShow),如下圖11所示,如果軟硬件配置都沒有問題的話,就可以在軟件中看到顯示的圖像了。
圖12為使用該UVC工程截圖的圖片,可以看得到實時幀率為30fps左右。
關于FX3固件代碼的理解和修改,請參看AC6102開發板USB3.0開發教程相關章節內容。