PL端:HDMI 输出实验

实验环境

vivado 2024.1

实验任务

做一个 HDMI 输出的彩条

硬件介绍

开发板没有HDMI编码芯片,是将FPGA的3.3差分IO直接连接到HDMI连接器,FPGA 完成 24 位 RGB 编码输出TMDS 差分信号。
在这里插入图片描述
HDMI传输要素:
在这里插入图片描述

TMDS 差分信号

TMDS(Transition Minimized Differential Signaling)即过渡调制差分信号,也被称为最小化传输差分信号,具有以下特点:
编码方式:
通过异或及异或非等逻辑算法将原始的 8 位信号数据转换成 10 位。前 8 位数据由原始信号经运算后获得,第 9 位指示运算的方式,第 10 位用来实现直流平衡(DC-balanced)。这种编码方式使得被传输信号过渡过程的上冲和下冲减小,能保证信道中直流偏移为零,让电平转化实现不同逻辑接口间的匹配。
传输模式:
差分信号传输:TMDS 采用差分传动技术,利用两个引脚间的电压差来传送信号。传输数据的数值(“0” 或者 “1”)由两脚间电压正负极性和大小决定。即采用 2 根线来传输信号,一根线上传输原来的信号,另一根线上传输与原来信号相反的信号。接收端通过让一根线上的信号减去另一根线上的信号的方式来屏蔽电磁干扰,从而得到正确的信号。这种方式可以减少信号对传输线的电磁干扰,提高信号传输的可靠性。
串行传输:和 LVDS 相似,TMDS 是一个串行的传输设计,这意味着数据是一位一位按顺序传输的,能够在较长的距离上实现高速数据传输。
应用领域:TMDS 技术主要应用于 DVI(Digital Visual Interface)和 HDMI(High Definition Multimedia Interface)等视频接口。在这些接口中,TMDS 链路包括 3 个传输 RGB 信号的数据通道和 1 个传输时钟信号的通道。例如,HDMI 把视频信号分为 R、G、B、H、V 五种信号用 TMDS 技术编码,其中 HV 编码在 B 信号通道里面传输,R、G 的多余位置用来传输音频信号。
总之,TMDS 差分信号技术通过独特的编码和传输方式,实现了高速、可靠的数据传输,在高清视频传输领域得到了广泛应用。

Vivado 工程建立

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加 HDMI 编码器 IP 核

很多人都熟知 VGA 的数据是 RGB 数据,而 HDMI 使用的是 TMDS 差分信号。在 FPGA 中,RGB 数据操作起来相对容易。所以,我们的任务就是将 RGB 数据转换为 HDMI 的 TMDS 差分信号。基于此,我们采用了 RGB to DVI 的 IP,这是因为 DVI 和 HDMI 所使用的都是 TMDS 信号。

复制 repo 文件夹,别的厂家提供的HDMI 编码器的 IP
在这里插入图片描述

点击“IP Catalog”,添加IP
在这里插入图片描述
路径选择刚才复制的 repo 文件夹
在这里插入图片描述
添加 IP 成功提示添加了多少个 IP
在这里插入图片描述
搜索“RGB to DVI Video Encoder(Source)”,双击
在这里插入图片描述
保持默认,点击OK
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

看到一个名为 rgb2dvi_0
在这里插入图片描述

添加像素时钟 PLL 模块

驱动 HDMI 编码器,需要提供像素时钟和 5 倍像素时钟,5 倍像素时钟用于 10:1 串行化

在“IP Catlog”窗口搜索关键字“clock”,双击“Clocking Wizard”
在这里插入图片描述
在“Component Name”中填写“video_clock”,“clk_in1”填写
50,这里 50Mhz 和开发板 PL 端晶振频率一致。
在这里插入图片描述

