王佳超,王思懿,李黨娟,吳慎將,吳新宇
(1.西安工業(yè)大學(xué)光電工程學(xué)院,陜西 西安 710021; 2.西安高斯激光科技有限公司,陜西 西安 710032)
圖像采集系統(tǒng)在人工智能、消防安全、工業(yè)檢測(cè)以及安防監(jiān)控等領(lǐng)域都有廣泛的應(yīng)用,也越來越受到各方關(guān)注。常見的圖像傳感器件有電荷耦合器件(charge-coupled device,CCD)傳感器件以及互補(bǔ)金屬氧化物半導(dǎo)體(complementary metal oxide semiconductor,CMOS)傳感器件兩大類,它們各有優(yōu)缺點(diǎn)[1]。CCD器件噪聲低、動(dòng)態(tài)范圍廣、光照靈敏度高。但CCD光敏陣列難以驅(qū)動(dòng)信號(hào)處理電路和芯片集成。固態(tài)傳感器CMOS可直接輸出數(shù)字圖像信號(hào)和數(shù)據(jù)同步參考信號(hào),方便底層數(shù)據(jù)處理和集成[2]。CMOS圖像傳感器有質(zhì)量輕、體積小等特點(diǎn),大面積應(yīng)用于嵌入式圖像采集處理系統(tǒng)[3]。與傳統(tǒng)的高級(jí)精簡(jiǎn)指令集計(jì)算機(jī)(advanced RISC machines,ARM)和數(shù)字信號(hào)處理(digital signal processing,DSP)相比,由于現(xiàn)場(chǎng)可編程門陣列(field programmable gate array,FPGA)具有更快的數(shù)據(jù)處理速率和更高的使用靈活性等優(yōu)點(diǎn),適用于單位時(shí)間內(nèi)處理數(shù)據(jù)多、需要數(shù)據(jù)處理速率高的圖像處理系統(tǒng)。ARM和數(shù)字信號(hào)處理(digital signal processing,DSP)是基于軟件開發(fā)語言C或匯編的嵌入式微處理器,容易移植,可增加外部存儲(chǔ)器擴(kuò)展系統(tǒng)的存儲(chǔ)容量,并且與各種總線接口協(xié)議,例如集成電路總線(inter integrated circuit,I2C)、通用串行總線(universal serial bus,USB)、控制器局域網(wǎng)絡(luò)(controller area network,CAN)、串行外設(shè)接口(serial peripheral interface,SPI)、通用異步收發(fā)傳輸器(universal asynchronous receiver transmitter,UART)等兼容,廣泛應(yīng)用于控制和數(shù)據(jù)處理等領(lǐng)域。但這兩種處理器的電路結(jié)構(gòu)經(jīng)廠商生產(chǎn)之后就已固定,用戶修改空間較小,且采用串行處理的方式不利于數(shù)據(jù)量較大的時(shí)序控制和處理[4]。因此,現(xiàn)場(chǎng)可編程門陣列作為一項(xiàng)越來越成熟的技術(shù),以其并行性以及靈活性,被廣泛應(yīng)用于圖像采集、傳輸以及處理[5]。
采用型號(hào)為OV7670的CMOS圖像傳感器對(duì)實(shí)時(shí)的圖像進(jìn)行采集和傳輸,其他模塊由搭載Spartan6系列的現(xiàn)場(chǎng)可編程門陣列,通過使用Verilog HDL硬件描述語言的編程實(shí)現(xiàn)各個(gè)控制模塊的功能。采集的圖像通過雙倍數(shù)據(jù)率同步動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(double data rate3 synchronous dynamic random access memory,DDR3 SDRAM)進(jìn)行緩存,并輸送到視頻圖形陣列(video graphics array,VGA),然后在上位機(jī)顯示。系統(tǒng)結(jié)構(gòu)如圖1所示。

