ZYNQ-使用HDMI显示器进行VDMA彩条显示测试

网友投稿 1220 2022-11-16

ZYNQ-使用HDMI显示器进行VDMA彩条显示测试

ZYNQ-使用HDMI显示器进行VDMA彩条显示测试

学习内容

本文使用带有HDMI接口的显示器,构建图像视频显示的测试工程,利用VDMA进行传输图像视频数据,进行彩条显示的测试。

开发环境

vivado 18.3&SDK,PYNQ-Z2开发板。

准备工作

所用到的IP:VDMA、video out IP、Video Timing Controller、动态时钟配置 IP和DVI IP。 详细介绍参考前文:

​​ZYNQ-AXI_VDMA IP简介​​​​ZYNQ-Video out IP和Video Timing Controller IP简介​​

系统框图

通过控制器(MCU)把彩条数据写入DDR,缓存到VDMA。然后通过AXI-stream to video out IP和VTC IP将视频数据转换为普通的视频接口的时序信号,然后通过GP0控制视频时序输出,,由显示器显示输出彩条图片。

硬件平台搭建

新建工程,创建 block design。

配置ZYNQ7

添加ZYNQ7 IP,对zynq进行初始化配置,

勾选M_AXI_GP0和S_AXI_HP0,

并添加时钟和复位信号。

配置VDMA IP

并添加VDMA ip核,如下图:

双击vdma ip核打开,进行配置ip核的相关信息。因为这里仅仅做显示测试,所以不需要进行帧缓存和调用写通道的资源,对于传输数据的位宽等信息根据自己将要显示图像大家进行合理配置。

配置Video out IP

添加 AXI4-Stream to Video Out IP,双击ip核打开,进行配置ip核的相关信息。按着图示配置即可,

配置VTC(Video Timing Controller ) IP

添加 Video Timing Controller IP,勾选AXI-Lite ,取消勾选监视器。

配置根据使用的显示器进行显示分辨率的设计,这里我就配置默认生成是1080p的

添加动态时钟配置 IP和DVI IP

迪芝伦公司提供的IP,​​IP 链接​​,用于动态生成视频时序信号的时钟。

连接数据通路

完成视频时序信号和视频信号的连接,

完成连接FCLK_CLK1信号连接,

完成动态时钟输出的视频时钟的连接,

完成连接最终系统设计

完成连接最终系统设计如下:

然后我们进行generate output product 然后生成HDL封装。接着就对应引脚进行引脚约束即可(PYNQ的粉色开发板可以直接引用这个约束):

set_property -dict { PACKAGE_PIN L17 IOSTANDARD TMDS_33 } [get_ports { tmds_tmds_clk_n }]; #IO_L11N_T1_SRCC_35 Sch=hdmi_tx_clk_nset_property -dict { PACKAGE_PIN L16 IOSTANDARD TMDS_33 } [get_ports { tmds_tmds_clk_p }]; #IO_L11P_T1_SRCC_35 Sch=hdmi_tx_clk_pset_property -dict { PACKAGE_PIN K18 IOSTANDARD TMDS_33 } [get_ports { tmds_tmds_data_n[0] }]; #IO_L12N_T1_MRCC_35 Sch=hdmi_tx_d_n[0]set_property -dict { PACKAGE_PIN K17 IOSTANDARD TMDS_33 } [get_ports { tmds_tmds_data_p[0] }]; #IO_L12P_T1_MRCC_35 Sch=hdmi_tx_d_p[0]set_property -dict { PACKAGE_PIN J19 IOSTANDARD TMDS_33 } [get_ports { tmds_tmds_data_n[1] }]; #IO_L10N_T1_AD11N_35 Sch=hdmi_tx_d_n[1]set_property -dict { PACKAGE_PIN K19 IOSTANDARD TMDS_33 } [get_ports { tmds_tmds_data_p[1] }]; #IO_L10P_T1_AD11P_35 Sch=hdmi_tx_d_p[1]set_property -dict { PACKAGE_PIN H18 IOSTANDARD TMDS_33 } [get_ports { tmds_tmds_data_n[2] }]; #IO_L14N_T2_AD4N_SRCC_35 Sch=hdmi_tx_d_n[2]set_property -dict { PACKAGE_PIN J18 IOSTANDARD TMDS_33 } [get_ports { tmds_tmds_data_p[2] }]; #IO_L14P_T2_AD4P_SRCC_35 Sch=hdmi_tx_d_p[2]set_property -dict { PACKAGE_PIN R19 IOSTANDARD LVCMOS33 } [get_ports { tmds_oen }]; #IO_0_34 Sch=hdmi_tx_hpdn

SDK软件部分

打开SDK后,新建application project。首先导入相关的IP的驱动文件

导入VDMA API驱动

#ifndef VDMA_API_H_#define VDMA_API_H_/* Include File Definitions */#include "xaxivdma.h"#include "xparameters.h"#include "xil_exception.h"/* General Type Declarations */typedef enum{ ONLY_READ=1, // ONLY_WRITE, // BOTH //}vdma_run_mode;/* Procedure Declarations */int run_vdma_frame_buffer(XAxiVdma* InstancePtr, int DeviceId, int hsize, int vsize, int buf_base_addr, int number_frame_count, int enable_frm_cnt_intr,vdma_run_mode mode);#endif /* VDMA_API_H_ */

在vdma_api.c,的函数Function Prototypes部分,也要修改添加参数

对于StartTransfer函数的修改:

对于run_vdma_frame_buffer函数的修改:

之前叫run_triple_frame_buffer

导入display_ctrl_hdmi和dynclk驱动

在迪芝伦的提供的IP中有他们已经封装好的驱动代码,这里直接导入我们的SDK工程文件夹即可。

完成驱动导入后,在main.c中键入下面代码:

运行效果

Reference

正点原子ZYNQ开发视频

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序-组件-视图容器
下一篇:使用小程序容器技术快速构建智能电视应用平台
相关文章

 发表评论

暂时没有评论,来抢沙发吧~