输出时钟“clk_out1”用于视频像素时钟,这里填写 74.25,这是 1280x720@60 分辨率的像素时钟,每一种分辨率的像素时钟都不同,需要非常了解视频标准才能知道每一种视频分辨率的像素时钟,“clk_out2”用于编码器串行化,像素时钟的 5 倍,这里填写 371.25,然后点击“OK”生成 IP。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加彩条发生模块

彩条发生模块是一段 Verilog 代码,用于产生视频时序和水平方向的 8 个彩条
主要是理解代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/11/06 13:09:03
// Design Name: 
// Module Name: color_bar
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module color_bar(input clk,            //����ʱ�����룬1280x720@60P������ʱ��Ϊ74.25input rst,            //��λ,����Чoutput hs,            //��ͬ��������Чoutput vs,            //��ͬ��������Чoutput de,            //������Чoutput[7:0] rgb_r,    //�������ݡ���ɫ����output[7:0] rgb_g,    //�������ݡ���ɫ����output[7:0] rgb_b     //�������ݡ���ɫ����
);
/*********��Ƶʱ���������******************************************/
parameter H_ACTIVE = 16'd1280;  //����Ч���ȣ�����ʱ�����ڸ�����
parameter H_FP = 16'd110;       //��ͬ��ǰ�糤��
parameter H_SYNC = 16'd40;      //��ͬ������
parameter H_BP = 16'd220;       //��ͬ����糤��
parameter V_ACTIVE = 16'd720;   //����Ч���ȣ��еĸ�����
parameter V_FP 	= 16'd5;        //��ͬ��ǰ�糤��
parameter V_SYNC  = 16'd5;      //��ͬ������
parameter V_BP	= 16'd20;       //��ͬ����糤��//parameter H_ACTIVE = 16'd1920;
//parameter H_FP = 16'd88;
//parameter H_SYNC = 16'd44;
//parameter H_BP = 16'd148; 
//parameter V_ACTIVE = 16'd1080;
//parameter V_FP 	= 16'd4;
//parameter V_SYNC  = 16'd5;
//parameter V_BP	= 16'd36;
parameter H_TOTAL = H_ACTIVE + H_FP + H_SYNC + H_BP;//���ܳ���
parameter V_TOTAL = V_ACTIVE + V_FP + V_SYNC + V_BP;//���ܳ���
/*********����RGB color bar��ɫ��������*****************************/
parameter WHITE_R 		= 8'hff;
parameter WHITE_G 		= 8'hff;
parameter WHITE_B 		= 8'hff;
parameter YELLOW_R 		= 8'hff;
parameter YELLOW_G 		= 8'hff;
parameter YELLOW_B 		= 8'h00;                              	
parameter CYAN_R 		= 8'h00;
parameter CYAN_G 		= 8'hff;
parameter CYAN_B 		= 8'hff;                             	
parameter GREEN_R 		= 8'h00;
parameter GREEN_G 		= 8'hff;
parameter GREEN_B 		= 8'h00;
parameter MAGENTA_R 	= 8'hff;
parameter MAGENTA_G 	= 8'h00;
parameter MAGENTA_B 	= 8'hff;
parameter RED_R 		= 8'hff;
parameter RED_G 		= 8'h00;
parameter RED_B 		= 8'h00;
parameter BLUE_R 		= 8'h00;
parameter BLUE_G 		= 8'h00;
parameter BLUE_B 		= 8'hff;
parameter BLACK_R 		= 8'h00;
parameter BLACK_G 		= 8'h00;
parameter BLACK_B 		= 8'h00;
reg hs_reg;//����һ���Ĵ���,������ͬ��
reg vs_reg;//����һ���Ĵ���,�û���ͬ��
reg hs_reg_d0;//hs_regһ��ʱ�ӵ��ӳ�//������_d0��d1��d2��Ϊ��׺�ľ�Ϊij���Ĵ������ӳ�
reg vs_reg_d0;//vs_regһ��ʱ�ӵ��ӳ�
reg[11:0] h_cnt;//�����еļ�����
reg[11:0] v_cnt;//���ڳ���֡���ļ�����
reg[11:0] active_x;//��Чͼ��ĵ�����x
reg[11:0] active_y;//��Чͼ�������y
reg[7:0] rgb_r_reg;//��������r����
reg[7:0] rgb_g_reg;//��������g����
reg[7:0] rgb_b_reg;//��������b����
reg h_active;//��ͼ����Ч
reg v_active;//��ͼ����Ч
wire video_active;//һ֡��ͼ�����Ч����h_active & v_active
reg video_active_d0;
assign hs = hs_reg_d0;
assign vs = vs_reg_d0;
assign video_active = h_active & v_active;
assign de = video_active_d0;
assign rgb_r = rgb_r_reg;
assign rgb_g = rgb_g_reg;
assign rgb_b = rgb_b_reg;
always@(posedge clk or posedge rst)
beginif(rst)beginhs_reg_d0 <= 1'b0;vs_reg_d0 <= 1'b0;video_active_d0 <= 1'b0;endelsebeginhs_reg_d0 <= hs_reg;vs_reg_d0 <= vs_reg;video_active_d0 <= video_active;end
endalways@(posedge clk or posedge rst)
beginif(rst)h_cnt <= 12'd0;else if(h_cnt == H_TOTAL - 1)//�м����������ֵ����h_cnt <= 12'd0;elseh_cnt <= h_cnt + 12'd1;
endalways@(posedge clk or posedge rst)
beginif(rst)active_x <= 12'd0;else if(h_cnt >= H_FP + H_SYNC + H_BP - 1)//����ͼ���x����active_x <= h_cnt - (H_FP[11:0] + H_SYNC[11:0] + H_BP[11:0] - 12'd1);elseactive_x <= active_x;
endalways@(posedge clk or posedge rst)
beginif(rst)v_cnt <= 12'd0;else if(h_cnt == H_FP  - 1)//������������ΪH_FP - 1��ʱ�򳡼�����+1������if(v_cnt == V_TOTAL - 1)//�������������ֵ�ˣ�����v_cnt <= 12'd0;elsev_cnt <= v_cnt + 12'd1;//û�����ֵ��+1elsev_cnt <= v_cnt;
endalways@(posedge clk or posedge rst)
beginif(rst)hs_reg <= 1'b0;else if(h_cnt == H_FP - 1)//��ͬ����ʼ��...hs_reg <= 1'b1;else if(h_cnt == H_FP + H_SYNC - 1)//��ͬ����ʱ��Ҫ������hs_reg <= 1'b0;elsehs_reg <= hs_reg;
endalways@(posedge clk or posedge rst)
beginif(rst)h_active <= 1'b0;else if(h_cnt == H_FP + H_SYNC + H_BP - 1)h_active <= 1'b1;else if(h_cnt == H_TOTAL - 1)h_active <= 1'b0;elseh_active <= h_active;
endalways@(posedge clk or posedge rst)
beginif(rst)vs_reg <= 1'd0;else if((v_cnt == V_FP - 1) && (h_cnt == H_FP - 1))vs_reg <= 1'b1;else if((v_cnt == V_FP + V_SYNC - 1) && (h_cnt == H_FP - 1))vs_reg <= 1'b0;	elsevs_reg <= vs_reg;
endalways@(posedge clk or posedge rst)
beginif(rst)v_active <= 1'd0;else if((v_cnt == V_FP + V_SYNC + V_BP - 1) && (h_cnt == H_FP - 1))v_active <= 1'b1;else if((v_cnt == V_TOTAL - 1) && (h_cnt == H_FP - 1))v_active <= 1'b0;	elsev_active <= v_active;
endalways@(posedge clk or posedge rst)
beginif(rst)beginrgb_r_reg <= 8'h00;rgb_g_reg <= 8'h00;rgb_b_reg <= 8'h00;endelse if(video_active)if(active_x == 12'd0)beginrgb_r_reg <= WHITE_R;rgb_g_reg <= WHITE_G;rgb_b_reg <= WHITE_B;endelse if(active_x == (H_ACTIVE/8) * 1)beginrgb_r_reg <= YELLOW_R;rgb_g_reg <= YELLOW_G;rgb_b_reg <= YELLOW_B;end			else if(active_x == (H_ACTIVE/8) * 2)beginrgb_r_reg <= CYAN_R;rgb_g_reg <= CYAN_G;rgb_b_reg <= CYAN_B;endelse if(active_x == (H_ACTIVE/8) * 3)beginrgb_r_reg <= GREEN_R;rgb_g_reg <= GREEN_G;rgb_b_reg <= GREEN_B;endelse if(active_x == (H_ACTIVE/8) * 4)beginrgb_r_reg <= MAGENTA_R;rgb_g_reg <= MAGENTA_G;rgb_b_reg <= MAGENTA_B;endelse if(active_x == (H_ACTIVE/8) * 5)beginrgb_r_reg <= RED_R;rgb_g_reg <= RED_G;rgb_b_reg <= RED_B;endelse if(active_x == (H_ACTIVE/8) * 6)beginrgb_r_reg <= BLUE_R;rgb_g_reg <= BLUE_G;rgb_b_reg <= BLUE_B;end	else if(active_x == (H_ACTIVE/8) * 7)beginrgb_r_reg <= BLACK_R;rgb_g_reg <= BLACK_G;rgb_b_reg <= BLACK_B;endelsebeginrgb_r_reg <= rgb_r_reg;rgb_g_reg <= rgb_g_reg;rgb_b_reg <= rgb_b_reg;end			elsebeginrgb_r_reg <= 8'h00;rgb_g_reg <= 8'h00;rgb_b_reg <= 8'h00;end
endendmodule 

