引 言
近年来,嵌入式图像采集技术得到快速发展,但由于嵌入式系统的处理、传输和存储数据的资源有限,常成为系统采集速度的瓶颈,很难实现高速稳定的采集。
SoPC是近几年兴起的一种用于嵌入式开发的片上系统可编程技术,SoPC基于FPGA芯片,将处理器、存储器、I/O口等模块集成在一起,完成整个系统的主要逻辑功能,具有设计灵活、可剪裁、可扩充、可升级及软、硬件在系统可编程的功能。由于SoPC平台可以拥有微处理器系统丰富的软件资源和出色的人机交互能力,同时又具备FPGA系统的快速硬件逻辑特性,实现了软件系统和硬件系统的互补,因此发展前景非常广阔,被认为是未来嵌入式系统发展的方向。
在此试图设计一种基于SoPC的自感知图像采集系统,使其能够应用于低成本、低功耗的微型嵌入式图像监控和采集系统,以期在更多适合的应用场合替代传统基于PC的图像监控方案。在已见文献报道中,基于SoPC的图像采集系统设计大多只是把采集的数据缓冲在SDRAM或SRAM中,有些文献则进一步提出将缓冲后数据直接通过并口传输给主控芯片,有的方案则是由USB接口或以太网接口输出主机,另外有的文献则提出直接将数据存储到CF卡或硬盘中,而在SoPC系统直接实现SD卡的图像采集数据文件存储在国内还未见报道。
另外还提出了一种新的适合在FPGA硬件实现的快速运动检测算法,并和图像采集、SD卡图像数据存储接口电路集成在同一FPGA芯片内部。在此这一图像采集系统的结构、工作原理以及系统设计等加以介绍。
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读出。
经测试SDRAM控制器满足设计要求,在Model-Sim6.0中其时序仿真波形图如图4所示。
2.2.2 帧存分时切换机制
Write_FIFO,Read_FIFO1和Read_FIFO2都是16 b位宽,而SDRAM只有16 b的数据位宽,三个FIFO都要访问SDRAM,这就涉及到相互竞争的问题,在同一时刻只能有一个访问SDRAM。为此需要设计一个分时切换机制。由于SDRAM的操作时钟为100 MHz,而采集像素时钟为25 MHz,经过抽样后时钟频率更是大大降低。在一次采集周期内,SDRAM完全可以和三个FIFO的接口轮流切换,从而不会影响采集的速度。
如图5所示,其工作过程为:
(1)图像经格式转换模块输出,写入Write_FIFO的输入端口。
(2)当控制电路检测到Write_FIFO中读出端的数据量大于256(三个FIFO容量均为512 word)时,产生写命令,并拥有写互斥锁。SDRAM控制器接到命令,以100 MHz时钟将256个数据写入SDRAM。
(3)Write_FIFO输出256个数据后,读出端的数据量小于256,并且由于Read_FIFO1中初始状态的输入端数据小于256,Read_FIFO1拥有读互斥锁,产生读命令,SDRAM控制器接到命令,以100 MHz时钟将256个数据读出,并写入Read_FIFO1。
(4)当Read_FIFO1收到256个数据,其输入端数据大于256,并且由于Read_FIFO2中初始状态的数据小于256,Read_FIFO2拥有读互斥锁,产生读命令,SDRAM控制器将256个数据读出,并写入Read_FIFO2。
(5)这样就完成了一次操作,之后就是循环操作。地址信号也是由控制电路产生,每经过一次读写,地址增量为256,这样就可以保持信号的连续性。
(6)Write_FIFO在一定周期内向SDRAM中连续写入两帧连续图像;Read+FIFO1根据SDRAM中的地址读取其中的一帧图像数据;而Read_FIFO2读取另一帧图像数据。
通过这个机制,三个FIFO中始终都有数据,不会发生读空、写满情况,使得存储器两端的数据读/写方便,只要在write FIFO的输入端和Read—FIF01、Read FIFO2的输出端进行操作就行,在时钟的上升沿将数据写入或输出,实现了异步方式。
3 运动检测模块
该模块采用帧间差分法,其基本原理是将连续的两帧或几帧的图像对应的像素值相减,在环境亮度变化不大的情况下,如果对应像素值相差很小,则认为此处景物是静止的,如果图像区域某处的像素值变化很大,可认为这是由于图像中运动物体引起的。其算法实现简单,能够适应各种动态环境,稳定性较好。
设计中对相邻两帧图像的每个像素RGB分量分别取绝对差值。当绝对差值大于阈值时(这里取经验值16),就认为存在差异,如果做比较的两个像素的RGB分量只要有一个分量有差异,则令此点的数值为1,这样就得到一幅320×240像素大小的二值差值图像。然后传统处理方法是统计值为1的点的个数,如果其数量超过预设值,就认为两幅图像有差异。这种方法设计简单,但是准确率还不够高,为此该设计提出了一种改进的算法,引入了图像处理常用的两种操作腐蚀和膨胀。腐蚀与膨胀是一对逆运算,如果先腐蚀再膨胀,便构成了开运算。一般来说,开运算能够去除孤立的小点,毛刺和小桥(即连通两块区域的小点)。而总的位置和形状不变。
对上述二值图像进行开运算处理,可以消除小颗粒的噪声的干扰,从而尽可能降低误判和漏判。
设计流程如图6所示,通过调用ALTSHIFTTAPS IP核,并利用输出TAPS,构建一个11×11像素大小的图块作为结构元素,然后腐蚀:
(1)用11×11的结构元素,扫描图像的每一个像素;
(2)用结构元素与其覆盖的二值图像做“与”操作;
(3)如果都为1,结果图像的该像素为1,否则为0。
接着再将上述结果作为第二个ALTSHIFTTAPS的输入,再次构建11×11个像素的结构元素,然后进行膨胀处理:
(1)用11×ll的结构元素,扫描图像的每一个像素;
(2)用结构元素与其覆盖的二值图像做“或”操作;
(3)如果都为0,结果图像的该像素为0,否则为1。
最后得到运动判定信号DETECT,并用这个信号控制数据写入过程,一旦判定信号为1,就启动后续的图像存储过程。
4 SD卡图像存储模块
(1)接口电路模块。在各种存储设备中,SD卡不仅小巧,而且功耗很低,另外市面上常见SD卡的容量可达到2 GB以上,因此非常适合用于对体积和功耗要求严格的嵌入式图像存储。该设计选用APACER公司的一款高速SD卡(传输速率为150X,容量4 GB)。为了增强系统的可扩展性,该设计在FPGA芯片中嵌入Altera公司新近推出的第二代高性能NiosⅡ软核处理器,其处理能力超过200 MIPS,并在NiosⅡ中完成SD卡驱动程序设计。前端的采集缓存电路与NiosⅡ系统之间的数据和控制信号由定制的接口模块完成。
定制IP核DATAIN_FIFO是在SoPC Builder环境下完成(如图7所示),DATAIN_FIFO写端口的时钟信号、写请求信号同步于SDRAM控制模块的ReadFIFO1,而DATAIN_FIFO的读端口的时钟、读请求信号则由CPU控制。以上信号除了waitrequest之外,都由Avalon交换结构自动产生和控制。waitrequest信号可以直接连接到异步FIFO的rdempty输出,当FIFO读空之后,waitrequest有效,插入等待周期,一直到从端口的数据准备好才输出readdata。开始和结束采集控制信号由DETEcT信号和DMA中断信号决定,确保采集到的数据刚好为一帧320×240图像。
由于NiosⅡ系统提供了成熟的SPI接口,所以设计中采用SPI总线协议模式来读写SD卡。因为MMC卡在复位阶段要求SPI的时钟频率要小于等于400 kHz,为了提高读写速度,本设计设计的接口不再兼容MMC卡,其设置SPI的SCK引脚的输出频率在数据传输时设为25 MHz。
(2)BMP图像文件创建程序。为提高程序运行速度。并考虑到该系统的实际需要,程序只实现了写BMP图像文件功能。程序主要由SD卡操作驱动接口函数和文件系统层组成。
驱动函数目的是为文件系统层提供所需的SD卡初始化函数和SD卡写多块数据函数。图8是SD卡写函数流程图示意图。当写函数接收到主程序的写文件指令后,就向SD卡发送多块写命令,卡将发送给主机一个应答令牌,并且等待主机发送一个发送数据块来,当应答R1为0时,说明可以发送数据,块大小设置为512 B。数据块之后附有16位的CRC校验,因为CRC校验计算占用了很大部分发送的时间,该系统采用自定义用户指令对这部分进行了加速处理。
要使写入SD卡的数据在装有Windows或Linux操作系统的上位机中得到正确访问,需要在SD卡上创建它们支持的文件系统。考虑到FAT12目前已经很少使用,在此设计的文件系统只支持FAT16和FAT32。并且将整个卡作为一个分区处理。
图9是系统的软件工作主要流程图。在主程序中,系统启动后,先进行初始化操作,包括中断初始化、文件系统初始化和SD卡底层驱动的初始化。随后系统进入主循环等待状态,一旦检测到DETECT_PIO电平的变化就暂停SDRAM数据写入,以防SDRAM缓存的图像数据被覆盖,同时根据当前的时间创建一个BMP格式的文件,然后往里填写文件头和文件信息头,随后连续写一帧RGB数据。文件创建完毕后系统继续处于检测等待状态,并恢复SDRAM数据写入。
5 系统评价
该设计在自制核心实验板上(见图10)进行了软、硬件仿真和调试,调试环境参数设定如下:采集时钟频率为25 MHz,NiosⅡ时钟频率为100 MHz、每帧图像大小为320×240像素。调试结果如下:系统采集速度在60帧/s左右。对五米之内场景动态变化的响应时间在5 ms左右,SD卡保存单帧图像时间约为9 s(每帧图像数据量是153 600 B),连续工作一个星期无任何故障发生。结果表明该系统图像采集和处理速度超过一般的以软件实现为主的嵌入式图像采集方案(如ARM处理器系统)。由于核心处理器采用单芯片方案,采集系统比较稳定,同时其功耗大大低于多芯片方案。
6 结 语
在此提出一种基于SoPC技术的图像检测、采集和储存的一体化单芯片控制新型系统集成方案,并实现了原型系统,该系统的主要特点是处理速度快、功耗低、稳定可靠。
该设计可以在进一步工作中移植嵌入式操作系统μCLinux,以实现复杂的多任务操作。因此该设计既可作为独立的解决方案应用于便携式原位观测系统中,同时以其良好的扩展性,也可作为一个子系统应用于大型图像处理系统的前端部分。