基于CMOS图像传感器的视频采集系统设计
扫描二维码
随时随地手机看文章
摘要:提出了一种采用Altera公司CycloneⅡ系列的FPGA作为主控芯片,采用OV7670这款CMOS图像传感器作为视频信号源并采用SRAM(静态随机存储器)作为数据缓存的实用方案,实现了对图像传感器寄存器配置、图像传感器输出信号采集、图像数据格式转换、图像数据缓存及最终在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(Serial Camera Control Bus)接口对图像传感器芯片的控制寄存器进行配置,设置它的工作方式(如输出数据格式、输出像素时钟、曝光时间等),在本系统中将图像传感器输出图像格式设置为RGB565格式;对芯片初始化完毕后,FPGA为图像传感器提供25 MHz的主时钟,实时读出图像传感器的行、帧同步信号以及像素时钟和8位图像数据信号;FPGA中数据采集与格式转换模块将读入的图像数据实时两两拼接转换成16位RGB数据,由于图像数据要进行跨时钟域传输,需要由缓存控制模块中的FIFO进行缓冲,然后送到SRAM存储,同时VGA控制模块产生VGA显示时序,在需要将视频图像显示时由VGA控制模块产生读信号,通过FIFO从SRAM中读出图像数据,图像数据最终经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,Bayer RGB RAW,Processed Bayer RAW等。这个寄存器的最高位是用来软件复位所有寄存器的值的。
SCALING_XSC(寄存器地址0x70)和SCAUNG_YSC(寄存器地址0x71):主要在调试的时候使用,分别将SCALING_XSC和SCALING_YSC的最高位配置为1和0,就可以让图像传感器输出8色彩带。这2个寄存器的其他位分别用于设置图像的水平缩放系数和垂直缩放系数。
2.2 I2C控制模块
I2C(Inter-Integrate Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。用来对OV7670图像传感器进行配置的SCCB和I2C是相同的协议。本系统采用I2C控制模块实现对OV7670的控制寄存器的配置。
I2C控制模块包括I2C时序控制模块和OV7670配置模块。I2C时序控制模块用于产生符合标准I2C协议的SCL和SDA信号,I2C传输时序如图2所示。时序控制模块每次传输24位数据,前8位是从设备地址(本系统中从设备即OV7670,将其地址定义为0x42,代表写OV7670控制寄存器),接下来的8位是从设备寄存器地址,最后8位是对OV7670控制寄存器进行配置的数据。OV7670配置模块对从设备地址、从设备寄存器地址及配置的寄存器值总共24位数据进行了定义。本系统的I2C总线的时钟采用20 kHz,是由50 MHz的系统时钟分频得到。
由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 DynamicRandom Access Memory,SDRAM)是目前常用的2种存储器,2种存储器各有优劣,而SRAM相对于SDRAM时序控制较为简单,因此本系统采用SRAM作为数据缓存。缓存控制模块主要实现将转换后的数据缓存在SRAM写FIFO中以及将从SRAM读出的数据缓存在SRAM读FIFO中,而前端数据采集和处理是用OV7670输入的25 MHz的像素时钟作为主控时钟的,而SRAM的读写时钟为100 MHz,而后端VGA控制模块的时钟也为25 MHz,对于数据在异频的时钟域之间的传输,需要利用例化2个异步FIFO模块fifo_in和fifo_out作为数据在不同时钟域之间的缓冲。FIFO通过IP核实现,存储宽度为16 b,存储深度选择512。缓存控制模块的框图如图5所示。利用FIFO解决异频时钟域数据同步的方法是用上级随路时钟写上级数据,然后用本级时钟读出数据。由于时钟频率不同,因此两个端口的数据吞吐率不一致,设计时要开好缓冲区,并通过监控确保数据不会溢出。
2.4.1 fifo_in模块
在本系统中用数据采集与格式转换模块处理后的16位图像数据作为fifo_in模块的输入数据,每次往FIFO中写一行数据(320个16位数据)OV7670输入的像素时钟作为写时钟,行有效cam_href作为FIFO写使能,FIFO的读时钟rdclk为100 MHz,也是SRAM的读写时钟。FIFO读使能产生是通过判断FIFO写使能下降沿来生成一个计数值为320的计数器,在计数期间将读使能置高,将数据由FIFO缓存到SRAM。因为在320个数据写完后有一段时间行有效为低,由于SRAM读速率远大于上一级写速率,可以充分利用这段时间将数据存入SRAM。
2.4.2 fifo_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.5 VGA控制模块
VGA(Video Graphics Array)即视频图形阵列,是IBM在1987年随PS/2机一起推出的一种视频传输标准,具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用。
VGA控制模块主要是产生符合要求的VGA时序,使得视频图像数据能够正确地在VGA显示器上进行显示。本系统中VGA控制模块产生的是分辨率为640×480,刷新率为60 Hz的VGA时序,并将从SRAM读出的16位像素信号分成5位red信号、6位green信号和5位blue信号,输出到D/A转换电路。
VGA控制模块中主要利用行同步计数器hcnt和场同步计数器vcnt来分别产生行同步和场同步。时序主要参考分辨率为640×480,刷新率为60 Hz的VGA工业标准时序,如表1所示。
用于产生行、场同步的Verilog代码如下:
在VGA控制模块中利用行同步计数和场同步计数定义视频图像显示区域。对于不同的显示分辨率,只需参考相应的时序,修改代码中的水平参数和垂直参数即可。由于VGA分辨率是640×480,而OV7670输出图像大小为320×240,将显示器左上角区域作为视频图像显示区域。在行同步计数和场同步计数均计数到视频图像显示区域时,由VGA控制模块产生读FIFO信号,来读取缓存在SRAM中的图像数据进行显示。
3 显示效果及分析
本系统最终实现将OV7670采集到的视频图像在VGA显示器上进行实时显示,图像显示流畅,画面质量较好。显示效果如图6所示。
图像最终的显示效果受多方面的影响,主要包括图像传感器的质量、D/A转换质量、Verilog语言描述的FPGA硬件设计、系统硬件电路设计几方面。本系统中OV7670图像传感器采集速度30帧/s,有效像素30万,灵敏度较高,适合低照度应用。针对不同的应用环境,可以通过修改OV7670控制寄存器的值来调整传感器内部图像处理过程中的白平衡、饱和度、色度等来提升特定环境下的图像质量,但受限于图像传感器的有效像素,这种方式所提升的显示质量也是有限的。另外一个对图像质虽影响比较大的方面是图像数据D/A转换质量。由FPGA输出的图像数据是数字信号,而VGA显示器上的VGA接口接收的是模拟信号,必须经过数字到模拟的信号转换。
本系统采用权电阻网络来实现RGB565信号到VGA接口三基色信号转换的电路,可基本满足要求。在对图像要求较高的场合,可采用专用的三通道视频D/A转换芯片来实现数模转换,如ADI公司的ADV7125芯片等。另外,数字接口的发展为传输非压缩的实时数字视频提供了很好的支持。数字视频接口DVI(Digital Video Interface)和高清晰度多媒体接口HDMI(High Definition Multimedia Interface)都可以替代模拟的VGA接口应用到本系统中,从而能以低成本的专用电缆实现长距离、高质量的数字视频信号传输。
4 结语
本视频采集系统以FPGA为主控芯片,采用SRAM作为缓存,实现了对OV7670这款数字图像传感器的输出视频信号的数据采集、数据处理、数据缓存及视频的最终显示。随着CMOS技术和工艺的飞速发展,CMOS图像传感器的数据吞吐量越来越大,分辨率越来越高,对于更高要求的应用环境,可以采用更高速更高分辨率的CMOS图像传感器作为视频信号源,可编程逻辑器件FPGA、各种存储器如SRAM等也朝着高速化发展,使高分辨率、高速的视频采集系统的实现和应用成为可能。