添加顶层模块

top 模块例化了彩条发生模块,HDMI 编码模块,和像素时钟生成模块
将hdmi_out_test.srcs\sources_1\new的top文件copy过来,然后点击添加现有资源文件
在这里插入图片描述

添加 XDC 约束文件

点击“Run Synthesis”开始综合
在这里插入图片描述
综合完成以后点击“Cancel”

在这里插入图片描述
点击“Constraints Wizard”
在这里插入图片描述
在弹出的窗口中点击“Next”
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

set_property PACKAGE_PIN U18 [get_ports {sys_clk}]
set_property IOSTANDARD LVCMOS33 [get_ports {sys_clk}]
create_clock -period 20.000 -waveform {0.000 10.000} [get_ports sys_clk]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_clk_n]
set_property PACKAGE_PIN U13 [get_ports TMDS_clk_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_clk_p]
set_property IOSTANDARD TMDS_33 [get_ports {TMDS_data_n[0]}]
set_property PACKAGE_PIN W14 [get_ports {TMDS_data_p[0]}]
set_property IOSTANDARD TMDS_33 [get_ports {TMDS_data_p[0]}]
set_property IOSTANDARD TMDS_33 [get_ports {TMDS_data_n[1]}]
set_property PACKAGE_PIN Y18 [get_ports {TMDS_data_p[1]}]
set_property IOSTANDARD TMDS_33 [get_ports {TMDS_data_p[1]}]
set_property IOSTANDARD TMDS_33 [get_ports {TMDS_data_n[2]}]
set_property PACKAGE_PIN Y16 [get_ports {TMDS_data_p[2]}]
set_property IOSTANDARD TMDS_33 [get_ports {TMDS_data_p[2]}]
set_property PACKAGE_PIN V16 [get_ports hdmi_oen]
set_property IOSTANDARD LVCMOS33 [get_ports hdmi_oen]

