基于DSP+FPGA的嵌入式图像处理系统的发展
0 引 言
伴随着图像处理技术的快速发展,图像处理系统的性能需求也在不断提高,特别是在实时性上的要求[1]。基于PC或者工作站的图像处理系统,常常不是一个可行的选择[2],原因如下:应用对处理时间要求苛刻;CCD摄像机数据量太大。另外,这类系统的资源有效利用率较低,体积大而笨重,功耗高,不适合便携式应用场合[3]。
DSP是一种基于指令和代码的流水线处理器,具有强大的数据处理能力和较高的运行速度,采用C/C++或者线性汇编语言编程,可以支持复杂的算法处理[4],而FPGA则属于真正的并行架构[5],不同的处理操作无需竞争相同的资源,每个处理任务都可以不受其他逻辑块的影响自主运行,因此FPGA具有强大的并行处理能力,其现场可编程的属性也带来了更大的灵活性,但是,FPGA不擅长复杂的算法处理和逻辑控制。本文基于DSP+FPGA架构构建了一个嵌入式图像处理系统,使得DSP和FPGA可以发挥各自的特长,协同处理,与单独采用DSP或FPGA的系统相比,本系统具有更强大的数据处理能力,且更灵活、更通用。
1 系统架构
本系统采用DSP+FPGA架构,原理方框图如图1所示,其中DSP芯片采用TI公司单核最高性能的TMS320C6455(简称C6455)[6]芯片作为核心处理器,负责完成视频图像的复杂算法处理,FPGA芯片采用Altera公司的Cyclone Ⅲ系列芯片EP3C55[7],FPGA作为DSP的协处理器,负责完成图像的采集、显示和传输等辅助功能,使得DSP可以专注于算法处理。
DSP和FPGA之间通过32位EMIF接口实现了高速同步无缝互联, 由图1可知,本系统的动态存储器均采用DDR2 SDRAM,其中C6455所带2片DDR2存储器用来存储图像和算法数据,为C6455处理大数据量、复杂算法提供了保证。FPGA所带2片DDR2存储器用来存储捕捉的Camera图像数据,以便VGA显示和DSP读取。FPGA采集的图像数据可通过EMIF和EDMA从FPGA所带的DDR2存储器搬运到DSP所带的DDR2存储器。
图1 系统方框图
2 FPGA设计
本文FPGA的主要功能围绕着DDR2存储器的读写,如图2所示。
图2 FPGA的主要功能模块图
相机负责向缓冲区写数据,VGA显示和DSP负责从缓冲区读数据。本文中的DDR2控制器工作于Full?rate模式下,需要向DDR2 driver提供2倍数据宽度,即64 b数据。本文对每个读写数据通道,使用独立的FIFO进行不同时钟域之间的数据传输。从CameraLink[8?9]相机的LVDS接收器解码得到8 b图像数据,在向Write FIFO写之前,需要按8 B进行打包处理,合并为64 b数据;而发向VGA显示的数据在从Read FIFO中读出后,需要先经过拆包处理,得到8 b图像数据后才能送给VGA Controller;从Capture FIFO读出的数据发送给DSP之前也要经过拆包处理,将64 b数据拆为2个32 b数据后,才能发送给EMIFA,进行传输。为方便可视化验证算法处理结果,DSP算法处理结果可以通过McBSP发送给FPGA,FPGA接收到数据,将其转换为可视的屏幕位置送给VGA Controller,在屏幕上进行叠加显示。
本系统应用于近红外图像处理领域,采用的CameraLink相机[10]输出分辨率为1 024×768,帧率为30 f/s,而一般的液晶显示器刷新频率为60 Hz,为了将捕捉到的相机数据显示出来,需要将30帧图像插帧为60帧,但是显示时钟与相机时钟并不是同源时钟,其帧率并不是严格的两倍关系,这种相机和显示之间的异步时序关系如图3所示,所以不能简单地将一帧图像显示2次;同时,本系统的近红外图像算法处理时间根据图像的不同而具有不确定性,并非每帧图像都能在一个帧周期内处理完成。基于这两个因素,本系统没有采用常规的乒乓缓冲处理方式,而是采用了三重缓冲解决了这两个问题。
图3 相机和显示的异步时序关系
所谓三重缓冲,也即在DDR2存储器内开辟了三个缓冲:BufferA,BufferB和BufferC。其中,读写操作各占一个缓冲区,第三个存储区作为中转,先不考虑DSP从缓冲区读数据。
三重缓冲的示意图如图4所示,假设当前缓冲区BufferA正在进行写操作,缓冲区BufferB正在进行读操作,缓冲区BufferC则有2种可能:已写满(FULL)和已读完(EMPTY)两个状态。此时,如果需要进行读写翻页操作,即读复位信号或写复位
信号有效时,DDR2驱动程序可按不同情况给出不同的操作,如表1所示。
例如,当读复位信号有效,写复位信号无效时,说明缓冲区BufferA尚未写满,而缓冲区BufferB已经读完,此时,需要查询缓冲区BufferC的状态,如果缓冲区BufferC处于“FULL”状态,则读缓冲区将由当前的缓冲区BufferB改为缓冲区BufferC,并将缓冲区BufferB设置为“EMPTY”状态;如果缓冲区BufferC处于“EMPTY”状态,则将重新读取缓冲区BufferB。
图4 三重缓冲的示意图
表1 三重缓冲的决策表
再考虑DSP从缓冲区读数据的情况,为保证DSP任意时刻开始读数据,总能读到最新的数据,本文使用图像的场信号FVAL下降沿作为触发,定位DSP读数据的缓冲区地址,如果在下一个FVAL下降沿之前DSP始终未开始读数据,则在新的FVAL下降沿时刻重新定位缓冲区地址,反之,如果DSP开始读数据了,即使在FVAL下降沿未能读完,也会继续读,直到DSP读完数据,再重新定位缓冲区地址,按本文设计的方案,DSP会在很短的时间内完成读数据任务,而如果在两个FVAL内,DSP一直未完成读任务,则认为发生了错误,读控制器会进行复位矫正。
DDR2驱动的读写控制以显示的行信号HD为周期,周期性查询是否需要进行读写操作。其状态转移示意图如图5所示。
图5 DDR2读写控制的状态机
SignalTap Ⅱ Logic Analyzer是Quartus Ⅱ自带的嵌入式逻辑分析仪,与ModelSim软件仿真有所不同,是在线式仿真,可以实时捕捉和显示信号变化。图6所示是本文用SignalTap Ⅱ捕捉到的数据波形。
图6 SignalTap Ⅱ波形图
3 C6455软件设计
本文C6455的软件基于TI提供的抢占式多线程实时内核DSP/BIOS[11]进行开发,网络部分使用了NDK[12]开发套件,为了实现通过网络发送图像数据给计算机和接收来自计算机的图像数据,使用了面向无连接的UDP协议,相比TCP协议,UDP速度更快,更适合应用。C6455软件主要包含三个部分:实时性最高的硬件中断线程(HWI);采集线程和两个任务线程(TSK);处理线程和通信线程,流程图如图7所示。
图7 C6455程序流程图
4 实验结果
本文提出的基于DSP+FPGA的图像处理系统,已经通过实验验证。图8展示了本系统图像处理算法连续运行500个周期的统计结果,图中实线为连续10个相邻离散点的平均值。由图8可见,本系统既可以使算法在超过一个图像帧周期的时间内运行,又可以使连续一段时间内平均的执行时间近似为图像帧周期。本系统满足了数据量大,算法复杂度高的系统需求,相比乒乓缓冲,本文所提出的三重缓冲具有更快的响应速度。