问答 店铺
热搜: ZYNQ FPGA discuz

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

微信扫一扫 分享朋友圈

已有 139 人浏览分享

开启左侧

[MLKPAI-F01-EG4D]FPGA程序设计基础实验连载-23 RGB转HDMI显示方案

[复制链接]
139 0
安路-FPGA课程
安路课程: 基础入门 » 新手入门实验
安路系列: EG4
本帖最后由 UT发布 于 2025-4-19 09:54 编辑

软件版本:TD_5.6.4_Release_97693
操作系统:WIN11 64bit
硬件平台:适用安路(Anlogic)FPGA
登录米联客”FPGA社区-www.uisrc.com视频课程、答疑解惑!
1概述

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

在完成本实验前,请确保已经完成前面的实验,包括已经掌握以下能力:

1:完成了TD软件安装

2:完成了modelsim安装以及TD库的编译

3:掌握了TD仿真环境的设置

4:掌握了modelsim通过do文件启动仿真

1.1 HDMI简介

HDMI,全称为(High Definition Multimedia Interface)高清多媒体接口,能够同时无压缩的传输视频和音频信号,无需在信号传送前进行数/模或者模/数转换,因此有较高质量的影音信号。HDMI兼容DVI,通过转换接口可以让以其中一种接口标准发送的视频数据直接接入另一种接口标准的LCD显示器上显示。

HDMI接口种类
image.jpg
image.jpg
HDMI版本
image.jpg
image.jpg
1.1.1 HDMI _TypeA接口引脚图

HDMIA,B,C,D,E五种引脚类型,目前市面中比较常见的接口Type A

image.jpg
image.jpg

1-9:TMDS数据传输实际上用到的引脚,分为0,1,2三组差分线分别传输RGB三种信号,为了加强抗干扰能力,每对差分线之间还加入了一根屏蔽线,比如数据2+与数据2-之间加入数据2屏蔽线,123信号线组成1个数据传输通道

10-12:TMDS时钟信号,即像素时钟

13:CECconsumer electronic controlHDMI的扩展功能,一种消费电子兼容的传输协议可以控制视听设备

14:保留引脚,也可以作为CEC引脚

15-16:I2C引脚,用于DDCDisplay Data Channel)传输,进行EDID(相当于一个信息表,会存放显示器的制造商、型号、分辨率等信号)的交互,显示设备和主机可以相互读取。

17:接地引脚

18:5v AC引脚

19:热拔插引脚用于监测HDMI设备有没有存在

1.1.2传输协议

HDMI传输编码格式中要包括视频数据、控制数据和数据包(数据包中包括音频数据和附加信息数据,例如纠错码等)。HDMI传输由4TMDS通道组成,TMDS channel 0传输B信号,H信号和V信号也该通道,TMDS channel 1传输G信号TMDS channel 2传输R信号,RG通道的多余位置用来传输音频信号。TMDS channel clock传输视频信号的pixel频率,即像素时钟。传输的数据经过TMDS进行编码及并串转换,将编码的数据通过高速串行接口传送,接收端对编码后的数据进行解码,还原成原始的输入信号,最终将数据输入到显示器接口上。

image.jpg
TMDS原理:

HDMI采用TMDS (Time Minimized Differential Signal) 最小化传输差分信号传输技术,是美国 Silicon Image 公司开发的一项高速数据传输技术,将视频、音频、控制信号进行编码并串转换后发送。TMDS是一种微分信号机制,采用的是差分传动方式。利用2个引脚间电压差来传送信号,由两脚间电压正负极性和大小决定传送“0”还是“1”。采用2根线来传输信号,一根线上传输原来的信号,另一根线上传输与原来信号相反的信号,接收端就可以通过让一根线上的信号减去另一根线上的信号的方式来屏蔽电磁干扰,从而得到正确的信号。

image.jpg
image.jpg

  TMDS传输通道编码解码示意图

TMDS 模块包含三个相同的编码和发送模块,每个TMDS通道都能传送10bit的数据流。每个发送模块包含 8 位的像素数据,2 个控制信号,一个四位数据信号。

每个数据通道的8bit的数据在source经过TMDS编码(异或、异或非等)后得到10bit数据,前8位数据由原始信号经运算后获得,第9位为编码位,指示运算的方式,第10位为直流平衡,使TMDS发送的"0""1"数量保持基本一致,让传输的数据趋于直流平衡,减少信号对传输线的电磁干扰,提高信号传输的可靠性。10bit数据经过并串转换器serializer后通过TMDS数据通道串行输出,并转串过程所生成的串行数据速率是实际像素时钟速率的 10 倍;在sink端先进行复原成并行的10bit的数据,再通过TMDS 解码得到8bit的源数据。此外,HDMI视频是stream式的传输,不涉及packet式的传输。

1)使用channel0D[1:0]传输HSYNC, VSYNC,占用2bit,控制信号被编码成10位传输,00011011编码后分别是 10'b1101010100,10'b0010101011,10'b0101010100,和 10'b1010101011。

