摘要:提出了一種采用Altera公司CycloneⅡ系列的FPGA作為主控芯片,采用OV7670這款CMOS圖像傳感器作為視頻信號源并采用SRAM(靜態隨機存儲器)作為數據緩存的實用方案,實現了對圖像傳感器寄存器配置、圖像傳感器輸出信號采集、圖像數據格式轉換、圖像數據緩存及zui終在VGA顯示器上進行圖像顯示的一系列過程。該視頻采集系統設計能夠很好地滿足實時圖像的輸出需求。
關鍵詞:視頻采集;OV7670;FPGA;SRAM;VGA
CMOS與
CCD傳感器是目前被普遍采用的2種圖像傳感器。CMOS圖像傳感器可通過CMOS(互補金屬氧化物半導體)技術將像素陣列與外圍支持電路(如圖像傳感器核心、單一時鐘、所有的時序邏輯、可編程功能和A/D轉換器)集成在同一塊芯片上。與CCD(電容耦合器件)圖像傳感器相比,CMOS圖像傳感器將整個圖像系統集成在一塊芯片上,具有體積小、重量輕、功耗低、編程方便、易于控制等優點,并且可通過I2C,SPI等接口配置其工作方式等功能,可控性強。所以CMOS圖像傳感器在消費類電子、汽車電子、工業控制、圖像處理等領域的應用越來越廣泛。
通常視頻數據流需要處理的數據量大,而且對于實時性的要求也很高,圖像的采集和數據處理速度直接影響后續的圖像顯示質量。而可編程邏輯器件FPGA的快速發展使之在視頻圖像采集及圖像的無損傳輸領域具有得天獨厚的優勢。因此,本系統針對OV7670這款CMOS圖像傳感器,采用Altera公司CycloneⅡ系列的FPGA作為主控芯片,來實現視頻數據的無損傳輸及顯示。
1、系統總體結構和工作原理
本視頻采集系統采用OmniVision公司的OV7670數字圖像傳感器提供數字視頻信號,采用Altera公司CycloneⅡ系列的FPGA作為主控芯片,并采用單片SRAM(靜態隨機存儲器)作為數據緩存,將從FPGA輸出的數字信號經過D/A轉換換后輸入到VGA顯示器上進行顯示。其總體結構框圖如圖1所示。
系統的工作原理為:系統上電后,FPGA通過標準SCCB(SerialCameraControlBus)接口對圖像傳感器芯片的控制寄存器進行配置,設置它的工作方式(如輸出數據格式、輸出像素時鐘、曝光時間等),在本系統中將圖像傳感器輸出圖像格式設置為RGB565格式;對芯片初始化完畢后,FPGA為圖像傳感器提供25MHz的主時鐘,實時讀出圖像傳感器的行、幀同步信號以及像素時鐘和8位圖像數據信號;FPGA中數據采集與格式轉換模塊將讀入的圖像數據實時兩兩拼接轉換成16位RGB數據,由于圖像數據要進行跨時鐘域傳輸,需要由緩存控制模塊中的FIFO進行緩沖,然后送到SRAM存儲,同時VGA控制模塊產生VGA顯示時序,在需要將視頻圖像顯示時由VGA控制模塊產生讀信號,通過FIFO從SRAM中讀出圖像數據,圖像數據zui終經D/A轉換送到VGA顯示器進行顯示。
2、系統各模塊介紹
2.1圖像傳感器OV7670
本視頻采集系統采用OmniVision公司的OV7670這款CMOS圖像傳感器來采集視頻,為系統提供數字視頻信號。
OV7670圖像傳感器體積小,工作電壓低,提供單片VGA攝像頭和影像處理器的所有功能。通過SCCB總線控制,可以輸入整幀、子采樣、取窗口等方式的各種分辨率8位影像數據。所有圖像處理功能過程包括伽瑪曲線、白平衡、飽和度、色度等都可以通過SCCB接口編程。而SCCB是和I2C相同的一個協議。在本系統中采用Verilog語言描述的I2C配置模塊對OV7670的控制寄存器進行配置。
OV7670共有201個可供配置的控制寄存器,下面對幾個比較重要的控制寄存器進行說明。
CLKRC(寄存器地址0x11):配置OV7670輸出像素時鐘相對于外部(本系統中為FPGA)提供給OV7670圖像傳感器主時鐘的分頻。OV7670輸出的像素時鐘需要輸入FPGA用作數據處理的時鐘。
COM7(寄存器地址0x12):設置圖像的輸出格式,240)RGB565格式等。可以將圖像分辨率配置成從40×30到VGA分辨率的各尺寸,并且可以將圖像數據格式配置成YUV,RGB565,BayerRGBRAW,ProcessedBayerRAW等。這個寄存器的zui高位是用來軟件復位所有寄存器的值的。
SCALING_XSC(寄存器地址0x70)和SCAUNG_YSC(寄存器地址0x71):主要在調試的時候使用,分別將SCALING_XSC和SCALING_YSC的zui高位配置為1和0,就可以讓圖像傳感器輸出8色彩帶。這2個寄存器的其他位分別用于設置圖像的水平縮放系數和垂直縮放系數。
2.2 I2C控制模塊
I2C(Inter-IntegrateCircuit)總線是由PHILIPS公司開發的兩線式串行總線,用于連接微控制器及其外圍設備。用來對OV7670圖像傳感器進行配置的SCCB和I2C是相同的協議。本系統采用I2C控制模塊實現對OV7670的控制寄存器的配置。
I2C控制模塊包括I2C時序控制模塊和OV7670配置模塊。I2C時序控制模塊用于產生符合標準I2C協議的SCL和SDA信號,I2C傳輸時序如圖2所示。時序控制模塊每次傳輸24位數據,前8位是從設備地址(本系統中從設備即OV7670,將其地址定義為0x42,代表寫OV7670控制寄存器),接下來的8位是從設備寄存器地址,zui后8位是對OV7670控制寄存器進行配置的數據。OV7670配置模塊對從設備地址、從設備寄存器地址及配置的寄存器值總共24位數據進行了定義。本系統的I2C總線的時鐘采用20kHz,是由50MHz的系統時鐘分頻得到。
由OV7670輸入到FPGA的視頻信號有8位圖像數據cam_data[7:0]、像素時鐘cam_pclk、行有效cam_href、幀同步cam_vsync。在對OV7670的控制寄存器進行配置后,采用QuartusⅡ軟件提供的SignalTapⅡ邏輯分析儀觀察由OV7670輸入到FPGA的視頻信號,如圖3所示。
2.3數據采集與格式轉換模塊
利用I2C配置模塊配置完OV7670的控制寄存器以后,OV7670就能不斷輸出符合要求的8位圖像信號、像素時鐘和行幀同步信號。利用像素時鐘和行幀同步信號可以對采集到的8位RGB565圖像信號進行處理,系統中主要是將采集到的前后2個8位行數據合并成一個16位數據,以方便數據在后幾個模塊中的傳輸、緩存及處理。
如圖4所示RGB565時序及數據格式,一個像素占2個字節,其中第1個字節的前5位用來表示R(Red),*個字節的后3位加上第2個字節的前3位用來表示G(Green),第二個字節的后5位用來表示B(Blue)。數據采集與格式轉換模塊將FPGA采集到的數據還原成16位的像素數據。本系統中OV7670輸入到FPGA的圖像數據一幀有240行數據,在一個行有效期間有640個8位數據,經過轉換后輸出320個16位數據,輸入到緩存控制模塊。
Verilog代碼如下:
2.4緩存控制模塊
靜態隨機存儲器(Static Random Access Memory,SRAM)和同步動態隨機存儲器(Synchronous Dynamic Random Access Memory,SDRAM)是目前常用的2種存儲器,2種存儲器各有優劣,而SRAM相對于SDRAM時序控制較為簡單,因此本系統采用SRAM作為數據緩存。緩存控制模塊主要實現將轉換后的數據緩存在SRAM寫FIFO中以及將從SRAM讀出的數據緩存在SRAM讀FIFO中,而前端數據采集和處理是用OV7670輸入的25MHz的像素時鐘作為主控時鐘的,而SRAM的讀寫時鐘為100MHz,而后端VGA控制模塊的時鐘也為25MHz,對于數據在異頻的時鐘域之間的傳輸,需要利用例化2個異步FIFO模塊fifo_in和fifo_out作為數據在不同時鐘域之間的緩沖。FIFO通過IP核實現,存儲寬度為16b,存儲深度選擇512。緩存控制模塊的框圖如圖5所示。利用FIFO解決異頻時鐘域數據同步的方法是用上級隨路時鐘寫上級數據,然后用本級時鐘讀出數據。由于時鐘頻率不同,因此兩個端口的數據吞吐率不一致,設計時要開好緩沖區,并通過監控確保數據不會溢出。
2.4.1fifo_in模塊
在本系統中用數據采集與格式轉換模塊處理后的16位圖像數據作為fifo_in模塊的輸入數據,每次往FIFO中寫一行數據(320個16位數據)OV7670輸入的像素時鐘作為寫時鐘,行有效cam_href作為FIFO寫使能,FIFO的讀時鐘rdclk為100MHz,也是SRAM的讀寫時鐘。FIFO讀使能產生是通過判斷FIFO寫使能下降沿來生成一個計數值為320的計數器,在計數期間將讀使能置高,將數據由FIFO緩存到SRAM。因為在320個數據寫完后有一段時間行有效為低,由于SRAM讀速率遠大于上一級寫速率,可以充分利用這段時間將數據存入SRAM。
2.4.2fifo_out模塊
由于采用單片SRAM,SRAM的讀寫要避免沖突。因此通過判斷fifo_out模塊中的wrusedw(FIFO中剩余的數據數量)來控制FIFO的讀/寫。當wrusedw的值小于192時,將一個標志位fifo_empty置高。為避免讀寫沖突,將SRAM讀使能的產生分為2種情況,在幀有效信號置高期間,此時一幀圖像的數據正在由圖像傳感器輸出,SRAM會存在寫入數據的情況,只有在fifo_empty置高和SRAM寫使能下降沿同時滿足的情況下讀使能才會置高,而在幀有效信號為低期間,SRAM不會寫入數據,只需在fifo_empty置高時一個計數值為320的計數器開始計數,在汁數期間將讀使能置高即可。而FIFO的讀使能來自VGA控制模塊,在需要輸出圖像數據到VGA顯示器上顯示時,VGA控制模塊讀FIFO使能置高,來讀取FIFO中的圖像數據。
2.5VGA控制模塊
VGA(Video Graphics Array)即視頻圖形陣列,是IBM在1987年隨PS/2機一起推出的一種視頻傳輸標準,具有分辨率高、顯示速率快、顏色豐富等優點,在彩色顯示器領域得到了廣泛的應用。
VGA控制模塊主要是產生符合要求的VGA時序,使得視頻圖像數據能夠正確地在VGA顯示器上進行顯示。本系統中VGA控制模塊產生的是分辨率為640×480,刷新率為60Hz的VGA時序,并將從SRAM讀出的16位像素信號分成5位red信號、6位green信號和5位blue信號,輸出到D/A轉換電路。
VGA控制模塊中主要利用行同步計數器hcnt和場同步計數器vcnt來分別產生行同步和場同步。時序主要參考分辨率為640×480,刷新率為60Hz的VGA工業標準時序,如表1所示。
用于產生行、場同步的Verilog代碼如下:
在VGA控制模塊中利用行同步計數和場同步計數定義視頻圖像顯示區域。對于不同的顯示分辨率,只需參考相應的時序,修改代碼中的水平參數和垂直參數即可。由于VGA分辨率是640×480,而OV7670輸出圖像大小為320×240,將顯示器左上角區域作為視頻圖像顯示區域。在行同步計數和場同步計數均計數到視頻圖像顯示區域時,由VGA控制模塊產生讀FIFO信號,來讀取緩存在SRAM中的圖像數據進行顯示。
3、顯示效果及分析
本系統zui終實現將OV7670采集到的視頻圖像在VGA顯示器上進行實時顯示,圖像顯示流暢,畫面質量較好。顯示效果如圖6所示。
圖像zui終的顯示效果受多方面的影響,主要包括圖像傳感器的質量、D/A轉換質量、Verilog語言描述的FPGA硬件設計、系統硬件電路設計幾方面。本系統中OV7670圖像傳感器采集速度30幀/s,有效像素30萬,靈敏度較高,適合低照度應用。針對不同的應用環境,可以通過修改OV7670控制寄存器的值來調整傳感器內部圖像處理過程中的白平衡、飽和度、色度等來提升特定環境下的圖像質量,但受限于圖像傳感器的有效像素,這種方式所提升的顯示質量也是有限的。另外一個對圖像質雖影響比較大的方面是圖像數據D/A轉換質量。由FPGA輸出的圖像數據是數字信號,而VGA顯示器上的VGA接口接收的是模擬信號,必須經過數字到模擬的信號轉換。
本系統采用權電阻網絡來實現RGB565信號到VGA接口三基色信號轉換的電路,可基本滿足要求。在對圖像要求較高的場合,可采用的三通道視頻D/A轉換芯片來實現數模轉換,如ADI公司的ADV7125芯片等。另外,數字接口的發展為傳輸非壓縮的實時數字視頻提供了很好的支持。數字視頻接口DVI(Digital VideoInterface)和高清晰度多媒體接口HDMI(High Definition Multimedia Interface)都可以替代模擬的VGA接口應用到本系統中,從而能以低成本的電纜實現長距離、高質量的數字視頻信號傳輸。
4、結語
本視頻采集系統以FPGA為主控芯片,采用SRAM作為緩存,實現了對OV7670這款數字圖像傳感器的輸出視頻信號的數據采集、數據處理、數據緩存及視頻的zui終顯示。隨著CMOS技術和工藝的飛速發展,CMOS圖像傳感器的數據吞吐量越來越大,分辨率越來越高,對于更高要求的應用環境,可以采用更高速更高分辨率的CMOS圖像傳感器作為視頻信號源,可編程邏輯器件FPGA、各種存儲器如SRAM等也朝著高速化發展,使高分辨率、高速的視頻采集系統的實現和應用成為可能。