下载调试

编译生成 bit 文件
在这里插入图片描述
在这里插入图片描述
需要注意,这里使用1280x720@60Hz
在这里插入图片描述
显示屏显示结果

在这里插入图片描述

总结

1、学会使用第三点IP核,首先是添加,后面的使用和自带IP核操作一致。
2、主要还是在梳理vivado使用流程。

参考

《cource_s1_ALINX_ZYNQ(AX7Z010_AX7Z020)开发平台基础教程V1.04.pdf》

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

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

相关文章

江协科技STM32学习- P35 硬件I2C读写MPU6050

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

39页PDF | 华为数据架构建设交流材料(限免下载)

一、前言 这份报告是关于企业数据架构建设的交流材料&#xff0c;详细介绍了数据架构在企业架构中的重要性&#xff0c;阐述了数据架构的定义、包含的四个核心组件&#xff08;数据资产目录、数据标准、数据模型和数据分布&#xff09;&#xff0c;并通过交通和城市政务服务的…

三周精通FastAPI:27 使用使用SQLModel操作SQL (关系型) 数据库

官网文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/sql-databases/ SQL (关系型) 数据库 FastAPI不需要你使用SQL(关系型)数据库。 但是您可以使用任何您想要的关系型数据库。 这里我们将看到一个使用SQLModel的示例。 SQLModel是在SQLAlchemy和Pydantic的基础…