2Preamble控制信息,图中的CTLx,可用来表示后面传输的是data island还是video data。通过channel12D[1:0]传输,占用4bit,控制信号被编码成10位传输。

image.jpg

3Video Data,视频数据,数据格式为RGB888Channel0[7:0]用于传输BChannel1[7:0]用于传输GChannel2[7:0]用于传输R。经过TMDS最小转换编码后成为10位数据,在对应的通道上传输。

4Data Island,数据岛,如音频数据包。数据岛以包数据的格式传输的,由包头和包体构成。包头用于指定包体的类型,包体是具体数据岛周期中的音频信号,通过3channelD[3:0]传输,Channel0[1:0]用于传输HSYNC, VSYNCChannel0[3:2]用于传输Data Island Header(包头数据),Channel1[3:0]Channel2[3:0]用于传输Data Island Content(包内数据),经过TMDS最小转换编码后成为10位数据,在对应的通道上传输。

HDMI传输视频图像的过程中,数据通道上传输的是编码后的有效像素,消隐期内传输的是编码后的控制字符,还可以用于传输音频等数据,本课我们只考虑传输视频的情况。
1.1 硬件电路分析

下图为单向的HDMI输出接口连线示意图,差分数据线和时钟线通过RCLAMP0524P低电容TVS二极管阵列后接到FPGA管脚上,并上拉到3.3VRCLAMP0524低电容TVSTransient Voltage Suppressor)二极管阵列,四路静电保护器件,用于保护高速数据接口,避免电路受到静电放电(ESD)和其他瞬态电压事件的影响CEC引脚依旧没有使用,此处接到3.3V比较复杂的是IICSDA的电平转换电路,由于FPGA的引脚电压一般小于等于3.3V,而HDMI的引脚需要5V的电压来驱动,所以这里通过NMOS管的方式对电平进行转换。SDA是双向通信的信号线,所以无论是FPGA控制外设,还是外设控制FPGA,都可以进行5V3.3V的电平转换。由于这里HDMI作为输出,所以热插拔检测引脚就只作为输入,输入信号经过分压连接到FPGA管脚上来检测HOT PLUG是否连接上

image.jpg
2 程序设计
2.1系统框图
image.jpg
2.2 PLL时钟设置

对于PLL的设置需要产生1:5的时钟,为了实现HDMI1.0协议,需要完成10:1的并串转换。对于 PLL 的设置需要产生1:5的时钟,对于演示demo720P的设置如下:

image.jpg
2.3 hdmi_tx IP使用介绍

IP由安路提供。HDMI(High Definition Multimedia Interface)是一种全数字化影像和声音发送接口,可以发送未压缩的音频及视频信号。HDMI可用于机顶盒、DVD播放机、个人电脑、投影仪与电视等设备,HDMI发送音频和视频信号采用同一条线材,大大简化系统线路的安装难度。

HDMI Transmitter设计支持的功能如下:

·最高支持1080p60显示分辨率。

·支持两路音频输入。

·支持RGB444YUV444

·支持内部视频测试源。

·支持EDID读取。

2.3.1 hdmi_tx IP系统框图
image.jpg

HDMI Transmitter设计包含以下三部分:

HDMI_TX_controllerHDMI的协议层,用于将音频数据、视频数据以及配置数据打包编码,输出TMDS编码数据。

HDMI_TX_PHYHDMI的物理层,用于将协议层传输的TMDS编码数据转换为串行数据并发送出去。

EDID_Receiver:读取HDMI接收端的EDID数据。

2.3.2 HDMI IP时钟架构

HDMI Transmitter工作需要两个时钟,像素时钟pixel_clk和串行发送时钟serial_clk。两个时钟都是通过PLL生成,其中serial_clk的频率是pixel_clk频率的五倍。

image.jpg
2.3.3 HDMI IP视频接口时序

视频接口时序图如图2-9所示。

image.jpg

    图 2-9 视频接口时序

I_video_in_user信号是帧起始信号,为一个单时钟周期信号,在第一行第一个有效数据拉高。I_video_in_valid是数据有效信号,I_video_in_last是行结束信号,在一行数据的结尾拉高。O_video_in_ready是接收端准备信号,为高表示可以写入数据,在I_video_in_last为高之后会拉低。

