1)性能指标
Ø 分辨率:支持1920x1080p 60HZ视频流格式,24位RGB色显示;
Ø 功能:支持至少3个缓存帧、支持水平垂直方向自动滚屏,支持VGA和HDMI;
Ø 接口:支持AXI HP接口DDR3访问、支持AXI Lite接口进行CPU配置。
Ø 资源:(LUT、slice)< 20% ,BlockRAM < 10% ,DSP < 5% ,clock resource < 50%
图2 VGA视频显示系统结构图
VGA视频显示系统主要包括始终管理单元MMCM、视频数据传输单元VDMA、视频数据缓存Axi-Stream Data FIFO、视频输出Video out以及视频时序产生单元Video timing generate,如图2所示,VDMA1、VDMA2主要用于图片存储格式转换,方便程序进行水平、垂直方向滚屏,VDMA3将DDR缓存中的帧数据搬运出来进行显示,Video timing generate用于生成相应的水平同步信号Hsync和垂直同步信号Vsync,MMCM产生系统数据处理的运行时钟148.5MHz,同时也是VGA视频输出的点时钟PixlClock。
在静态显示模式下,VDMA3持续不断的从DDR3中读出帧数据,通过FIFO缓存,然后送到video out模块进行VGA输出;在水平或垂直滚屏模式下,需要对帧格式进行转换,水平存储格式如图3,4所示,两个虚拟帧缓存中存储P1和P2,VDMA1、VDMA2分别读出P1和P2,然后将P1、P2图象行交替存储在输出帧缓存中,由VDMA3读取并输出;垂直滚屏存储格式如图5,6所示,两个虚拟帧缓存中存储P1和P2,VDMA1、VDMA2分别读出P1和P2,然后将P1、P2图象行依次存储在输出帧缓存中,由VDMA3读取并输出。
图3 水平帧滚动示意图
图4 水平帧存储格式
图5 垂直滚动示意图
图6 垂直滚动帧存储格式
1) VGA显示接口时序
图7 VGA显示接口时序
图8 VGA显示相关参数示意
如图8所示,VGA显示控制主要是由Hsync和Vsync两个信号完成,主要参数有sync start、sync time、blank start、blank time等,这些相关参数都由VESA进行了标准化定义。如图9所示,1920x1080 @60Hz视频格式相关参数的标准化定义。
图9 1920x1080 @60Hz时序定义
2) VDMA读取接口时序
图10 VDMA读取接口时序
VDMA配置:Vertical Size = 5 lines , Horizontal Size = 16bytes, and Stride = 32bytes.
3) VDMA写入接口时序
图11 VDMA写入接口时序
VDMA配置:Vertical Size = 5 lines , Horizontal Size = 16bytes, and Stride = 32bytes.
Ø 支持axi-lite接口动态配置;
Ø 支持通用的数据传输位宽:32、64、128、256、512、1024数据位宽;
Ø 最大支持32个fream buffers;
Ø 支持帧同步操作;
Ø 支持PL中断;
1) Basic Options
图12 VDMA基本配置
FrameBuffers:配置缓存帧数量;
LineBuffer Depth:一般配置为一行的像素点数即可;
其他参数为Axi-Stream接口传输参数,可根据需求配置。
2) Advanced Options
图13 VDMA高级配置
Fsync options: S2mm_fsync——外部同步信号,在外部同步信号上升沿传输;
S2mm_tuser——在tuser上升沿开始一帧传输;
None——数据有效就开始传输;
Genlock Mode: 主要用于多视频系统同步,本文不涉及;写通道配置为master模式,读通道为slave模式,详见《pg020_axi_vdma.pdf》
Ø 视频时序输出,自动将AXI-stream数据转换成video数据流输出;
Ø 自动进行video时序同步;
Ø 可配置数据传输位宽及缓存;
Ø 支持主从两种工作模式;
图14 video out配置说明
关于video out的详细配置可以参考文档《pg044_v_axis_vid_out.pdf》
Ø 最大支持8192x8192分辨率;
Ø 自动进行video时序同步;
Ø 可配置输出video时序及极性;
Ø 可以配置16通道同步信号输出;
Ø 可配置中断信号;
图15 Video timing controller基本配置
图16 1920x1080 @60Hz时序配置
1) 考虑到代码的通用性和健壮性,底层驱动采用面向对象的结构体编程方式,外设配置均采用结构体操作方式;
2) 充分使用宏定义、预编译指令,方便参数更改和程序调试;
3) 对全局参数使用了静态方式进行初始化定义;
4) 中断注册采用回调函数的方式,可灵活配置中断函数。
硬件初始化包括VDMA配置、VDMA数据传输同步信号IO初始化、指示信号灯初始化。
VDMA初始化:
1. 定义相关结构体XAxiVdma_Config、XAxiVdma_FrameCounter、XAxiVdma_DmaSetup;
2. 依次调用结构体初始化相关函数:XAxiVdma_LookupConfig、XAxiVdma_CfgInitialize、XAxiVdma_Reset、XAxiVdma_SetFrmStore、SetupIntrSystem、EnableIntrSystem、ReadSetup;
3. 完成初始化;
IO初始化与VDMA初始化类似,详见具体程序《MyVdmaDrivers.c》
显存初始化主要是初始化显存地址、帧存储的开始位置以及帧大小,详见程序文件《ShowPicture.c》 。
画板初始化主要是设置画板地址,对画板内容进行清屏,详见程序文件《BaseDrawingTools.c》
所有图片显示与滚屏都在中断中完成,VDMA连续显示4帧产生一次中断,这时允许程序修改帧内容或者VDMA操作地址,VDMA必须重写Veritical Size寄存器,配置参数才会更新。
完成硬件初始化,配置好VDMA3操作地址,静态图片显示不需要辅助VDMA(VDMA1、VDMA2),设置VDMA3 :
VertSizeInput = SUBFRAME_VERTICAL_SIZE;
HoriSizeInput = SUBFRAME_HORIZONTAL_SIZE;
Stride = FRAME_STRIDE_SIZE;
配置好参数,即可开始静态图片显示。
配置辅助VDMA(VDMA1、VDMA2):
VertSizeInput = SUBFRAME_VERTICAL_SIZE;
HoriSizeInput = SUBFRAME_HORIZONTAL_SIZE;
Stride = FRAME_STRIDE_SIZE * 2;
VDMA1、VDMA2操作地址间隔一行像素,在目标地址中行交替存储。
VDMA3输出VDMA配置:
VertSizeInput = SUBFRAME_VERTICAL_SIZE;
HoriSizeInput = SUBFRAME_HORIZONTAL_SIZE;
Stride = FRAME_STRIDE_SIZE * 2;
在终端中依次修改VDMA操作地址即可实现水平滚动效果。
配置辅助VDMA(VDMA1、VDMA2):
VertSizeInput = SUBFRAME_VERTICAL_SIZE;
HoriSizeInput = SUBFRAME_HORIZONTAL_SIZE;
Stride = FRAME_STRIDE_SIZE ;
VDMA1、VDMA2操作地址间隔一帧像素。
VDMA3输出VDMA配置:
VertSizeInput = SUBFRAME_VERTICAL_SIZE;
HoriSizeInput = SUBFRAME_HORIZONTAL_SIZE;
Stride = FRAME_STRIDE_SIZE ;
在终端中依次修改VDMA操作地址即可实现垂直滚动效果。
目前画图函数只提供清屏、画点、划线、矩形、圆等基本几何形状绘制。