圖1 系統(tǒng)結(jié)構(gòu)示意圖Fig.1 The schematic diagram of system structure
系統(tǒng)結(jié)構(gòu)包括CMOS圖像傳感器、圖像傳感器驅(qū)動(dòng)模塊、圖像獲取模塊、DDR控制模塊、DDR3 SDRAM存儲(chǔ)器、VGA輸出模塊以及VGA顯示模塊。系統(tǒng)上電之后,F(xiàn)PGA通過I2C協(xié)議控制CMOS傳感器的內(nèi)部寄存器,對(duì)OV7670圖像傳感器進(jìn)行初始化并完成對(duì)傳感器的配置。由OV7670圖像傳感器配合圖像抓取模塊進(jìn)行捕捉視頻流圖像;把捕捉的圖像信息通過DDR3 SDRAM控制模塊寫入DDR3 SDRAM內(nèi)部的先進(jìn)先出隊(duì)列(first input first output,F(xiàn)IFO)中;最后將圖像通過VGA顯示模塊進(jìn)行實(shí)時(shí)顯示[6]。
采用Xilinx公司的開發(fā)軟件ISE Design 14.7搭建開發(fā)環(huán)境,聯(lián)合Modelsim對(duì)系統(tǒng)的各個(gè)模塊進(jìn)行仿真,完成了整個(gè)硬件系統(tǒng)的設(shè)計(jì)。
圖像采集模塊由OV7670圖像傳感器、圖像獲取模塊(camera_capture)、圖像傳感器驅(qū)動(dòng)模塊(i2c_gene)共同組成。其中:OV7670圖像傳感器可直接寫入640×480像素以及16位(紅、綠、藍(lán)分別為5位、6位、5位)的圖像信息。圖像傳感器驅(qū)動(dòng)模塊通過I2C協(xié)議對(duì)OV7670的內(nèi)部寄存器進(jìn)行寫操作,從而完成該傳感器的配置[7]。將圖像信息存入DDR3 SDRAM的內(nèi)部寄存器中。由于DDR3 SDRAM的位寬為64位[8],因此要將8位的數(shù)據(jù)輸入轉(zhuǎn)換成64位(8字節(jié))的數(shù)據(jù)輸出。圖像獲取模塊信號(hào)定義如表1所示。圖像獲取模塊(camera_capture)產(chǎn)生DDR寫入信號(hào)(ddr_wren_o)、DDR復(fù)位信號(hào)(ddr_addr_wr_set_o)、以及地址空間轉(zhuǎn)換信號(hào)(frame_switch)。該程序中ddr_data_camera就是由輸入的8位轉(zhuǎn)換成輸出的64位的像素。當(dāng)接收到8 B數(shù)據(jù)時(shí),產(chǎn)生DDR寫信號(hào),并把接收到的8 B數(shù)據(jù)輸出給DDR3 SDRAM內(nèi)部的先進(jìn)先出(first in first out,FIFO)存儲(chǔ)器(FIFO)。如果沒有接收到或者接收到的數(shù)據(jù)不足8 B,那么DDR寫信號(hào)為低電平且沒有數(shù)據(jù)輸出。

表1 圖像獲取模塊信號(hào)定義Tab.1 Signal definition of image acquisition module
DDR3 SDRAM內(nèi)部位寬為64位、深度為64,內(nèi)部FIFO的容量為512 B。在圖像抓取模塊(camera_capture)中,產(chǎn)生DDR寫地址復(fù)位信號(hào)(ddr_addr_wr_set)和讀寫地址空間交換信號(hào)(frame_switch),并由這兩個(gè)信號(hào)來控制DDR3 SDRAM的讀寫。
DDR控制模塊將從圖像抓取模塊輸入的圖像信息先緩存在DDR3 SDRAM內(nèi)部的存儲(chǔ)器中,然后再寫入DDR3 SDRAM存儲(chǔ)器。如果有輸出請(qǐng)求,再把DDR3 SDRAM存儲(chǔ)器中的圖像信息提取出來,輸送給VGA輸出模塊。DDR控制模塊的作用是對(duì)DDR存儲(chǔ)器進(jìn)行讀寫的過程進(jìn)行控制。在只有一片動(dòng)態(tài)隨機(jī)存儲(chǔ)器的情況下,為了達(dá)到顯示的實(shí)時(shí)性和同步性[9],要對(duì)該模塊中圖像數(shù)據(jù)的傳輸采用乒乓操作,如圖2所示。

圖2 乒乓操作示意圖Fig.2 Schematic diagram of the Ping-pong operation
關(guān)鍵代碼如下:
if(ddr_addr_wr_set) begin
if(frame_switch==1'b0)
c1_p0_cmd_byte_addr<=30'd0;
else
c1_p0_cmd_byte_addr<=30'd1000000;
end
為了確保顯示完整的一幀圖像,將DDR3 SDRAM內(nèi)部劃分成兩個(gè)部分(即bank0和bank1)。這兩個(gè)部分的空間均大于存儲(chǔ)一幀圖像所需要的字節(jié)數(shù)。當(dāng)CMOS OV7670圖像傳感器初始化完成后,從圖像傳感器采集到的數(shù)據(jù)先寫入bank0中,同時(shí)讀取bank1中的數(shù)據(jù);讀完一幀后,切換到bank0讀取數(shù)據(jù)[10]。這樣就可以保證數(shù)據(jù)的實(shí)時(shí)性和同步性。
VGA顯示共有5個(gè)信號(hào):R、G、B三基色信號(hào),行同步信號(hào)(HSYNC)和場(chǎng)同步信號(hào)(VSYNC)[11]。在本系統(tǒng)中,F(xiàn)PGA產(chǎn)生分辨率為640×480,刷新頻率60 Hz的VGA時(shí)序,包括行同步、場(chǎng)同步及顏色信號(hào)。這些信息經(jīng)過圖像采集模塊以及DDR控制模塊后,傳輸?shù)紻DR3存儲(chǔ)器中。VGA輸出模塊只需要給DDR發(fā)送讀命令,就可以將DDR中的圖像信息通過VGA顯示出來。VGA時(shí)序如圖3所示,VGA顯示如圖4所示。

