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,
并添加时钟和复位信号。
完成配置后点击OK,配置后入下图:
配置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_n
set_property -dict { PACKAGE_PIN L16 IOSTANDARD TMDS_33 } [get_ports { tmds_tmds_clk_p }]; #IO_L11P_T1_SRCC_35 Sch=hdmi_tx_clk_p
set_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
完成约束后进行综合布局布线,等待生成bit流文件。bit文件生成后在FILE处,点击导出硬件资源(包含bit流文件),接着launch SDK。
SDK软件部分
打开SDK后,新建application project。首先导入相关的IP的驱动文件
导入VDMA API驱动
这里打开system.mss,点击axi_vdma这里的导入示例,
这里可以把vdma_api.c进行封装,添加头文件,把要使用的函数进行声明。
#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_ */
因为系统生成的示例的API是同时开启了Vdma的读写通道,这里正点原子对函数进行了简单的修改,声明了一个结构体。这样可以在进行帧缓存的时候仅使用单独的读或者写通道也可以确保函数的正常运行。
在vdma_api.c,的函数Function Prototypes部分,也要修改添加参数。
对于StartTransfer函数的修改:
对于run_vdma_frame_buffer函数的修改:
之前叫run_triple_frame_buffer
导入display_ctrl_hdmi和dynclk驱动
在迪芝伦的提供的IP中有他们已经封装好的驱动代码,这里直接导入我们的SDK工程文件夹即可。
完成驱动导入后,在main.c中键入下面代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "xil_types.h"
#include "xil_cache.h"
#include "xparameters.h"
#include "xaxivdma.h"
#include "xaxivdma_i.h"
#include "display_ctrl_hdmi/display_ctrl.h"
#include "vdma_api/vdma_api.h"
//宏定义
#define BYTES_PIXEL 3 //像素字节数,RGB888占3个字节
#define DYNCLK_BASEADDR XPAR_AXI_DYNCLK_0_BASEADDR //动态时钟基地址
#define VDMA_ID XPAR_AXIVDMA_0_DEVICE_ID //VDMA器件ID
#define DISP_VTC_ID XPAR_VTC_0_DEVICE_ID //VTC器件ID
//函数声明
void colorbar(u8 *frame, u32 width, u32 height, u32 stride);
//全局变量
XAxiVdma vdma;
DisplayCtrl dispCtrl;
VideoMode vd_mode;
//frame buffer的起始地址
unsigned int const frame_buffer_addr = (XPAR_PS7_DDR_0_S_AXI_BASEADDR + 0x1000000);
int main(void)
{xil_printf("HDMI Display 1920*1080 \r\n");//设置video参数,分辨率:1920*1080vd_mode = VMODE_1920x1080;//配置VDMArun_vdma_frame_buffer(&vdma, VDMA_ID, vd_mode.width, vd_mode.height,frame_buffer_addr,0, 0,ONLY_READ);//初始化Display controllerDisplayInitialize(&dispCtrl, DISP_VTC_ID, DYNCLK_BASEADDR);//设置VideoModeDisplaySetMode(&dispCtrl, &vd_mode);DisplayStart(&dispCtrl);//写彩条colorbar((u8*)frame_buffer_addr, vd_mode.width,vd_mode.height, vd_mode.width*BYTES_PIXEL);return 0;
}//写彩条函数(彩虹色)
void colorbar(u8 *frame, u32 width, u32 height, u32 stride)
{u32 color_edge;u32 x_pos, y_pos;u32 y_stride = 0;u8 rgb_r, rgb_b, rgb_g;color_edge = width * BYTES_PIXEL / 7;for (y_pos = 0; y_pos < height; y_pos++) {for (x_pos = 0; x_pos < (width * BYTES_PIXEL); x_pos += BYTES_PIXEL) {if (x_pos < color_edge) { //红色rgb_r = 0xFF;rgb_g = 0;rgb_b = 0;} else if ((x_pos >= color_edge) && (x_pos < color_edge * 2)) { //橙色rgb_r = 0xFF;rgb_g = 0x7F;rgb_b = 0;} else if ((x_pos >= color_edge * 2) && (x_pos < color_edge * 3)) { //黄色rgb_r = 0xFF;rgb_g = 0xFF;rgb_b = 0;} else if ((x_pos >= color_edge * 3) && (x_pos < color_edge * 4)) { //绿色rgb_r = 0;rgb_g = 0xFF;rgb_b = 0;} else if ((x_pos >= color_edge * 4) && (x_pos < color_edge * 5)) { //青色rgb_r = 0;rgb_g = 0xFF;rgb_b = 0xFF;} else if ((x_pos >= color_edge * 5) && (x_pos < color_edge * 6)) { //蓝色rgb_r = 0;rgb_g = 0;rgb_b = 0xFF;} else if ((x_pos >= color_edge * 6) && (x_pos < color_edge * 7)) { //紫色rgb_r = 0x8B;rgb_g = 0;rgb_b = 0xFF;}frame[x_pos + y_stride + 0] = rgb_b;frame[x_pos + y_stride + 1] = rgb_g;frame[x_pos + y_stride + 2] = rgb_r;}y_stride += stride;}Xil_DCacheFlush(); //刷新Cache,数据更新至DDR3中xil_printf("show color bar\r\n");
}
运行效果
Reference
- 正点原子ZYNQ开发视频
ZYNQ-使用HDMI显示器进行VDMA彩条显示测试相关推荐
- ZYNQ-使用HDMI显示器进行SD卡图片读取显示
学习内容 本文使用带有HDMI接口的显示器,构建图像视频显示的测试工程,利用VDMA进行传输图像视频数据,通过文件系统将SD卡中的照片读取出来然后在显示器显示. 开发环境 vivado 18.3&am ...
- 【正点原子FPGA连载】第二十一章 HDMI彩条显示实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0
1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...
- 【正点原子FPGA连载】第二十四章HDMI彩条显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...
- 【正点原子FPGA连载】 第十七章 HDMI彩条显示实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...
- 2021-03-17 RK3288 接PHILIPS 4K显示器HDMI开机概率性不显示的问题
RK3288 接PHILIPS 4K显示器HDMI开机概率性不显示的问题 一.测试发现在philips显示器休眠的情况下,rk3288 开机后hmdi无法唤醒显示器. cat /d/dw-hdmi/ ...
- 【正点原子MP157连载】第十八章 RGB LCD彩条显示实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- 【正点原子FPGA连载】第十五章 RGB LCD彩条显示实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...
- HDMI显示器驱动设计与验证
HDMI显示器驱动设计与验证 HDMI组成 HMDI数据传输图 TMDS信号连接图 HDMI彩条显示实验整体框图
- FPGA—HDMI 显示器驱动设计与验证(附代码)
目录 1.理论 2.实操 2.1 顶层模块 2.2 时钟生成模块 2.3 HDMI 驱动控制模块 2.3.1 编码模块 2.3.2 并行转串行模块 2.4 顶层仿真验证 3.总结 1.理论 HDMI简 ...
最新文章
- 一个隐马尔科夫模型的应用实例:中文分词
- springCloud全家桶
- apache php 执行shell,PHP执行普通shell命令流程解析
- 【设计模式】命令模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
- CentOS搭建FTP
- 递归函数反向显示单链表
- 已经发车的票还能取出来吗_没想到!火车坐过站,还能免费送回来?方法如下...
- 小程序毕设作品之微信小程序点餐系统毕业设计(8)毕业设计论文模板
- 低代码平台- Intellij IDEA 插件开发
- Engineering Dynamics 2 --- 动量和角动量
- 标准情况下绝对湿度与相对湿度excel表
- android 气泡尖角边框,CSS3制作的带阴影效果的尖角气泡框效果
- 孤单终结者:神棍节十大“脱光”应用
- 《精通git》笔记之九(储藏与清理、签署工作、搜索)
- UE4 UE4 C++ Gameplay Abilities的GameplayCue
- Androi事件分发( 二),解决事件冲突
- [剑指offer] -- 46.扑克牌顺子
- matlab 径向偏振光,一种产生椭圆形径向偏振光束的涡旋半波片及系统的制作方法...
- 微信小程序支付签名生成(客户端)
- Google VR 学习小结
热门文章
- Windows 10硬盘数据怎么永久擦除?
- nginx使用Proxy-protocal
- 为什么dubbo需要配置dubbo.protocal.port=20880
- 托福考试可以用临时身份证吗?
- POJ3243 Clever Y 解 高次同余方程
- 上机实验三:构造函数和构析函数
- atoi、atol、strtod、strtol、strtoul、gcvt、ecvt、fcvt、sprintf、toascii、tolower类型转换
- List集合,Set集合
- vue--elementui中修改el-input样式
- 10个你不知道的zbrush建模步骤,将决定你的就业方向