3 顶层调用接口源码

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

  1. module display(
  2. input  I_sysclk,//系统时钟输入
  3. output O_HDMI_CLK_P,//HDMI输出时钟P端
  4. output O_HDMI_CLK_N,//HDMI输出时钟N端
  5. output [2:0]O_HDMI_TX_P,//HDMI输出数据P端
  6. output [2:0]O_HDMI_TX_N //HDMI输出数据N端
  7. );
  8. wire clk_25m;
  9. wire vid_rst,vid_clk,vid_vs,vid_hs,vid_de;//vtc vid 相关信号
  10. wire pclkx1,pclkx5,locked;//HDMI输出需要2个时钟,pclkx1是和内部视频同步的时钟,pclkx5是HDMI IP内部用于产生输出数据和输出时钟
  11. wire [7 :0]        rgb_r ,rgb_g ,rgb_b;//定义寄存器保存图像的颜色数据
  12. assign vid_clk = pclkx1;//内部像素时钟
  13. assign vid_rst = locked;//用PLL的LOCK信号复位
  14. reg        [7:0]        rst_cnt=0;        
  15. always @(posedge I_sysclk)
  16. begin
  17.         if (rst_cnt[7])
  18.                 rst_cnt <=  rst_cnt;
  19.         else
  20.                 rst_cnt <= rst_cnt+1'b1;
  21. end
  22. //PLL时钟管理IP 输出 pclkx1和pclkx5以及locked信号
  23. clk_hdmi_pll clk_hdmi_pll_inst(
  24. .refclk(I_sysclk),//系统时钟输入
  25. .reset(!rst_cnt[7]),
  26. .extlock(locked),//PLL LOCKED
  27. .clk0_out(clk_25m),
  28. .clk1_out(pclkx1),//像素时钟
  29. .clk2_out(pclkx5) //HDMI IO的serdes 时钟 5倍的像素时钟
  30. );
  31. //hdmi 输出IP
  32. uihdmitx #
  33. (
  34. .FAMILY("EG4")                        
  35. )
  36. uihdmitx_inst
  37. (
  38. .RSTn_i(locked),//异步复位信号,高电平有效
  39. .HS_i(vid_hs),//RGB输入hs行同步
  40. .VS_i(vid_vs),//RGB输入vs场同步
  41. .DE_i(vid_de),//RGB输入de有效
  42. .RGB_i({rgb_r,rgb_g,rgb_b}), //视频输入数据
  43. .PCLKX1_i(pclkx1),//像素时钟
  44. .PCLKX5_i(pclkx5),//串行发送时钟
  45. .HDMI_CLK_P(O_HDMI_CLK_P),//HDMI时钟通道
  46. //.HDMI_CLK_N(O_HDMI_CLK_N),
  47. .HDMI_TX_P(O_HDMI_TX_P)//HDMI数据通道
  48. //.HDMI_TX_N(O_HDMI_TX_N)
  49. );
  50. uivtc#
  51. (
  52. .H_ActiveSize(1280),          //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素
  53. .H_SyncStart(1280+88),        //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号
  54. .H_SyncEnd(1280+88+44),       //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行有效数据部分
  55. .H_FrameSize(1280+88+44+239), //视频时间参数,行视频信号,一行视频信号总计占用的时钟数
  56. .V_ActiveSize(720),          //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize
  57. .V_SyncStart(720+4),         //视频时间参数,场同步开始,即多少行数后开始产生场同步信号
  58. .V_SyncEnd (720+4+5),        //视频时间参数,场同步结束,多少行后停止产生长同步信号
  59. .V_FrameSize(720+4+5+28)     //视频时间参数,场视频信号,一帧视频信号总计占用的行数量   
  60. )
  61. uivtc_inst
  62. (
  63. .I_vtc_rstn(vid_rst),
  64. .I_vtc_clk(vid_clk),
  65. .O_vtc_vs(vid_vs),//场同步输出
  66. .O_vtc_hs(vid_hs),//行同步输出
  67. .O_vtc_de(vid_de)//视频数据有效
  68. );
  69. uitpg uitpg_inst        
  70. (
  71. .I_tpg_clk(vid_clk), //系统时钟
  72. .I_tpg_vs(vid_vs),//图像的vs信号
  73. .I_tpg_hs(vid_hs),//图像的hs信号
  74. .I_tpg_de(vid_de),//de数据有效信号
  75. .O_tpg_vs(),//和vtc_vs信号一样
  76. .O_tpg_hs(),//和vtc_hs信号一样
  77. .O_tpg_de(),//和vtc_de信号一样
  78. .O_tpg_data({rgb_r,rgb_g,rgb_b})//测试图像数据输出
  79. );
  80. endmodule
复制代码
4 FPGA工程

fpga工程的创建过程不再重复

image.jpg

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

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

02_sim:仿真文件或者工程

03_ip:放使用到的ip文件

04_pin:fpgapin脚约束文件或者时序约束文件

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

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

image.jpg
5下载演示

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

5.1硬件连接

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

请确保下载器和开发板已经正确连接,并且开发板已经上电(注意JTAG端子不支持热插拔,而USB接口支持,所以在不通电的情况下接通好JTAG后,再插入USB到电脑,之后再上电,以免造成JTAG IO损坏)


image.jpg
5.2运行结果

显示器循环输出测试图形

image.jpg



































您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

293

主题
精彩推荐
热门资讯
网友晒图
图文推荐

  • 微信公众平台

  • 扫描访问手机版