自由立体显示器是一种无需佩戴辅助装置就能观看三维立体效果的显示器。由于立体显示器能够真实还原三维信息,因此在军事、商业、医疗等领域有着广阔的发展前景。
随着立体显示器研究的不断发展,自由立体显示技术日趋成熟,不断涌现出各种新型的立体显示技术。其中基于视差的立体图像显示技术以实现方便和技术成熟的优点被广泛应用。传统的立体图像源通常不能直接用于新型立体显示器显示,为立体显示器提供合适的图像源成为立体显示研究的一个重要环节。本文介绍一种基于视差原理的立体显示器的视频转换系统,它能够将已有的立体视频格式转换成所需的视频格式。
基于视差的立体显示器需要在屏幕上同时显示一对立体图像,因此显示器所需的图像格式也不同于平面显示器。本文将以输入左右格式(Side-by-Side)的视频信号为例,详细描述该信号格式转换为一种液晶立体显示器格式的设计与实现。该系统以FPGA为核心,采用全数字的数字视频口DVI(Digital Visual Interface)作为液晶显示器的视频接口,并且使用一片DDR SDRAM构建了高速的帧缓存系统,保证了数据的实时处理。系统可以工作在2D和3D模式下,实现显示器的平面/立体兼容,在1 280×1024@60 Hz的19寸立体显示器上工作稳定,满足系统要求,通用性很好。
1 系统设计
1.1 目标视频格式
目前存在大量左右格式的立体图像和视频。所谓的左右格式,就是在一幅完整的图像上,将一对立体图像平行放置在图像的左半边和右半边,如图1(a)所示。观看者左眼只看到左边的图像,右眼只看到右边的图像时就能看到立体图像。一种基于液晶和视差原理的自由立体显示器,将左右图像分别放在亚像素列的偶数列和奇数列。以屏幕分辨率为1280×1024为例,原图第0“639列为左图,640”1279为右图,则第0列和第640列像素组成变换后图像的第0列和第1列;第1列和第641列组合为第2第3列……依次类推。组合的方式为交换对应像素的绿色分量。合成后的效果如图1(b)所示,左右图像的亚像素在水平方向间隔排列。
1.2 硬件系统设计
系统的硬件框图如图2所示。该系统采用DVI作为视频输入输出接口。DVI作为一种全数字的接口标准,已经成为液晶显示器必备的一种接口。与VGA相比,它的优点在于采用数字信号传输,没有A/D、D/A二次转换带来的信号损失。其中输入输出分别采用TI公司的TFP401和TFP410芯片,该芯片支持最高165 MHz的像素时钟,即对应1600×1200@60 Hz的分辨率。FPGA芯片采用Xilinx公司的Spartan3E系列的XC3S1600E,该芯片具有较为丰富的资源,并且成本较低。为了满足视频数据存储的需要,该系统还配备了一组位宽为32 bit、容量为64 MB的DDR SDRAM存储芯片。当系统工作在2D模式时,FPGA采集由DVI输入的视频数据,经SDRAM缓存后发送给DVI输出芯片;当系统工作在3D模式时,FPGA先对读入的数据实时进行格式转换后再写入SDRAM,然后从SDRAM读出转换好的数据发送给DVI输出芯片,立体显示器接收到的即是对应的立体格式的数据。该设计利用DVI输入输出时序上的特点,分时利用一组SDRAM实现了类似“乒乓操作”的帧缓存功能,充分利用了系统资源。
2 FPGA逻辑设计
系统设计的主要任务是完成FPGA对各个模块的控制,包括DVI数据的输入输出、SDRAM的读写控制、数据的缓存以及各模块之间的协调等。其中,数据的缓存是整个系统设计的关键。FPGA内部的模块划分如图3所示,虚线左边的模块采用视频的像素时钟作为工作时钟,频率取决于分辨率;右边的模块采用系统自身生成的时钟作为工作时钟,频率最高为166 MHz。
2.1 DVI输入输出
DVI输入输出控制,一方面根据同步信号采集视频数据;另一方面要根据输入信号生成输出信号,包括行同步(HSYNC)、场同步(VSYNC)、数据有效信号(DE)等。以输入视频信号1 280×1 024@60Hz为例,根据VESA(Video Electronics Standards Association)标准,此时像素时钟fp=108 MHz,每一行信号期间,当DE信号为高电平时,数据有效。于是可以在检测到DE信号的上升沿后开始采集数据,而在DE转为低电平后停止数据的采集。采集的数据写入SRAM,SRAM地址由同步信号解码产生。
为了精确生成输出DVI的同步信号,需要在采集DVI输入数据的同时统计输入信号各个特征脉冲维持的时钟数。图4所示为以行为单位统计场同步信号的参数。输出端在根据统计参数生成DVI同步信号的同时,当输出信号的DE为高电平时,从输出SRAM读取相应的数据送到数据总线。
2.2 数据缓冲
数据缓冲是整个设计的关键。数据的存储缓冲是信号处理中通常会遇到的问题。视频信号的缓冲,由于其数据量大,使得对存储器的容量和速度都提出了比较高的要求。当系统工作在1 600×1 200@60 Hz的最大分辨率时,存储一帧数据所需的容量是d0=1 600×1 200×3 B=5.49 MB,此时的数据率为d=d0×60=329.59 MB/s,这要求存储器具有大容量和足够快的速度。常用的数据缓冲方法有FIFO、双端口RAM和乒乓操作3种。
FIFO的使用非常简单,缺点是只能顺序读写,并且容量较小。双端口RAM可以做随机存取,且速度很快,然而SRAM的价格昂贵,容量通常在几百Kbit到几Mbit大小,所以也不适合做大容量的存储。而SDRAM有容量大且速度较快的优点,所以采用SDRAM的乒乓操作既可以满足视频数据大容量的要求,又能满足速度上的要求,是一种较好的方案。
综合以上方案,同时根据输入输出数据时序上的相似性特点,本文提出了一种时分复用单片SDRAM的方案。该方案用一组SDRAM实现类似“乒乓操作”的帧缓冲效果。
整个存储缓冲的结构如图5所示。输入输出均采用两级缓存的方式。其中第一级缓存可以存储一行数据,采用FPGA片内双端口SRAM实现;二级缓存是可以存放完整两帧数据的DDR SDRAM,作为主存储器。
当某一帧数据到来时,输入端的数据不停地从双端口RAM的一个端口写入SRAM_Rx。每当检测到DE的下降沿,说明已经有一行的数据写入完毕,则从另外一个端口将SRAM_Rx的数据写入DDR用于保存当前帧数据的存储区。写入一行结束时,输入端要等到下一个DE下降沿到来才会再次有读写SDRAM的需求。也就是说SDRAM此时处于空闲期,于是马上从之前保存好的上一帧数据中读出相应的一行数据写入SRAM_Tx,输出端则在写入SRAM_Tx一行完毕后从SRAM_Tx的另一个端口读出数据。这样一直到一帧结束。当下一帧数据到来时,交换读写所指向的帧存储区,这样保证了原视频信号的帧率不变。
为了使设计简单,DDR控制器模块DDR_IF使DDR工作在BL(Burst Length)即数据突发长度等于2的状态,并且以行为单位完成一次读写流程。每次要写入或者读出一行数据时,主控制模块MAIN_CTL向DDR_IF发送读写请求,然后发送一行数据所需要传送的突发长度的数量BL_CNT,以及该行数据要存入DDR的bank地址、行起始地址、列起始地址。之后,MAIN_CTL和DDR_IF进入读写流程。一行数据读写操作的Modelsim时序仿真如图6所示,图中以一行数据有3个像素为例。
根据以上分析,DDR在一行数据的时间内被复用,理论上只要满足写入一行加读出一行数据的时间小于一行数据的持续时间Th即可。在1 600×1 200@60 Hz的分辨率下,行周期Th=13.3,当DDR工作在165 MHz时,其读一行数据加写一行数据的时间为:Tl=1 600×2/165 M×2=9.7<Th。即使考虑到DDR在读写之外的其他操作上花费的额外时间,也能够满足要求。
2.3 格式转换
2.3.1 3D模式
2.3.2 2D模式
对于本文设计的系统,对程序稍作修改即可实现2D/3D兼容。只须在输入端,第k个像素到达时,各分量分别存入地址addr=k即可。
本文介绍的立体视频转换系统能够在不影响帧率的情况下进行实时转换,并且满足2D/3D兼容的需要。该系统目前已应用于立体显示器格式转换。DVI接口的使用,使得该系统有着广泛的兼容性。此外,系统用一片SDRAM实现了帧缓冲的功能,在充分利用系统资源的同时,使得整个系统的设计更为简洁,有利于减小体积和降低成本。同时,该系统实际上构建了一个通用的视频处理架构,具有很好的扩展性,程序只需稍作修改即可用于其他尺寸、其他格式视频源(如上下格式、时分格式)、其他立体实现方式(如按行或者按列分割左右图像)的立体显示器。
全部0条评论
快来发表一下你的评论吧 !