王佳超,王思懿,李黨娟,吳慎將,吳新宇
(1.西安工業(yè)大學光電工程學院,陜西 西安 710021; 2.西安高斯激光科技有限公司,陜西 西安 710032)
圖像采集系統(tǒng)在人工智能、消防安全、工業(yè)檢測以及安防監(jiān)控等領域都有廣泛的應用,也越來越受到各方關注。常見的圖像傳感器件有電荷耦合器件(charge-coupled device,CCD)傳感器件以及互補金屬氧化物半導體(complementary metal oxide semiconductor,CMOS)傳感器件兩大類,它們各有優(yōu)缺點[1]。CCD器件噪聲低、動態(tài)范圍廣、光照靈敏度高。但CCD光敏陣列難以驅動信號處理電路和芯片集成。固態(tài)傳感器CMOS可直接輸出數字圖像信號和數據同步參考信號,方便底層數據處理和集成[2]。CMOS圖像傳感器有質量輕、體積小等特點,大面積應用于嵌入式圖像采集處理系統(tǒng)[3]。與傳統(tǒng)的高級精簡指令集計算機(advanced RISC machines,ARM)和數字信號處理(digital signal processing,DSP)相比,由于現場可編程門陣列(field programmable gate array,FPGA)具有更快的數據處理速率和更高的使用靈活性等優(yōu)點,適用于單位時間內處理數據多、需要數據處理速率高的圖像處理系統(tǒng)。ARM和數字信號處理(digital signal processing,DSP)是基于軟件開發(fā)語言C或匯編的嵌入式微處理器,容易移植,可增加外部存儲器擴展系統(tǒng)的存儲容量,并且與各種總線接口協議,例如集成電路總線(inter integrated circuit,I2C)、通用串行總線(universal serial bus,USB)、控制器局域網絡(controller area network,CAN)、串行外設接口(serial peripheral interface,SPI)、通用異步收發(fā)傳輸器(universal asynchronous receiver transmitter,UART)等兼容,廣泛應用于控制和數據處理等領域。但這兩種處理器的電路結構經廠商生產之后就已固定,用戶修改空間較小,且采用串行處理的方式不利于數據量較大的時序控制和處理[4]。因此,現場可編程門陣列作為一項越來越成熟的技術,以其并行性以及靈活性,被廣泛應用于圖像采集、傳輸以及處理[5]。
采用型號為OV7670的CMOS圖像傳感器對實時的圖像進行采集和傳輸,其他模塊由搭載Spartan6系列的現場可編程門陣列,通過使用Verilog HDL硬件描述語言的編程實現各個控制模塊的功能。采集的圖像通過雙倍數據率同步動態(tài)隨機存取存儲器(double data rate3 synchronous dynamic random access memory,DDR3 SDRAM)進行緩存,并輸送到視頻圖形陣列(video graphics array,VGA),然后在上位機顯示。系統(tǒng)結構如圖1所示。
圖1 系統(tǒng)結構示意圖Fig.1 The schematic diagram of system structure
系統(tǒng)結構包括CMOS圖像傳感器、圖像傳感器驅動模塊、圖像獲取模塊、DDR控制模塊、DDR3 SDRAM存儲器、VGA輸出模塊以及VGA顯示模塊。系統(tǒng)上電之后,FPGA通過I2C協議控制CMOS傳感器的內部寄存器,對OV7670圖像傳感器進行初始化并完成對傳感器的配置。由OV7670圖像傳感器配合圖像抓取模塊進行捕捉視頻流圖像;把捕捉的圖像信息通過DDR3 SDRAM控制模塊寫入DDR3 SDRAM內部的先進先出隊列(first input first output,FIFO)中;最后將圖像通過VGA顯示模塊進行實時顯示[6]。
采用Xilinx公司的開發(fā)軟件ISE Design 14.7搭建開發(fā)環(huán)境,聯合Modelsim對系統(tǒng)的各個模塊進行仿真,完成了整個硬件系統(tǒng)的設計。
圖像采集模塊由OV7670圖像傳感器、圖像獲取模塊(camera_capture)、圖像傳感器驅動模塊(i2c_gene)共同組成。其中:OV7670圖像傳感器可直接寫入640×480像素以及16位(紅、綠、藍分別為5位、6位、5位)的圖像信息。圖像傳感器驅動模塊通過I2C協議對OV7670的內部寄存器進行寫操作,從而完成該傳感器的配置[7]。將圖像信息存入DDR3 SDRAM的內部寄存器中。由于DDR3 SDRAM的位寬為64位[8],因此要將8位的數據輸入轉換成64位(8字節(jié))的數據輸出。圖像獲取模塊信號定義如表1所示。圖像獲取模塊(camera_capture)產生DDR寫入信號(ddr_wren_o)、DDR復位信號(ddr_addr_wr_set_o)、以及地址空間轉換信號(frame_switch)。該程序中ddr_data_camera就是由輸入的8位轉換成輸出的64位的像素。當接收到8 B數據時,產生DDR寫信號,并把接收到的8 B數據輸出給DDR3 SDRAM內部的先進先出(first in first out,FIFO)存儲器(FIFO)。如果沒有接收到或者接收到的數據不足8 B,那么DDR寫信號為低電平且沒有數據輸出。
表1 圖像獲取模塊信號定義Tab.1 Signal definition of image acquisition module
DDR3 SDRAM內部位寬為64位、深度為64,內部FIFO的容量為512 B。在圖像抓取模塊(camera_capture)中,產生DDR寫地址復位信號(ddr_addr_wr_set)和讀寫地址空間交換信號(frame_switch),并由這兩個信號來控制DDR3 SDRAM的讀寫。
DDR控制模塊將從圖像抓取模塊輸入的圖像信息先緩存在DDR3 SDRAM內部的存儲器中,然后再寫入DDR3 SDRAM存儲器。如果有輸出請求,再把DDR3 SDRAM存儲器中的圖像信息提取出來,輸送給VGA輸出模塊。DDR控制模塊的作用是對DDR存儲器進行讀寫的過程進行控制。在只有一片動態(tài)隨機存儲器的情況下,為了達到顯示的實時性和同步性[9],要對該模塊中圖像數據的傳輸采用乒乓操作,如圖2所示。
圖2 乒乓操作示意圖Fig.2 Schematic diagram of the Ping-pong operation
關鍵代碼如下:
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內部劃分成兩個部分(即bank0和bank1)。這兩個部分的空間均大于存儲一幀圖像所需要的字節(jié)數。當CMOS OV7670圖像傳感器初始化完成后,從圖像傳感器采集到的數據先寫入bank0中,同時讀取bank1中的數據;讀完一幀后,切換到bank0讀取數據[10]。這樣就可以保證數據的實時性和同步性。
VGA顯示共有5個信號:R、G、B三基色信號,行同步信號(HSYNC)和場同步信號(VSYNC)[11]。在本系統(tǒng)中,FPGA產生分辨率為640×480,刷新頻率60 Hz的VGA時序,包括行同步、場同步及顏色信號。這些信息經過圖像采集模塊以及DDR控制模塊后,傳輸到DDR3存儲器中。VGA輸出模塊只需要給DDR發(fā)送讀命令,就可以將DDR中的圖像信息通過VGA顯示出來。VGA時序如圖3所示,VGA顯示如圖4所示。
圖3 VGA時序Fig.3 Sequence diagram of VGA
圖4 VGA顯示圖Fig.4 The display of VGA
VGA輸出模塊信號定義如表2所示。該模塊產生VGA的幀行信號,行和列的計數,R、G、B三種基色以及讀地址復位信號。
表2 VGA輸出模塊信號定義Tab.2 Signal definition of VGA output module
VGA的顯示原理是對每一幀圖像的每一行進行逐點掃描。行同步信號標志著掃描一行結束。場同步信號也就是幀信號,它標志著一幅圖像的結束。
行、場時序執(zhí)行如表3所示。
表3 行、場時序執(zhí)行表Tab.3 Schematic diagram of the line timing execution and field sequential execution
如表3所示,在掃描的過程中需要一定的延時調整,所以出現了消影區(qū),在消影區(qū)內沒有圖像信息。
在VGA顯示模塊,由于VGA顯示16位的像素點,其中RGB分別占有5位、6位、5位。因此要將從DDR內部FIFO的64位數據分四次讀入VGA輸出模塊中。
CMOS OV7670圖像傳感器初始化完成(即reg_conf_done信號由低拉高)后,DDR控制模塊直接讀取DDR中的數據進行VGA顯示(此時,VGA顯示的第一幀是空白圖像)。當檢測到camera_vsync延時兩拍的上升沿時,frame_switch由低拉高,讀寫地址空間(bank0和bank1)交換。當camera_href=1且camera_vsync=0時,進行寫地址復位。與此同時,圖像采集模塊開始采集數據,等到camera_vsync再一次由低拉高一幀圖像采集完成。檢測到camera_vsync信號的上降沿時,地址空間交換信號(frame_switch)拉高一個時鐘周期進行地址空間的交換;檢測到camera_vsync信號的下降沿時,寫地址復位信號ddr_addr_wr_set_o拉高一個時鐘周期圖像獲取模塊的程序對DDR寫地址進行復位。圖像采集模塊的主要功能是將輸入到該模塊8位數據轉化成64位數據,并輸出給DDR控制模塊。
VGA輸出模塊在上電復位之后就進入工作狀態(tài),計數器x_cnt和y_cnt分別計行和列的像素個數。由上述兩個計數器產生的數據有效信號(hsync_de與vsync_de)控制VGA模塊的輸出。當hsync_de=1且 vsync_de=1時,VGA輸出模塊將64位的數據分4次讀取到相應的寄存器中,送到上位機由VGA顯示。當行數據有效信號(hsync_de)拉低,表示數據傳輸完成同時將輸出給R、G、B 這3個通道的數據全部清零。當幀數據有效信號(vsync_de)拉低,表示一幀圖像傳輸完成。然后,讀地址復位信號ddr_addr_rd_set拉高一拍,對讀地址進行復位,等待下一幀圖像的傳輸。
本文利用FPGA芯片作為邏輯控制的核心器件,采用CMOS OV7670圖像傳感器進行圖像采集,并在上位機由VGA進行實時顯示。采用一片DDR3 SDRAM芯片緩存,利用乒乓操作實現圖像的寫入與讀取互不干擾。仿真結果表明,該系統(tǒng)能夠較好地滿足圖像的實時輸出的需求。本設計的特點是靈活性高、可移植性強且能夠進行實時顯示。這將有助于對圖像預處理,尤其是圖像分析和目標識別的優(yōu)化,為進一步開發(fā)更復雜的圖像算法提供借鑒。