1 系统结构及工作原理
该系统选用的。FPGA芯片是Altera公司CycloneⅡ系列的EP2C35。该芯片具有35 000个逻辑单元、672个引脚、475个用户自定义I/O接口、35个嵌入式乘法器和4个锁相环。FPGA芯片外接美光公司型号为MT9M011的130万像素的CIS(CMOS图像传感器,分辨率为640×480时60帧/s)、Hynix公司的型号为HY57V641620HG的SDRAM(4 Banks×1 M×16 b),以及用来图像显示验证的液晶屏等。
系统工作过程如图1所示。CIS经过I2C配置模块的初始化后,输出行场同步信号、像素时钟和图像数据。再将采集的数据转换成RGB信号,帧缓冲模块(Frame Buffer)每次将相邻两帧图像数据写入SDRAM,然后比较这两帧图像的差值,如果差值大于设定的阈值,就认为检测到了外界场景的运动,系统会自动将捕获的图像输出到SD卡进行存储。
2 系统模块设计
2.1 采集模块
2.1.1 CIS配置模块
目前嵌入式采集系统大多仍采用模拟摄像头,再经过A/D转换得到数字图像信号。而相比较而言,CMOS图像传感器能够直接输出数字信号,而且其以体积小、功耗低、成本低的优势更适合应用在嵌入式应用领域,在该设计中采用130万像素的CMOS图像传感器,其输出图像品质已相当接近CCD感应器。MT9M011芯片内部自带时序发生器和ADC,使用时只需输入一个时钟信号(该设计采用25 MHz的时钟信号),图像数据便按行有效信号(LINE VALID)、场有效信号(FRAME VAL-ID)和像素时钟(Pixel clock)时序关系一同发出。
MT9M011上集成了I2C接口,其初始化由内部的I2C总线来配置,通过编写硬件描述语言来模拟I2C总线时序,从而配置各寄存器,其中,该设计需要配置的寄存器如表1所示。该模块采用计数器建立一个状态机,先写器件地址,再写寄存器地址,然后写数据。另外还提供每帧图像的控制信号以及图像的行计数器和列计数器,为后续处理作准备。
2.1.2 格式转换模块
MT9M011所输出的图像格式为Bayer格式,奇行由绿、红像素交替构成,偶行由蓝、绿像素交替构成。要想在显示屏上显示,必须将Bayer格式通过CFA插值滤波为RGB图像数据。该模块采用双线性插值算法(BiIinear Interpolation),与高阶B-spline和Cubic-spline等插补函数算法相比,图像的像质相差不大。但Bilincar的算法要简单得多,不仅消耗的硬件资源相对要少,而且易于硬件实现。其算法原理是每个像素位置上缺少的彩色分量由3×3邻域内具有相同颜色分量的像素平均值获得。
设计中调用移位寄存器IP核,将间隔为640的3个数作为输出,这样同时取到三行同一列的三个数据,将这三个数据存入寄存器分别作两次缓存延迟,从而得到3×3的邻域数据,根据配置模块提供的行列计数的最低位来判断该邻域中间点所在行和列的奇偶性,从而计算出不同的RGB值。至此,每点图像数据量变为原来的3倍。为了便于在液晶屏进行图像显示的验证和SDRAM的缓存,在该模块将RGB数据进行了抽样处理,采用隔点隔行采样使得每帧图像分辨率降为320×240像素。
2.2 缓存模块
考虑到系统需要缓存的数据量较大,在各种随机存储器件中,SDRAM器件价格低、容量大、速度也较快,非常适合用于图像采集系统。但SDRAM的控制逻辑比较复杂,要求有一个专门的控制器。 缓存模块是由Sdram控制器,三个FIFO以及分时切换电路组成。SDRAM控制器负责外部SDRAM的读/写操作。三个FIFO中Write_FIFO用来数据输入,Read_FIFO11和Read FIFO2用来数据输出,容量均为512,位宽设为16 b。考虑到SDRAM只有16 b的位宽,输入的RGB信号分别只取各自的最高5位。
2.2.1 SDRAM控制器
SDRAM控制器是由命令生成状态机和数据通道两个模块构成。系统的初始化、读写和刷新的控制采用有限状态机来实现。如图2所示,其状态转移系统复位后由复位状态(Reset)进入初始化(Init)状态。初始化包含初始化延时、初始化预充电、初始化刷新和初始化模式寄存器设置4个子状态。初始化时将模式寄存器设置为长度为“1”的突发读写方式。设置完模式寄存器后,系统进入空闲状态。当3个FIFO半满信号有效后。SDRAM控制器进入行激活状态,经过两个周期空操作(ActiveNOP)状态后进入读或者写状态。
读数据过程由Read CAS状态开始,经过CAS延时,进入Read_Data状态。突发计数器从Read_CAS态开始计数,当计数到读写请求的突发长度时,状态机进入Read_Precharge状态将打开的行关闭。在图像采集中,用突发方式存完一行后,下一次存取的将是不同的行。根据这一特点,在SDRAM控制器中进行了优化,在读写操作完成后执行自动预充电,将打开的行关闭,将预充电的时间隐藏在数据访问中,从而提高了SDRAM访问的速度。写操作过程由Write_Data和Write_Precharge状态组成。当激活一行完成后,进入到Write_Data状态,突发计数器对周期计数,计数到突发长度时,状态机进入Write_Precharge状态将打开的行关闭。需要注意的是Read_Precharge和Write_Precharge后都需要两个空操作才能再打开新的一行。
由于图像数据流的连续性,每隔65 μs就有一行数据输入,因此在SDRAM控制器中没有必要再设置刷新计数器,而是在响应图像采集数据请求后将采集的一行数据存入SDRAM后对SDRAM进行刷新。由于HY57V641620HG要求在65 ms内完成4 096次刷新,该设计验证时按照每帧图像(320×240)×(60帧/s)格式采集,需要在采集一行后完成[1/(60×240)/64]×4 096△4.4次刷新,因此需执行5次刷新操作。在Write_Precharge完成后,如果写操作是由FIFO半满信号有效引起的,状态机将进入自动刷新状态,完成5次刷新操作后回到Idle状态。如图3所示,数据通路模块受OE信号的控制,使数据的进出和相应的操作指令在时序上同步。OE为1时,数据可由DQ脚写入SDRAM,OE为0时,数据可从SDRAM的DQ读出。