摘 要: 结合FPGA高速并行、重配置灵活和实时图像处理中数据吞吐量大、运算速率要求高的特点,设计了一种基于FPGA的实时图像处理实验平台。该平台结构简单、扩展性较好,无需修改前端采集和终端显示模块,即可实现实时图像处理的算法验证,适用于相关人员利用FPGA来进行视频图像处理。
关键词: 现场可编程门阵列;视频图像处理;硬件描述语言
现场可编程门阵列FPGA(Field-Programmable Gate Array)是目前应用十分广泛的一种现场可编程逻辑器件,其性能优越,资源丰富,采用并行处理方式,在数字信号处理领域具有很大的优势。数字图像处理技术应用广泛,目前处理算法通常是由软件串行计算来完成,但由于实时图像数据量大,对于处理运算的速度要求高,因此利用FPGA来对实时图像进行硬件处理成为一个新的发展趋势。本文介绍了一种采用CMOS摄像头作为视频源输入,SDRAM作为帧缓冲器,FPGA作为主控器和图像处理模块,ADV7123作为视频D/A转换器,UART和VGA作为输入输出接口的系统设计方案,对相关设计人员具有一定的参考价值。
1 实时图像处理实验平台架构
本系统由视频采集模块、帧缓存模块(处理前)、图像处理模块、帧缓存模块(处理后)、视频显示模块以及调试配置模块组成。处理流程如下:FPGA上电配置后,利用SCCB通信协议对视频采集单元OV7670进行功能配置并捕获视频流,缓存到帧缓存模块;配置调试模块利用UART对参数配置寄存器进行设置;FPGA图像处理模块读取参数配置寄存器的值并从帧缓存模块(处理前)中读取图像进行处理,处理完后缓存到帧缓存模块(处理后);视频显示模块从帧缓存模块(处理后)中读取图像送到ADV7123并根据VGA协议送出相应的行同步和场同步信号,实现实时图像处理后的显示。系统结构设计如图1所示。
2 视频采集模块
2.1 CMOS摄像头OV7670
本设计中采用的是OmniVison公司生产的CMOS图像传感器OV7670。图像传感器阵列为656×488(320 128像素),有效的为640×480(307 200像素),输出格式有YUV(4∶2∶2)、YCbCr(4∶2∶2)、RGB(GRB4∶2∶2,RGB565/555/444)、Raw RGB,图像尺寸支持VGA、CIF以及从CIF缩放至40×30的任意尺寸,标准的SCCB接口,兼容I2C接口。
2.2 SCCB通信控制
SCCB(Serial Camera Control Bus)是OmniVision公司定义的一种3线的总线,它由SCCB_E、SIO_C和SIO_D组成。为减少芯片引脚,缩减为两根线,即SIO_C和SIO_D。
在进行读写操作前后,需要有起始和终止信号。当SIO_C为高电平时,SIO_D出现下降沿跳变代表操作开始,上升沿跳变代表操作结束,而在具体数据传输过程中,只有当SIO_C为低电平时,SIO_D才可以变化。起始信号产生的实现如下。
0:begin
done<=1′b0;isout<=1′b1;sclk<=1′b1;
if(cnt==0)sdata<=1′b1;
else if(cnt==SCCB_SPEED_HALF)sdata<=1′b0;
if(cnt==SCCB_SPEED-1)begin state<=state+1′b1;cnt<=16′d0;sclk<=1′b0;end
else cnt<=cnt+1′b1;end
done<=0代表操作开始;isout<=1是将SIO_D设置为FPGA输出;sclk<=1是将SIO_C拉到高电平;state是状态机标识;cnt是一个计数器,用来对25 MHz的输入时钟记数,利用cnt可以形成100 kHz的工作时序;在0 ?滋s~5 ?滋s内SIO_D为高电平,5 ?滋s~10 ?滋s内SIO_D为低电平,而SIO_C一直保持为高电平。需要注意的是,在起始信号的最后一个时钟周期,将SIO_C拉到低电平是为了下一个状态即写设备地址时保证SIO_C为低。
读写操作由几个步骤组成,每个步骤包括8 bit串行数据(MSB优先)和1 bit X(Don′t care bit)或NA。写操作由3步构成,先写设备地址,再写寄存器地址,最后写寄存器的值。读操作由4步或5步构成,因为读周期只有两个阶段,无法确定寄存器的地址,所以在此之前需要有两个阶段或者3个阶段的写操作。需要注意的是,在读周期结束时主机需要将NA拉高。本系统中采用的是4步读,OV7670的设备地址为0x42,最后一位用来判断读写,所以读的时候为0x43。图2是用逻辑分析仪捕获到写、读时序。
由图可知,写操作由起始信号、8′h42、1′b0、8′h1e、1′b0、8′h1f、1′b0和结束信号组成;而随后的读操作由起始信号、8′h42、1′b0、8′h1e、1′b0、结束信号、起始信号、8′h43、1′b0、8′h1f、1′b1、结束信号组成。整体功能是对0x1e寄存器写0x1f,随后从0x1e寄存器中读出数据0x1f,跟写入的数据一致,即SCCB读写功能正常。
2.3 CMOS图像捕获
设置好OV7670的工作模式后,就可以对图像进行捕获了。本系统配置的是VGA 30FPS,分辨率为640×480,输出格式为RGB565。要捕获图像数据,只需要在VSYNC为0,HREF为1,PCLK上升沿时对D[7:0]进行采样即可,具体实现如下。
if(!i_vsync && i_href && i_start)begin
if(i==0)begin rgb565_buf[7:0]<=i_data[7:0];o_valid<=0;end
else begin o_rgb565[15:0]<={rgb565_buf[7:0],i_data[7:0]};o_valid<=1;end
i<=~i;
end else o_valid<=0;
图像捕获单元直接把RGB565的信号输出到异步FIFO中缓存,需要注意的是,这里需要根据VSYNC信号从一帧的起始来进行图像的缓存,否则缓存到帧缓冲区的图像数据会出错。
3 帧缓存模块(处理前,处理后)
帧缓存模块(处理前)完成从异步FIFO中读取图像数据,并实现帧缓存的功能。当图像处理模块需要图像数据进行处理时,可以通过FIFO获取帧缓存中的图像数据。帧缓存由SDRAM和FPGA内部的SDRAM控制器实现。
SDRAM选用的是韩国三星公司生产的K4S641632K-UC60,刷新周期为64 ms,CAS latency设置为3和2时,最高可达166 MHz和100 MHz工作频率。本系统设置CL为3,工作频率为100 MHz。SDRAM控制器由FPGA实现,主要完成对SDRAM的初始化以及读、写和自动刷新操作。SDRAM初始化包括4阶段:(1)上电保持时钟稳定,空指令200 ?滋s以上;(2)对所有的Bank进行预充电;(3)8个以上自动刷新命令;(4)模式寄存器设置命令。
初始化如图3所示,其中TRP为40 ns(4 cycles),TRFC为80 ns(8 cycles),TMRD为50 ns(5 cycles),BL为8 Words,BT为sequential,CL为3 cycles,OP为burst write & burst read。
读仿真如图4所示,其中TRCD为20 ns(2 cycles),CL为30 ns(3 cycles),采用自动预充电。
写仿真如图5所示,其中TRCD为20 ns(2 cycles),采用自动预充电。
帧缓存模块(处理后)与帧缓存模块(处理前)类似,完成从异步FIFO中读取图像数据,并实现帧缓存的功能。当视频显示模块需要图像数据进行显示时,可以通过FIFO获取帧缓存中的图像数据,此处不再赘述。
4 调试配置模块和视频显示模块
调试配置模块实现的功能是通过PC的UART接口对FPGA图像处理模块进行参数配置,以获得不同的处理结果,可以利用该模块对二值化的阈值进行设置以实现对应操作。
视频显示模块产生VGA协议所需的行场同步信号,并通过异步FIFO请求图像处理模块的帧数据,送到ADV7123完成RGB数据的D/A转换,从而在VGA显示器上完成实时图像处理后的显示。VGA(640×480@60 Hz)行周期由96个同步信号,48个消隐后肩,640个行有效数据,16个消隐前肩的像素构成;场周期由两个同步信号,33个消隐后肩,480个场有效数据,10个消隐前肩的行周期构成。相关时序如图6、图7所示。
图6展示了VGA的行周期,实现了红、绿、蓝、青、黑、白、黄,品红8色显示,每一色是80个像素,共640个像素。图7展示了VGA的场周期,由480个有效行组成。
5 图像处理模块
图像处理模块完成图像处理工作,通过异步FIFO从帧缓存模块(处理前)取数据,处理以后,再通过异步FIFO把处理后的数据流存到帧缓存模块(处理后)。由于该模块与整个系统的接口简单(输入是流式读FIFO,输出是流式写FIFO),并且与其他模块耦合性极小,因此该模块很容易扩展,基于流水线和并行操作的图像处理算法基本上都可以通过此模块实现。图8是对实时图像(上半部分)640×240区域进行RGB到YCbCr色彩空间转换后,取阈值分别为50、100、150进行二值化处理后的效果。
本文采用Altera公司的Cyclone II EP2C35系列FPGA设计并实现了一种视频图像处理实验平台,该平台具有结构简单、扩展性好等优势。在该系统的具体实现当中,所有的数据流处理和控制均采用FPGA硬件逻辑实现,因此该系统具有数据处理效率高的特点,但也因此引入了对FIFO和SDRAM的控制难点,这是相关设计人员最需要注意的。由于视频处理前和处理后均引入了SDRAM帧缓存,因此对于各种视频图像处理算法,只需在FPGA内对图像处理模块作相应修改,而前端采集模块和终端显示模块无需任何改变就可实现实时图像的各种不同的数据处理与相关验证。由于目前该系统中没有涉及到复杂的图像处理算法,所以下一步的工作是研究如何在该平台上实现更多的图像处理算法。
参考文献
[1] 祝长锋,肖铁军.基于FPGA的视频图像采集系统的设计[J].计算机工程与设计,2008,29(17):4404-4407.
[2] 李卫,王杉.SDRAM控制器的FPGA设计与实现[J].电子工程师,2004,30(10):29,32.
[3] 宋还吒,唐立军.基于FPGA和OV7620的图像采集及VGA显示[J].电视技术,2011,35(5):45-47.
[4] Samsung Electronics. 64 Mb K-die SDRAM Specification ds_k4s64xx32k_rev11[Z]. 2006.
[5] JEDEC Standard No.21-c [S]. JEDEC, Page3.11.5.1(1-19).
[6] OmniVision Technologies. OV7670 datasheet[Z].2006.
[7] OmniVision Technologies. OminiVision serial camera control bus(SCCB) functional specification[Z]. 2003.