4.D/A输出显示设计
本设计采用ADV7123作为视频转换芯片,将数字视频信号转换为VGA模拟信号,供本地计算机显示输出。ADV7123具有三路高速、10位输入的视频DA转换器,具有330Mhz的最大采样速度,与多种高精度的显示系统兼容,可充分满足本系统的转换需求。当RGB三通道的输入比特数少于10位时,可将高位用于数据比特传输,低位接地处理。ADV7123芯片产生三路模拟输出后,结合FPGA传来的行、场同步信号完成视频的显示。
四、 系统软件设计
1. FPGA软件设计
FPGA[4]模块的软件设计主要实现以下3方面的功能:
1)I2C接口配置
在上一小节中提到,AD9883芯片内部的寄存器通过I2C总线完全可编程,本小节将讲述FPGA通过I2C接口对这些寄存器的具体配置。通过这些具体参数的配置,可实现对AD9883视频采集格式、视频转换效果等的控制。
AD9883内部共25个寄存器,其中00H和14H为只读寄存器,15~18H为测试用寄存器,01H~13H为功能寄存器。FPGA芯片对主要功能寄存器的配置如表1所示:
2)RGB与YUV的转换
本系统中的FPGA模块的另一功能是将RGB信号转换为YUV信号,二者转换的公式为(RGB取值范围均为0-255):
由于FPGA芯片进行浮点运算时,运算步骤繁琐并且硬件资源消耗较大,故将式1中的参数均乘以256后取整,转换如下:
经过运算后,得到式2中的Y’,U’,V’分量后,分别取数据的高八位即为Y,U,V分量的实际值。
3)VPFE接口时序的实现
由于AD9883芯片输出的同步信号与DM355要求的输入同步信号格式不匹配,因此需要将同步信号进行转换。AD9883芯片输出的同步信号周期包括行消隐前肩、行消隐后肩、同步信号和图像数据四个部分,而实际传输给DM355的视频处理前端的信号仅包括同步信号和图像数据两个部分,因此需要对信号周期进行转换,如图6所示。
图6 VGA行、场同步时序示意图
2.DM355软件设计
1)视频处理前端驱动的修改
为了采集转换后的YUV信号,本文对DM355的视频处理前端的驱动进行了修改,配置视频采集设备的工作模式为YUV输入模式。主要修改的驱动文件为dm355_vpfe.c,部分代码解析如下:
static vpfe_objvpfe_device_ycbcr = {
……
.vwin= {0,0,1024,768},//VPFE_WIN_VGA,
.bounds= {0,0,1024,768},//VPFE_WIN_VGA,
//设置采集的YUV信号的分辨率
.pixelaspect= VPFE_PIXELASPECT_NTSC,
.pixelfmt= V4L2_PIX_FMT_UYVY,
.field= V4L2_FIELD_NONE,
//设置V4L2的工作模式为逐行扫描格式
……
.capture_device= TVP5146,
.ccdc_params_ycbcr= {
.pix_fmt = CCDC_PIXFMT_YCBCR_16BIT,
//采用16位数据总线传输YUV信号
……
.bt656_enable = FALSE,
//不采用BT.656采集模式
.pix_order = CCDC_PIXORDER_CBYCRY,
.buf_type = CCDC_BUFTYPE_FLD_SEPARATED
//该设置相对于CCDC_BUFTYPE_FLD_INTERLEAVED而言,设置buffer为独立的
},
.tvp5146_params= {
.mode = TVP5146_MODE_AUTO,
.amuxmode = TVP5146_AMUX_COMPOSITE,
.enablebt656sync = FALSE,
//不采用BT.656同步模式
.data_width = TVP5146_WIDTH_16BIT
//数据总线宽度为16bit
},
.irqlock= SPIN_LOCK_UNLOCKED
};
2)视频信号采集程序设计
在DM355的应用程序设计中,视音频数据的采集、编码、输出分别通过Capture Thread,Video Thread,Writer Thread独立线程来实现。其中,视频采集线程的主要作用是对采集设备进行初始化,开辟缓冲区,以帧为单位往其中写入数据,为Video Thread做准备。
视频采集程序通过调用V4L2[5](Video For Linux 2)来实现,V4L2是Linux中提供的关于视频设备的内核驱动,它为针对视频设备的应用程序变成提供一系列的接口函数,如VIDIOC_REQBUFS,分配内存;VIDIOC_QUERYBUF,将VIDIOC_REQBUFS中分配的数据缓存转换成物理地址;VIDIOC_QUERYCAP,查询采集设备功能;VIDIOC_S_FMT,设置当前驱动的视频捕获格式;VIDIOC_STREAMON,开始视频采集等。
图7采集设备初始化流程图
图7为视频采集线程对采集设备进行初始化的流程图。在Linux中,视频采集设备的设备文件名为/dev/video0,可通过函数open(“/dev/video0”, O_RDWR | O_NONBLOCK, 0)来打开视频设备。打开设备文件后,利用ioctl函数,设置不同的V4L2参数,来调用底层的V4L2驱动程序,获取视频采集设备的参数,根据实际应用需求设置视频格式,同时为采集设备分配帧缓冲区,并将该缓冲区映射到用户空间。这样,当缓冲区中存储了一帧视频数据后,VIDIOC_DQBUF就把数据从缓冲区中读取出来,VIDIOC_DQBUF把数据放入视频数据缓存队列继续下一帧的采集。当接收到结束采集命令时,通过ioctl函数发送VIDIOC_STREAMOFF命令,停止视频采集。
五、系统测试和结束语
本系统对VGA信号采集成功后,利用MPEG4算法进行编码,并利用开源的JRTP库实现网络传输功能,客户端可实时观看和存储接收到的码流。在进行VGA信号采集编码的同时,可利用ADV7123芯片将VGA信号还原,在本地的显示器进行输出。经过实验测试,本系统具有较好的实时性,解码后的图像主观质量也很好。
本文提出的基于TMS320DM355处理器,采用AD9883和ADV7123转换芯片,结合FPGA技术的VGA信号采集方案,能够对XGA信号进行实时采集。该系统可广泛应用于雷达、天气预报、航空航天、通信等领域的图像数据实时记录。
|