专业140+总分430+四川大学854信号与系统考研川大原951电子信息与通信工程,真题,大纲,参考书。

川大854(原951)信号与系统140&#xff0c;总分430&#xff0c;顺利上岸&#xff0c;目前已经研究生在读&#xff0c;群里不少同学希望分享一下我的考研经历&#xff0c;回首考研这一年的复习经历&#xff0c;历历在目&#xff0c;好像就在昨天&#xff0c;期间有过迷惑&#xf…

蓝桥杯第21场小白入门赛补题

5.蓝桥派对 思路 &#xff1a;一个区间与多少个其他区间有关联&#xff0c;先对所有区间左端点和右端点从小到大排序&#xff0c;对于每个询问&#xff0c;我们先算出[1,r]这个区间里有多少个区间的起点即区间总数&#xff0c;使用upper_bound函数&#xff0c;然后使用lower_bo…

【再谈设计模式】原型模式~复制的魔法师

一、引言 在软件工程、软件开发中&#xff0c;创建对象的过程常常涉及复杂的初始化和配置。在某些情况下&#xff0c;直接复制现有对象比从头开始创建新对象更为高效。原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;允许我们通过复制现有…

技术分享 —— JMeter接口与性能测试实战!

前言 在软件开发和运维过程中&#xff0c;接口性能测试是一项至关重要的工作。JMeter作为一款开源的Java应用&#xff0c;被广泛用于进行各种性能测试&#xff0c;包括接口性能测试。本文将详细介绍如何使用JMeter进行接口性能测试的过程和步骤。 JMeter是Apache组织开发的基…

Data+AI━━数据安全的警钟:智能化分类分级治理

DataAI━━数据安全的警钟&#xff1a;智能化分类分级治理 前言数据的分类体系数据分级与智能化实践深度案例解析与未来展望 前言 OpenAI数据泄露事件让数据安全再次成为科技圈的热门话题。2024年3月,一名研究员发现OpenAI的API存在安全漏洞,导致部分用户的对话记录泄露。 这一…

【K8S问题系列】Kubernetes Pod节点CrashLoopBackOff 状态【已解决】

在 Kubernetes 中&#xff0c;Pod 的状态为 CrashLoopBackOff 表示某个容器在启动后崩溃&#xff0c;Kubernetes 尝试重启该容器&#xff0c;但由于持续崩溃&#xff0c;重启的间隔时间逐渐增加。下面将详细介绍 CrashLoopBackOff 状态的原因、解决方案及相关命令的输出解释。 …

