基于FPGA的ARM图像缩放器的实现
扫描二维码
随时随地手机看文章
ARM是目前全球最大的嵌入式芯片技术的IP提供商,其所拥有的IP已经成为众多芯片设计公司采纳的一种技术标准和开发平台。所以基于ARM 内核的SoC已经成为嵌入式处理器的开发重点,可通过ARM实现LCD控制器来完成对嵌入式LCD屏的控制。如果利用TFT屏支持显示,其图像分辨率存在局限性,因此通过搭建一个FPGA平台实现图像缩放器功能外接LCD显示器,完成ARM信号的扩展显示。同时FPGA也能完成对ARM平台产生的图像信号进行验证和仿真,以测试其功能和时序的正确性。XGA显示器因其显示量大,输出形式多样等特点已经成为目前大多数设计中的常用输出设备,因此本文针对ARM产生的VGA信号通过插值算法对其扩展为XGA标准信号。
1 VESA标准中的VGA与XGA时序
视频电子标准协会(VESA)是非盈利国际组织,主要制定个人电脑、工作站以及消费电子类产品在视频接口标准,因此本文所设计的VGA与XGA的时序均按照VESA标准设计。
显示器通常采用逐行扫描的方式,每一帧图像按顺序一行接着一行连续扫描而成,扫描的过程中由水平同步信号HSYNC和垂直同步信号VSYNC来控制扫描。行扫描和场扫描的时序图如图1所示,其行扫描和场扫描的时序要求如表1、表2所示。
图1 行扫描时序和场扫描时序
2 系统整体设计
2.1系统框图
系统设计的数据源是来自ARM9系统板的视频信号,其格式为VESA标准的VGA信号。数据源进入FPGA后先进行图像缩放的处理,把输入的有效像素数据利用算法对其进行处理,期间的处理数据利用FIFO与DDR2进行缓存,然后把处理后的图像数据按照XGA时序送入视频编码芯片,最后送入显示器显示。其中FPGA内部设计分为时序控制模块、时序产生模块、FIFO模块、图像缩放器模块以及DDR2 SDRAM控制器模块,如图2所示。
图2 系统原理框图
2.2 硬件实现
FPGA采用Altera的EP3C16F484C6芯片,该芯片具有15 408个逻辑单元,504 KB内存,56个乘法器和4个PLL锁相环内核,最大支持346个I/O端口,系统时钟最高为250 MHz。FPGA开发板采用了专门的视频解码编码芯片,Silicon Image的视频编码芯片SI7170支持VGA到UVGA的格式标准,同时也支持HDTV格式的编码。DDR2 SDRAM采用三星的K4T51163QC芯片, 其频率支持267 MHz,本文选取为200 MHz。芯片容量为32 MB×16,实际上只要SDRAM满足存储2帧图像的容量即可满足本文设计要求[1]。完成转换后的XGA信号所需的输出时钟为65 MHz,可由FPGA内部锁相环产生。
3 FPGA内部模块工作原理
3.1输入时序控制模块与输出时序控制模块
输入时序控制模块是根据输入视频信号的同步信号和时序要求,确保有效的图像数据能够顺利写入FIFO进行缓存。例如当模块接收到场同步信号时,FIFO进入即将写入的状态,当模块接收到使能信号时, FIFO开始写入数据,这样能确保写入FIFO的数据是从完整1帧图像的起始开始写入。
输出时序控制模块的功能是产生输出图像所必需的同步信号、场同步信号和行同步信号,以保证输出图像的数据与时序一致,从而使图像可以正确地显示在显示器上。
输入输出时序控制模块,按照计数器的方法进行设计[2]。例如VGA信号的1帧图像的总像素要求为800×525,其中有效像素为640×480。对于行扫描来说可设置1~96像素时钟计数为行同步信号,97~144像素时钟计数为行消隐后肩,145~784像素时钟计数为图像有效像素显示,685~800像素时钟计数为行消隐前肩。完成一行后,计数器置0,等待新的行同步信号到来再重新计数。在图像有效像素时钟内,让写入FIFO使能信号处于有效状态,而其余时间使能信号处于无效状态,这样可保证有效图像数据能准确写入FIFO进行缓存,并等待下一步的处理。
3.2 图像缩放器模块
如图3所示,图像缩放器模块主要完成对输入图像数据源进行分辨率的缩放。根据设计,输入的图像数据为VGA 640×480格式,输出的图像数据为XGA 1024×768格式。由于输入图像数据与输出图像数据在完整1帧中的每一行像素点和每一列的数量上之比都为5:8,因此可考虑对输入的VGA信号作5:8的放大。先对数据在水平方向上进行插值放大,然后再进行垂直方向上的放大,设计中水平方向和垂直方向的插值放大均使用分级双线性插值算法。
图3 图像缩放器模块框图
3.2.1分级双线性插值 [3]
在双线性插值算法中,插值点的值根据其相邻的4个已知点计算得出,如图4所示。
图4 双线性插值算法原理图
已知a、b、c、d为输入图像内的相邻的4个点,其灰度值表示为f(x)。待插像素f点映射到原图像后的坐标值小数部分为[m,n]。计算f点灰度值的过程如式(1)~式(3)所示:
f[g]=f[a]+m(f(b)-f(a)) (1)
f[h]=f[c]+m(f(d)-f(c)) (2)
f[f]=f[g]+m(f(h)-f(g))
=(1-m)(1-n)f(a)+m(1-n)f(b)+(1-m)nf(c)+mnf(d) (3)
分级双线性插值使用的4个源图像像素点都是待插值点的直接邻点。插值的计算过程如下:
g(x)=(f(a)(m×N)+f(b)×(1-m)N)/N
其中,m与1-m分别是a点与b点的权值。因为是做5:8的转换,这里取C=N=8, 将原来为5个像素点的长度区间划分为8个区间,每个区间都有m×N与(1-m)N这一对权值组成的整数对。每个区间内部的待插值点都与该区间左边界取同样的值。8个区间的权值对应于(8,0)、(7,1)、(6,2)、(5,3)(4,4)、(3,5)、(2,6)和(1,7)。在确定好了点位置后,以查找表的方式写入权值与位置之间的关系,最后可根据内插点与临近点的相对位置查找对应系数,并通过计算得出各像素点的灰阶值。
3.2.2具体插值过程
3.2.2.1水平插值
将双线性插值分解为水平和垂直方向进行,由于是把原图像作5:8的放大,所以根据分级双线性插值,把原水平方向的5个像素点采用分8级双线性插值送入水平插值器。水平插值器由计数器与使能信号同时控制,每间隔5个时钟,水平插值器使能端置于计算插值状态,把进入的5个值进行一次插值变成新的8个像素点,之后再间隔5个时钟,将新的值进入插值器进行插值,直到把1行640个像素点插值为1行1 024个像素点。
3.2.2.2 垂直插值
垂直插值器完成垂直方向5:8的转换,即5行数据变为8行数据的转换,插值过程是按垂直方向对原来的5行数据采用分8级双线性插值,变换为新的8行数据。
完成水平插值的数据流水线型通过FIFO1与FIFO2模块,期间将FIFO1与FIFO2的值送入垂直插值器进行插值,完成垂直插值后的数据送入FIFO3与FIFO4模块,输出顺序排列在先的送入FIFO3,而另外一行数据进入FIFO4。FIFO3与FIFO4之间的数据也是流水线型进入到DDR2 SDRAM模块中,整个过程通过使用状态机对垂直插值进行控制,使经过垂直插值后的数据能以正确的顺序完成插值,并且送入DDR2 SDRAM模块。把对原5行数据经过水平和垂直插值变为8行数据的时间作为一个周期,直到完成整1帧VGA格式图像到1帧XGA图像的放大。
3.3 DDR2 SDRAM控制器模块
控制器模块的具体作用为:当SCALER完成图像数据处理后,把图像数据送进DDR2中储存,在确保DDR2中存储有2帧完整图像时,DDR2的读出端才开始读取,从第一帧图像地址读取图像数据,然后据根据时序控制从DDR2输出。当读完第一帧后,继续读取第二帧,此时第三帧继续写入原第一帧地址,之后的读取写入都按此过程进行。
由于DDR2 SDRAM不能同时写入和读出,所以需要DDR2 SDRAM控制器加以控制。可根据连接到DDR2 SDRAM模块写入端和读出端的FIFO内部已存数据数量进行读写控制。写入端前的FIFO即为图3的FIFO3。连接到DDR2读出端的FIFO为图3的FIFO2,它与输出时序控制模块共同完成最终所需XGA图像的输出。DDR2 SDRAM每次操作指令时,以1行数据为单位,即接受1次读命令,则读出1行数据;同样,接受1次写入命令,则写入1行数据,此1行数据同时为XGA格式的1行(1 024个像素点数据)。
4 仿真与功能实现
在设计中,采用Verilog语言对各逻辑模块进行编写设计,在开发环境Quartus II 9.1和Modelsim-altera 6.5b下完成对各模块的时序的仿真和功能的设计和验证,如图5所示为数据进入水平插值器后的仿真结果,水平插值把原5像素插为新8像素的仿真,其中pix为待插值的5个像素,data为插值后的8个新像素。
图5 水平插值5像素插成8像素Modelsim仿真图
经过对各模块设计的仿真,并且对各模块功能验证正确后,进行系统整体的仿真验证,最终将处理完成图像数据送到LCD上进行显示,经过放大后的示例如图6 所示。仿真验证表明,得到的图像时序和数据与要求的时序一致,对于图像数据来说虽然双线性会对屏幕边缘存在高频分量的损失[4],使轮廓稍有模糊,但是从图像上对人眼观看的影响很小。
图6 经过放大的ARM图像信号在LCD上的显示(XGA格式)
介绍了VESA标准中的VGA与XGA时序,通过FPGA平台设计图像缩放器,完成控制信号、时序信号和数据信号的同时输入和控制,同时使用插值算法对分辨率进行放大,达到了对ARM图像信号的扩展显示。如要实现更多格式之间的转换,可在程序写入各种图像格式缩放之间的算法,如VGA、XGA、SVGA等格式。在程序中利用状态机实现不同格式之间的转换和时序的控制,加强缩放的范围,扩展其运用。