[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-25 RGB转HDMI显示方案

news2024/9/20 10:41:58

软件版本:VIVADO2021.1

操作系统:WIN10 64bit

硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA

实验平台:米联客-MLK-H3-CZ08-7100开发板

板卡获取平台:https://milianke.tmall.com/

登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

目录

1概述

2系统框图

3顶层调用接口源码

3.1 PLL时钟设置

3.2 VTC参数设置

3.3 HDMI输出IP

4 FPGA工程

5下载演示

5.1硬件连接

5.2运行结果


1概述

本实验通过FPGA内部资源实现HDMI协议,使用HDMI直接驱动HDMI接口显示器,这是成本非常低廉的一种方案,可以实现HDMI输出1080P@60fps的视频图像。本实验需要用到前面课程中的VTC模块产生视频时序,以及TPG模块产生测试图形。关于VTC视频时序参数的设置,读者可以阅读前面VTC相关的课程内容。

2系统框图

3顶层调用接口源码

关于VTC ip 和TPG ip的源码在前文中已经给出,这里我们主要看下顶层调用接口以及PLL部分设置。

/*************HDMI 视频输出测试*************
--版本号1.1
--使用VTC产生视频时序
--使用TPG产生测试图像数据
--使用HDMI输出IP,把RGB数据转为HDMI数据输出
*********************************************************************/
`timescale 1ns / 1ns //仿真时间刻度/精度

module display
(
input  I_sysclk_p,
input  I_sysclk_n,       //系统时钟输入
output O_hdmi_clk_p,     //HDMI输出时钟P端
output O_hdmi_clk_n,     //HDMI输出时钟N端
output [2:0]O_hdmi_tx_p, //HDMI输出数据P端
output [2:0]O_hdmi_tx_n  //HDMI输出数据N端
);


wire I_clk;
IBUFGDS CLK_U(
.I(I_sysclk_p),
.IB(I_sysclk_n),
.O(I_clk)
);

wire vtc_rst,vtc_clk,vtc_vs,vtc_hs,vtc_de;//vid 视频相关信号
wire pclkx1,pclkx5,locked;//HDMI输出需要2个时钟,pclkx1是和内部视频同步的时钟,pclkx5是HDMI IP内部用于产生输出数据和输出时钟
wire [7 :0] rgb_r ,rgb_g ,rgb_b;// 定义寄存器保存图像的颜色数据
assign vtc_clk = pclkx1; // 内部像素时钟
assign vtc_rstn = locked; //用PLL 的LOCK信号复位

//MMCM/PLL时钟管理IP 输出 pclkx1和pclkx5以及locked信号
clk_wiz_0 clk_wiz0_inst(.clk_out1(pclkx1),.clk_out2(pclkx5),.locked(locked),.clk_in1(I_clk)); 

//例化HDMI输出IP,把TPG产生的测试图像经过HDMI输出
uihdmitx #
(
.FAMILY("7FAMILY")  //选择芯片所支持的系列"7FAMILY" "UFAMILY"     
)
uihdmitx_inst
(
.I_rstn(locked),//复位
.I_hs(vtc_hs), //hs信号
.I_vs(vtc_vs), //vs信号
.I_de(vtc_de),//de信号
.I_rgb({rgb_r,rgb_g,rgb_b}), //RGB数据
.I_pclkx1(pclkx1), //像素时钟
.I_pclkx2_5(1'b0), //2.5倍像素时钟,只有UFAMILY需要
.I_pclkx5(pclkx5), //5倍像素时钟
.O_hdmi_tx_clk_p(O_hdmi_clk_p), //HDMI时钟输出P端
.O_hdmi_tx_clk_n(O_hdmi_clk_n), //HDMI时钟输出N端
.O_hdmi_tx_p(O_hdmi_tx_p),      //HDMI输出数据P端
.O_hdmi_tx_n(O_hdmi_tx_n)       //HDMI输出数据N端
);

uivtc#
(
.H_ActiveSize(1280),          //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素
.H_FrameSize(1280+88+44+239), //视频时间参数,行视频信号,一行视频信号总计占用的时钟数
.H_SyncStart(1280+88),        //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号 
.H_SyncEnd(1280+88+44),       //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行有效数据部分
.V_ActiveSize(720),           //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize
.V_FrameSize(720+4+5+28),     //视频时间参数,场视频信号,一帧视频信号总计占用的行数量
.V_SyncStart(720+4),          //视频时间参数,场同步开始,即多少行数后开始产生场同步信号 
.V_SyncEnd (720+4+5)       //视频时间参数,场同步结束,即多少行数后停止产生场同步信号,之后就是场有效数据部分
)
uivtc_inst
(
.I_vtc_clk(vtc_clk),  //系统时钟 
.I_vtc_rstn(vtc_rstn),//系统复位
.O_vtc_vs(vtc_vs),    //场同步输出
.O_vtc_hs(vtc_hs),    //行同步输出
.O_vtc_de_valid(vtc_de),      //视频数据有效
.O_vtc_user(),     //满足stream时序产生 user 信号,用于帧同步
.O_vtc_last()      //满足stream时序产生 later 信号,用于每行结束
);

uitpg uitpg_inst    
(
.I_tpg_clk(vtc_clk),   //系统时钟
.I_tpg_rstn(vtc_rstn), //系统复位
.I_tpg_vs(vtc_vs),     //图像的vs信号
.I_tpg_hs(vtc_hs),     //图像的hs信号 
.I_tpg_de(vtc_de),     //de数据有效信号
.O_tpg_vs(),//和vtc_vs信号一样
.O_tpg_hs(),//和vtc_hs信号一样
.O_tpg_de(),//和vtc_de信号一样       
.O_tpg_data({rgb_r,rgb_g,rgb_b})//测试图像数据输出          
);

endmodule

以上源码中,关键有2个地方需要设置好

3.1 PLL时钟设置

对于PLL的设置需要产生1:5的时钟,对于演示demo中720P的设置如下:

3.2 VTC参数设置

关于VTC参数设置具体阅读前面课程video timing controller相关内容,这里针对75M的PCLK参数如下:

.H_ActiveSize(1280), 
.H_FrameSize(1280+88+44+239), 
.H_SyncStart(1280+88), 
.H_SyncEnd(1280+88+44),
.V_ActiveSize(720),
.V_FrameSize(720+4+5+28), 
.V_SyncStart(720+4),
.V_SyncEnd (720+4+5) 

3.3 HDMI输出IP

为了能够输出测试图像,需要调用HDMI IP,这个IP是开源的。由于本文不计划对HDMI IP进行分析,这里只给出调用方法。

在参数接口中,输入”7FAMILY”代表支持7系列的FPGA,如果输入”UFAMILY”代表支持ultrascale或者ultrascale+的FPGA.

PCLKX1_i代表像素时钟;

PCLKX2_5_i代表2.5倍的像素时钟,这个时钟仅在使用ultrascale或者ultrascale+的FPGA.的时候需要配置;

PCLKX5_i代表5倍的像素时钟;

//例化HDMI输出IP,把TPG产生的测试图像经过HDMI输出
uihdmitx #
(
.FAMILY("7FAMILY")  //选择芯片所支持的系列"7FAMILY" "UFAMILY"     
)
uihdmitx_inst
(
.I_rstn(locked),//复位
.I_hs(vtc_hs), //hs信号
.I_vs(vtc_vs), //vs信号
.I_de(vtc_de),//de信号
.I_rgb({rgb_r,rgb_g,rgb_b}), //RGB数据
.I_pclkx1(pclkx1), //像素时钟
.I_pclkx2_5(1'b0), //2.5倍像素时钟,只有UFAMILY需要
.I_pclkx5(pclkx5), //5倍像素时钟
.O_hdmi_tx_clk_p(O_hdmi_clk_p), //HDMI时钟输出P端
.O_hdmi_tx_clk_n(O_hdmi_clk_n), //HDMI时钟输出N端
.O_hdmi_tx_p(O_hdmi_tx_p),      //HDMI输出数据P端
.O_hdmi_tx_n(O_hdmi_tx_n)       //HDMI输出数据N端
);
dmi_tx_n(O_hdmi_tx_n)       //HDMI输出数据N端
);

4 FPGA工程

fpga工程的创建过程不再重复,如有不清楚的请看前面实验

米联客的代码管理规范,在对应的FPGA工程路径下创建uisrc路径,并且创建以下文件夹

01_rtl:放用户编写的rtl代码

02_sim:仿真文件或者工程

03_ip:放使用到的ip文件

04_pin:放fpga的pin脚约束文件或者时序约束文件

05_boot:放编译好的bit或者bin文件(一般为空)

06_doc:放本一些相关文档(一般为空)

5下载演示

下载程序前,先确保FPGA工程已经编译好。

5.1硬件连接

(该教程为通用型教程,教程中仅展示一款示例开发板的连接方式,具体连接方式以所购买的开发板型号以及结合配套代码管脚约束为准。)

请确保下载器和开发板已经正确连接,另外需要把核心板上的2P模式开关设置到JTAG模式,即ON ON,并且开发板已经上电。(注意JTAG端子不支持热插拔,而USB接口支持,所以在不通电的情况下接通好JTAG后,再插入USB到电脑,之后再上电,以免造成JTAG IO损坏)

5.2运行结果

显示器循环输出测试图形

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2098607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.6 逻辑运算

🎓 微机原理考点专栏(通篇免费) 欢迎来到我的微机原理专栏!我将帮助你在最短时间内掌握微机原理的核心内容,为你的考研或期末考试保驾护航。 为什么选择我的视频? 全程考点讲解:每一节视频都…

招聘系统开发前景分析

招聘系统的前景分析可以从多个维度进行,包括市场需求、技术趋势、竞争格局以及未来发展趋势等方面。 一、市场需求 持续增长的市场规模:随着全球经济的复苏和数字化转型的加速,企业对高效招聘解决方案的需求不断增加。根据市场数据&#xff…

青书学堂 看视频 看课时 php 懒人版

上一篇关于青书学堂的 操作起来 有点麻烦 趁这几天有时间 优化了一下 建议php 7.3 版本 (本程序会用到php里的curl 模块 记得打开) 如果运行时 获取信息空白(https 容易出现) 可以测试一下自己php的curl能不能正常用 如果不能可以参考一下我的另一篇文章 SSL rtificate …

从0开始深度学习(3)——概率

1 基本概率论 大数定律(law of large numbers):随着投掷次数的增加,这个估计值会越来越接近真实的潜在概率。从概率分布中抽取样本的过程称为抽样(sampling)将概率分配给一些离散选择的分布称为多项分布&a…

【大模型实战篇】RoPE旋转位置编码PyTorch代码分析

1. 背景介绍 之前我们通过两篇技术文章《LLaMA3结构关键模块分析》和《RoPE旋转位置编码底层数学原理分析》对旋转位置编码RoPE的原理进行了必要的讲解。接下来,我们将针对来自rotary-embedding-torch【1】开源库的实现,对RoPE的PyTorch代码实现进行分…

前后端分离的security角色权限实现

本案例是使用SpringBoot2.7.6securityMyBatis-plusVue2axios实现 一、security简介 Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,专为Java应用程序设计。 (1)基本功能 身份验证(Authentication&#x…

关于安装MySQL遇到的问题

数据库相关概念 💡数据库系统 ( DataBase System, 简称 DBS) 是指计算机系统引入数据库后的系统构成, 是一个具有管理数据库功能的计算机软硬件综合系统。 数据库系统可以实现有组织地、动态地存储大量数据、提供数…

【补-办公室】拟批语的区别

拟批语 常见拟批语 批示、审示、阅示、核注 审批、审核、审阅、审定(订)、审发、审议、审处、阅改、阅知、阅研、阅处、研提、研办、研复、核(转)报、核示、核批、批办等 阅示和审示 区分是收文还是发文 发文审,收文阅…

本地部署AList并挂载小雅超集结合内网穿透实现无公网IP远程访问

文章目录 前言1. 本地部署AList2. AList挂载网盘3. 部署小雅alist3.1 Token获取3.2 部署小雅3.3 挂载小雅alist到AList中 4. Cpolar内网穿透安装5. 创建公网地址6. 配置固定公网地址 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂&#xff…

jenkins-gitee-genkins

在电脑下载git 用一个有war包的项目 下载插件 添加 .ignore文件 添加target 建git仓库 提交 推送 推送完成在gitee能看到 这时候已经完成了前两部 项目如果添加功能

[嵌入式 C 语言] int main(int argc, char *argv[])

一、含义 在C语言中,main 函数是程序的起点,也就是执行的入口点。main 函数可以接受命令行参数,并且通常定义如下: int main(int argc, char *argv[]) int argc: 这个参数代表“参数计数”(Argument Count&#xff0…

实验记录 | PointMLP | Grouping layer + Geometric Affine

引言 自 PointNet 腾空出世,点云分析的深度框架便成为了该领域的热点,点云学习网络的发展便一发不可收拾。和大部分深度网络一样,点云网络遵循着 “降采样,聚合特征” 的基本思路,逐步提取点云的深度特征。 大部分点…

【九芯电子】星空灯语音识别芯片方案选型——NRK3301

在快节奏的现代生活中,人们对于居家环境的舒适性与便捷性追求日益增强,而星空灯语音控制的技术诞生,正是这一追求下的智慧结晶,极大地提升了居住的愉悦感与科技感。 九芯NRK3301语音识别芯片‌被广泛应用于智能照明产品中&#xf…

【python因果推断库2】使用 PyMC 模型进行差分-in-差分(Difference in Differences, DID)分析

目录 使用 PyMC 模型进行差分-in-差分(Difference in Differences, DID)分析 导入数据 分析 使用 PyMC 模型建模银行业数据集 导入数据 分析 1 - 经典 22 差分-in-差分 (DiD) 分析 2 - 具有多个干预前后观测值的差分-in-差分 (DiD) 分析 使用 PyMC…

VSCode + Git的常规操作(一)【描述详细直白,小白一学就会】

目录 一、文章简介 二、具体操作流程 1、操作前提 2、设置用户名、用户邮箱 (1)打开命令框 (2)配置用户名 (3)配置用户名邮箱 (4)查看配置 3、SSH密钥对的介绍、生成及配置…

008、架构_MDS

​架构 什么是元数据 什么是元数据 元数据又称中介数据、中继数据,为描述数据的数据,主要是描述数据属性的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能;GoldenDB 数据库元数据大致分为两类: 数据字典:库、表、字段属性信息、视图、函数、存储过程属…

【代码随想录训练营第42期 Day48打卡 - 单调栈 - LeetCode 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II

目录 一、做题心得 二、题目与题解 题目一:739. 每日温度 题目链接 题解1:暴力--超时 题解2:单调栈 题目二:496.下一个更大元素 I 题目链接 题解:单调栈哈希 题目三:503.下一个更大元素II 题目链…

神经网络训练不起来怎么办(五)| Batch Normalization

Ⅰ,领域背景 训练困境:当 input feature 在不同 dimension 上差距很大的时候,会产生一个非常崎岖的 error surface(误差平面)。这种崎岖多变的误差平面容易导致训练陷入以下的几个困境。 收敛困难:在崎岖…

注释1111

3。3 Batch Normalization (BN) 的工作原理 Batch Normalization 是在处理一个 "批次" 数据时,计算这个批次内所有样本的平均值和方差,然后使用这些统计量对每个样本进行归一化。这就是说: 批次(batch)&a…

局部整体(五)利用python绘制旭日图

局部整体(五)利用python绘制旭日图 旭日图( Sunburst Charts)简介 由于其形状像太阳光由内向外辐射出来,所以叫SunBurst(太阳爆发),中文也叫日出图。是多个层级的环图/饼图的拓展,可以显示多个…