[赛灵思FPGA]基于FPGA的视频图像显示控制器的设计与实现
0赞基于FPGA的视频图像显示控制器的设计与实现
韩彬
【摘要】在显示领域中,高分辨率的视频图像显示控制器的实现是一项重要的技术。本课题提出了一种基于单片SDRAM的实时,多分辨率的视频图像显示控制器的设计方案。本设计仅使用现场可编程FPGA,仅采用一片64MBits的SDRAM,在片内跨时钟缓存处理视频图像数据,理论上实现了高达1280*1024@60Hz的分辨率的控制器。最后,设计了基于EP2C8Q208C8的视频显示系统硬件平台,并且通过OV7670摄像头实时采集视频数据,基本验证了“视频图像显示控制器”的整体性能与指标,证明了控制器的稳定性与可靠性。
关键词:视频图像;显示控制器;多画面叠加;SDRAM;FPGA;
1. 引言
随着科技的发展与进步,数字时代的今天,人类的想象是无限的,人们对信息的处理和交换的要求越来越高,而视频图像也越来愈成为人们直观视觉的要求。为了满足人类视觉的享受,高新显示技术日新月异。由于当下液晶显示器大都为数字屏,分辨率高,刷新率快,时序严谨,使得国内外各大厂商在性能和价格上展开了激烈的竞争。目前通用的液晶显示控制器,很多都采用专用芯片,但这也受芯片性能的局限,同时也不具有较好的灵活性。
众所周知,近10年来,现场可编程FPGA的迅速发展,两大巨头Altera、Xilinx的在竞争中不断超越,由95nm到28nm,以及20nm技术的突破,从此,在过去CPU尴尬的领域出现了福音。据了解,在工控行业,FPGA主要有以下应用[1]:
① 高速并行数据传输。
② 高速存储器读取。
③ 高速的图像和视频处理。
④ 大型LED面板驱动和高分辨率LCD驱动。
⑤ 协处理器。
由于FPGA的高速高精度,并行运算能力极强,更以其在数字领域“无所不能”的地位,在未来开发中,协同处理器指令控制,用FPGA来实现加速处理,完成用CPU无法比拟的指标,越来越成为一种趋势[2]。
自FPGA面世以来,国内外,视频图像显示控制器的FPGA实现,逐渐被提出,认可并不断开发。高清LCD、LED显示器,在逻辑控制上,用处理器比较困难,但采用并行高速的FPGA,外扩高速显存SDRAM,或者DDR,甚至DDR2,实现“视频图像显示控制器”,甚至实现“万能显示控制器”,将是工程师,以及产品研发的终极目标。
2. 系统的结构与功能
由于高清的视频图像流数据量大,既要进行同步处理,又要进行实时显示,对于海量数据,必然需要大容量存储器来进行缓存。同步动态随机存储SDRAM存储量大,价格低廉,作为大容量存储器,在高速视频图像处理中具有很大的应用价值。而本系统中,由于数据量在SDRAM允许的带宽范围内,因此选用了单片SDRAM作为帧数据缓存的存储器,非常合适[3]。
“基于FPGA的视频图像显示控制器”的研究,旨在通过纯逻辑设计,实现各种大分辨率LCD显示驱动,同时处理高速视频图像数据流,甚至海量数据存储系统等,从而完美替代专用LCD芯片。用FPGA来设计视频图像显示控制器,充分发挥其优势,不仅能在性能上能突破了瓶颈,在成本上降低了消费,而且使得视频处理系统更加的灵活,便于应用、优化、升级,无疑是一个明智的选择。
本系统主要组成框图如图 2-1所示,系统以FPGA为核心,以SDRAM为缓存,通过逻辑实现各项功能,主要可分为、“万能显示控制器”、“SDRAM控制器”、“视频图像数据流处理”这3个模块,相关内容及指标如表 2-1所示:
1. 视频图像显示控制器的设计
1.1. 万能显示控制器
目前显示器大都为数字屏,而数字屏的驱动时序,大都为SYNC模式或者DE模式,这两者与VGA时序都十分雷同,即为行场扫描时序。VGA时序的实现方式有很多,可采用专用芯片、ARM等,但具有一定的局限性[4],本设计采用并行高速FPGA,模拟VGA的时序,实现兼容各种分辨率的“万能显示控制器”。lcd_driver顶层设计模块如图 3-1所示。
由于VGA时序比较简单,因此本文不涉及相关时序设计,进而介绍兼容模式的“万能显示控制器”的设计思路。首先,不同的数字屏,像素时钟上差别很大。这里采用Cyclone III或者更高级的FPGA内部动态PLL来切换时钟,以适应不同数字屏。当然为了向下兼容,也可以用分频时钟来得到需要的像素时钟。其次,代码中为了便于移植,采用了`define形式定义参数。使用时可通过标准时序的选择,或者自定义参数,编程实现不同分辨率的驱动。相关参数定义如下:
`ifdef LCD_1024_768_60FPS_65MHz
`define H_FRONT 11'd24
`define H_SYNC 11'd136
`define H_BACK 11'd160
`define H_DISP 11'd1024
`define H_TOTAL 11'd1344
`define V_FRONT 11'd3
`define V_SYNC 11'd6
`define V_BACK 11'd29
`define V_DISP 11'd768
`define V_TOTAL 11'd806
`endif
1.2. SDRAM控制器
系统选用了廉价的SDRAM作为帧数据缓存。但SDRAM的时序相比于SRAM而言,不但在操作上更加复杂,而且时序严谨,在逻辑设计中难度较大。相关操作其中主要包含了SDRAM初始化,定时刷新以及读写操作。由于帧数据量大且高速,因此采用全页突发模式,实现高速读写,发挥SDRAM的优势。
在SDRAM进行正常工作之前,需先完成寄存器初始化,即确定SDRAM的各项参数及工作模式。此后,在定时刷新的前提下,便可以在任意时刻进行任意地址的突发读写操作。SDRAM的工作时很复杂的一段状态机,涉及到12个状态的跳转,如图 3-2所示。
SDRAM工作状态机主要包含了定时自刷新,突发读取,突发写入等状态,在外部命令以及内部信号的协同下,完成数据的帧数据的缓存操作。表 3-1详细说明了每一状态的工作情况[5]。
1.1. 视频图像数据流处理
1.1.1. 异步帧数据处理
SDRAM通常需要在高频下工作(本系统SDRAM主频为125MHz)。由于系统源端、终端的频率,与SDRAM主频不同步,涉及到了跨时钟域的问题。处理跨时钟域问题通常采用高频的握手信号来同步交互数据,或者异步缓存来实现大量数据的同步。本系统中视频图像数据流数据量大,因此采用异步FIFO来作为SDRAM的前后级缓存是最佳的选择[6]。
如图 3-3所示,通过W_DCFIFO与R_DCFIFO的缓存来实现异步数据同步读写,从而完成帧数据的有效缓存。图 3-4表示了DCFIFO的操作流程,读FIFO的读端、写FIFO的写端口分别与SDRAM同步,其他端口分别与源端同步。
1.1.2. 片内“乒乓”读写
“乒乓操作”是一种应用于数据流控制的处理技巧。输入数据流通过“输入数据选择单元”将数据流等时分配到两个数据缓冲区,同时每个数据流经过相关的处理后由后端选择器选择输出,一次循环。
由于异步时钟域问题,单片SDRAM既要实现帧数据的缓存,又要实现帧数据的输出,源端与终端在数据流上不能存在任何冲突。由于SDRAM中有4个L-Bank,而每一帧数据只需要1-2个L-Bank,因此可以将0-1与2-3 L-Bank作为乒乓循环的缓存。在SDRAM带宽允许的情况下,通过DCFIFO的协调,实现数据总线分时复用,可以达到0-1与2-3 L-Bank的读写无冲突操作。
在SDRAM带宽允许的条件下,姑且认为这是一种特殊意义的“乒乓操作”,如图 3-5所示,在一开始,帧数据默认输入L-Bank0-1,显示器默认从L-Bank2-3读取数据,在写满一帧后,切换一次乒乓,交替读写的L-Bank;在下一帧写满后,继续循环。如此,在SDRAM片内通过“乒乓操作”,来实现跨时钟域的视频图像数据流的完整转换、存储、交替。
图 3-6表示了片内L-Bank切换模块的RTL图。在设计中,通过捕获了视频图像流的帧有效信号frame_valid下降沿即帧无效标志,来触发L-Bank读写状态机。
在状态设计中,需要注意的是,不能仅仅是简单的“乒乓操作”,读写L-Bank切换需要一个严谨的交互过程。为了防止帧数据的丢失,当接收到frame_valid失效信号后,等待frame_write_done(帧写入完成)信号,才切换L-Bank;同样为了保证视频输出的完整性,在frame_valid失效后,等待frame_read_done(帧读取完毕)信号,才切换L-Bank。如此循环,在SDRAM片内,实现了跨时钟帧数据交替,实现视频图像的有效显示[7]。
1.2. IP核通信协议的制定
为了规范设计,便于移植,以及日后升级,封装了“视频图像显示控制器”的所有模块,定制IP核心,并且初步拟定了IP核心相关的IC接口、用户接口,以及通信协议。
1.2.1. IP核接口定义
初步封装了“视频图像显示控制器”IP核,并整理了相关IC接口以及用户接口,主要可以分为以下几个部分:
① 端口1-4表示了IP核的全局时钟以及复位信号输入接口。
② 端口5-15表示了SDRAM的IC硬件接口。
③ 端口16-23表示了LCD(ADV视频IC)的信号线。
④ 端口24-29表示了突发读写长度以及SDRAM地址等参数控制接口。
⑤ 端口30-34表示了IP核心预留的用户接口。
1.1.1. IP核通信协议
为了方便“视频图像显示控制器”IP核的使用,规范了IP核通信协议,并且初步制定了视频图像数据流写入的相关时序。遵循一定的时序,通过表 3-2中端口30-34即IP核用户接口的控制,实现帧数据写入,完成异步缓存于SDRAM的功能,从而实现视频图像的正确显示[8]。
图 3-7表示了IP核的数据写入时序。clk_write为IP核数据写入时钟,可以是FPGA片内产生,也可以是外部处理器供给。为了尽量简化时序,设计中除了sdram_init_done(SDRAM初始化完成信号),只用了3跟信号线,其中frame_valid用了判断帧是否有效。在frame_valid有效前提下,IP核每捕获到一个sys_we上升沿,接收一个sys_data_in数据.这与80接口通信协议雷同,很容易实现。
2. 系统实现与验证
最后,为了验证视频图像显示控制器的性能,以EP2C8Q208C8为核心,在Altium Designer中设计了原理图,并且绘制PCB,完成了整个系统的硬件平台设计。系统平台如图 4-1。所示(为后继需要设计了两片SDRAM,实际只用了一片)。
为了验证的设计的性能,系统中添加了OV7670 CMOS摄像头,如图 4-1所示。该摄像头每秒输出30帧640*480的彩色图像,作为系统的数据源。系统中通过捕获摄像头数据,按照以上拟定的协议,写入数据至IP核,同时以VGA模式(640*480@60Hz)输出到显示器。
在Quartus II中添加了摄像头驱动模块,应用了“视频图像显示控制器”IP核,综合整个设计的电路,图 4-2表示了整个视频显示系统的RTL电路图。本系统以“视频图像显示控制器”IP核为核心,以OV7670摄像头为数据源,主要可以分为系统时钟处理、摄像头初始化、摄像头数据捕获、视频图像显示控制器IP核这4个模块。
经过长时间测试,验证了“基于FPGA的视频图像显示控制器”的性能极其稳定性。测试结果如图 4-3“视频显示系统”,其中右边为电脑播放的视频,左边为OV7670摄像头实时捕获并且在VGA显示的结果,测试在画面上稳定流畅,清晰保真,在性能上运行稳定,可靠性强。