图像信号处理器(ISP,Image Signal Processor)详解

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 图像信号处理器&#xff08;ISP&#xff0c;Image Signal Processor&#xff09; 是专门用于处理图像信号的硬件或处理单元&#xff0c;广泛应用于图像传感器&#xff08;如 CMOS 或 CCD 传感器&a…

u盘怎么重装电脑系统_u盘重装电脑系统步骤和详细教程【新手宝典】

u盘怎么重装电脑系统&#xff1f;一个u盘怎么重装电脑系统呢&#xff0c;需要将u盘制作成u盘启动盘pe&#xff0c;然后通过U盘启动盘进入pe进行安装系统&#xff0c;下面小编就教大家u盘重装电脑系统步骤和详细教程。 u盘启动是什么意思&#xff1f; U盘启动盘是一种具有特殊功…

SpringBoot健身房管理:技术与实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Sigrity Power SI 3D-EM Inductance Extraction模式如何进行电感的提取操作指导(一)

Sigrity Power SI 3D-EM Inductance Extraction模式如何进行电感的提取操作指导(一) Sigrity Power SI使用3D-EM Inductance Extraction模式可以进行电感的提取,以下图为例 2D 视图 <

Fsm serialdata

现在您有了一个有限状态机&#xff0c;可以识别串行比特流中何时正确接收字节&#xff0c;添加一个数据路径&#xff0c;输出正确接收的数据字节。当done为1时&#xff0c;out_byte必须有效&#xff0c;否则为not。 请注意&#xff0c;串行协议首先发送最低有效位。 此题&#…

【GESP】C++一级真题练习(202309)luogu-B3863,买文具

GESP一级真题练习。为2023年9月一级认证真题。属于数值计算条件判断的问题。 题目题解详见&#xff1a;https://www.coderli.com/gesp-1-luogu-b3863/ 【GESP】C一级真题练习(202309)luogu-B3863&#xff0c;买文具 | OneCoderGESP一级真题练习。为2023年9月一级认证真题。属…

《Python游戏编程入门》注-第5章4

2.3 随机改变颜色 从图1中可以看出,当完全显示了一个大圆之后,会改变颜色继续显示该大圆。也就是当圆心角angle的值大于等于360度时,随机改变颜色,代码如图6所示。 图6 随机改变颜色的代码 其中,第18行代码判断是否完全显示了一个大圆,如果是,圆心角的角度设置为0,第…

健康生活,注重养生

在快节奏的现代生活中&#xff0c;健康养生已成为我们不可忽视的重要课题。它不仅仅关乎身体的强健&#xff0c;更涉及到心灵的平和与愉悦。以下是一些实用的健康养生建议&#xff0c;帮助我们在日常生活中&#xff0c;以自然和谐的方式&#xff0c;滋养身心&#xff0c;享受生…

气膜体育馆:高效便捷的现代运动新选择—轻空间

随着城市发展和人们健康意识的提高&#xff0c;体育场馆的需求日益增加。然而&#xff0c;传统体育馆的建设周期长、成本高和多功能性有限&#xff0c;往往无法满足快速发展的城市需求。那么&#xff0c;为什么选择气膜体育馆作为您的场馆建设方案呢&#xff1f;今天&#xff0…

SSLHandshakeException错误解决方案

1、错误提示 调用Http工具报如下异常信息&#xff1a; cn.hutool.core.io.IORuntimeException: SSLHandshakeException: Received fatal alert: handshake_failure2、查询问题 一开始我以为是代码bug&#xff0c;网络bug甚至是配置环境未生效&#xff0c;找了一大圈&#xf…

第十八周:机器学习

目录 摘要 abstract 一、BERT 1、应用场景 任务一&#xff1a;单句子分类任务 任务二&#xff1a;单句子标注任务 任务三&#xff1a;句子对分类任务 任务四&#xff1a;问答系统 2、pre-train model 3、fine tune微调 input&output how to fine tune 二、…