圖3 VGA時(shí)序Fig.3 Sequence diagram of VGA

圖4 VGA顯示圖Fig.4 The display of VGA
VGA輸出模塊信號(hào)定義如表2所示。該模塊產(chǎn)生VGA的幀行信號(hào),行和列的計(jì)數(shù),R、G、B三種基色以及讀地址復(fù)位信號(hào)。

表2 VGA輸出模塊信號(hào)定義Tab.2 Signal definition of VGA output module
VGA的顯示原理是對(duì)每一幀圖像的每一行進(jìn)行逐點(diǎn)掃描。行同步信號(hào)標(biāo)志著掃描一行結(jié)束。場(chǎng)同步信號(hào)也就是幀信號(hào),它標(biāo)志著一幅圖像的結(jié)束。
行、場(chǎng)時(shí)序執(zhí)行如表3所示。

表3 行、場(chǎng)時(shí)序執(zhí)行表Tab.3 Schematic diagram of the line timing execution and field sequential execution
如表3所示,在掃描的過程中需要一定的延時(shí)調(diào)整,所以出現(xiàn)了消影區(qū),在消影區(qū)內(nèi)沒有圖像信息。
在VGA顯示模塊,由于VGA顯示16位的像素點(diǎn),其中RGB分別占有5位、6位、5位。因此要將從DDR內(nèi)部FIFO的64位數(shù)據(jù)分四次讀入VGA輸出模塊中。
CMOS OV7670圖像傳感器初始化完成(即reg_conf_done信號(hào)由低拉高)后,DDR控制模塊直接讀取DDR中的數(shù)據(jù)進(jìn)行VGA顯示(此時(shí),VGA顯示的第一幀是空白圖像)。當(dāng)檢測(cè)到camera_vsync延時(shí)兩拍的上升沿時(shí),frame_switch由低拉高,讀寫地址空間(bank0和bank1)交換。當(dāng)camera_href=1且camera_vsync=0時(shí),進(jìn)行寫地址復(fù)位。與此同時(shí),圖像采集模塊開始采集數(shù)據(jù),等到camera_vsync再一次由低拉高一幀圖像采集完成。檢測(cè)到camera_vsync信號(hào)的上降沿時(shí),地址空間交換信號(hào)(frame_switch)拉高一個(gè)時(shí)鐘周期進(jìn)行地址空間的交換;檢測(cè)到camera_vsync信號(hào)的下降沿時(shí),寫地址復(fù)位信號(hào)ddr_addr_wr_set_o拉高一個(gè)時(shí)鐘周期圖像獲取模塊的程序?qū)DR寫地址進(jìn)行復(fù)位。圖像采集模塊的主要功能是將輸入到該模塊8位數(shù)據(jù)轉(zhuǎn)化成64位數(shù)據(jù),并輸出給DDR控制模塊。
VGA輸出模塊在上電復(fù)位之后就進(jìn)入工作狀態(tài),計(jì)數(shù)器x_cnt和y_cnt分別計(jì)行和列的像素個(gè)數(shù)。由上述兩個(gè)計(jì)數(shù)器產(chǎn)生的數(shù)據(jù)有效信號(hào)(hsync_de與vsync_de)控制VGA模塊的輸出。當(dāng)hsync_de=1且 vsync_de=1時(shí),VGA輸出模塊將64位的數(shù)據(jù)分4次讀取到相應(yīng)的寄存器中,送到上位機(jī)由VGA顯示。當(dāng)行數(shù)據(jù)有效信號(hào)(hsync_de)拉低,表示數(shù)據(jù)傳輸完成同時(shí)將輸出給R、G、B 這3個(gè)通道的數(shù)據(jù)全部清零。當(dāng)幀數(shù)據(jù)有效信號(hào)(vsync_de)拉低,表示一幀圖像傳輸完成。然后,讀地址復(fù)位信號(hào)ddr_addr_rd_set拉高一拍,對(duì)讀地址進(jìn)行復(fù)位,等待下一幀圖像的傳輸。
本文利用FPGA芯片作為邏輯控制的核心器件,采用CMOS OV7670圖像傳感器進(jìn)行圖像采集,并在上位機(jī)由VGA進(jìn)行實(shí)時(shí)顯示。采用一片DDR3 SDRAM芯片緩存,利用乒乓操作實(shí)現(xiàn)圖像的寫入與讀取互不干擾。仿真結(jié)果表明,該系統(tǒng)能夠較好地滿足圖像的實(shí)時(shí)輸出的需求。本設(shè)計(jì)的特點(diǎn)是靈活性高、可移植性強(qiáng)且能夠進(jìn)行實(shí)時(shí)顯示。這將有助于對(duì)圖像預(yù)處理,尤其是圖像分析和目標(biāo)識(shí)別的優(yōu)化,為進(jìn)一步開發(fā)更復(fù)雜的圖像算法提供借鑒。