协议

您所在的位置:网站首页 hdmi线传输速度 协议

协议

2023-04-06 02:19| 来源: 网络整理| 查看: 265

  之前的博客详细介绍了 VGA 的原理和基本使用,这次换成 HDMI,增加一个技能点。

一、HDMI 基本介绍

  HDMI 是新一代的多媒体接口标准,英文全称是 High-Definition Multimedia Interface,即高清多媒体接口。它能够同时传输视频和音频,简化了设备的接口和连线;同时提供了更高的数据传输带宽,可以传输无压缩的数字音频及高分辨率视频信号。HDMI 1.0 版本于 2002 年发布,最高数据传输速度为 5Gbps;而2017 年发布的 HDMI 2.1 标准的理论带宽可达 48Gbps。

  HDMI 向下兼容 DVI,但是 DVI(数字视频接口)只能用来传输视频,而不能同时传输音频,这是两者最主要的差别。此外,DVI 接口的尺寸明显大于 HDMI 接口,如下图所示:

   HDMI 的引脚定义如下:

  TMDS(Transition Minimized Differential Signaling,最小化传输差分信号)是美国 Silicon Image 公司开发的一项高速数据传输技术,在 DVI 和 HDMI 视频接口中使用差分信号传输高速串行数据。

  TMDS 差分传输技术使用两个引脚(如图中的“数据 2+”和“数据 2-”)来传输一路信号,利用这两个引脚间的电压差的正负极性和大小来决定传输数据的数值(0 或 1)。TMDS 传输系统分为两个部分:发送端和接收端。 TMDS 链路包括 3 个传输 RGB 信号的数据通道和 1 个传输时钟信号的通道。TMDS 发送端对这些数据进行编码和并/串转换,再将数据分别分配到独立的传输通道发送出去。接收端接收来自发送端的串行信号,对其进行解码和串/并转换,然后发送到显示器的控制端。与此同时也接收时钟信号,以实现同步。每一个数据通道都通过编码算法,将 8 位数据转换成最小化传输、直流平衡的 10 位数据。这使得数据的传输和恢复更加可靠。最小化传输差分信号是通过异或及异或非等逻辑算法将原始 8 位信号数据转换成 10 位,前 8 为数据由原始信号经运算后获得,第 9 位指示运算的方式,第 10 位用来对应直流平衡。如下图所示:

  一般来说,HDMI 传输的编码格式中要包含视频数据、控制数据和数据包(数据包中包吨音频数据和附加信息数据,例如纠错码等)。 TMDS 每个通道在传输时要包含一个 2bit 的控制数据、 8bit 的视频数据或者 4bit 的数据包即可。在 HDMI 信息传输过程中,可以分为三个阶段:视频数据传输周期、控制数据传输周期和数据岛传输周期,分别对应上述的三种数据类型。

1、传输最小化

   8 位数据经过编码和直流平衡得到 10 位最小化数据,这仿佛增加了冗余位,对传输链路的带宽要求更高,但事实上,通过这种算法得到的 10 位数据在更长的同轴电缆中传输的可靠性增强了。下图是一个例子,说明对一个 8 位的并行 RED 数据编码、并/串转换。

(1)将 8 位并行 RED 数据发送到 TMDS 収送端。(2)并/串转换。(3)进行最小化传输处理,加上第 9 位,即编码过程。第 9 位数据称为编码位。

2、直流平衡

  直流平衡(DC-balanced)就是指在编码过程中保证信道中直流偏移为零。方法是在原来的 9 位数据癿后面加上第 10 位数据,返样,传输的数据趋于直流平衡,使信号对传输线的电磁干扰减少,提高信号传输的可靠性。

3. 差分信号

  TMDS 差分传动技术是一种利用2个引脚间电压差来传送信号的技术。传输数据的数值(“0”或者“1”)由两脚间电压正负极性和大小决定。即,采用 2 根线来传输信号,一根线上传输原来的信号,另一根线上传输与原来信号相反的信号。这样接收端就可以通过让一根线上的信号减去另一根线上的信号的方式来屏蔽电磁干扰,从而得到正确的信号。

  另外,还有一个显示数据通道(DDC),是用于读取表示接收端显示器的清晰度等显示能力的扩展显示标识数据(EDID)的信号线。搭载 HDCP(High-bandwidth Digital Content Protection,高带宽数字内容保护技术)的发送、接收设备之间也利用 DDC 线进行密码键的认证。

 

二、DVI 和 HDMI

 

  上图是 TMDS 发送端和接收端的连接示意图。DVI 或 HDMI 视频传输所使用的 TMDS 连接通过四个串行通道实现。对于DVI来说,其中三个通道分别用于传输视频中每个像素点的红、绿、蓝三个颜色分量(RGB4:4:4格式)。HDMI 默认也是使用三个 RGB 通道,但是它同样可以选择传输像素点的亮度和色度信息(YCrCb4:4:4或YCrCb 4:2:2格式)。第四个通道是时钟通道,用于传输像素时钟。独立的 TMDS 时钟通道为接收端提供接收的参考频率,保证数据在接收端能够正确恢复。 

  在传输视频图像的过程中,数据通道上传输的是编码后的有效像素字符。而在每一帧图像的行与行之间,以及视频中不同帧之间的时间间隔(消隐期)内,数据通道上传输的则是控制字符。每个通道上有两位控制信号的输入接口,共对应四种不同的控制字符。这些控制字符提供了视频的行同步(HZYNC)以及帧同步(VSYNC)信息,也可以用来指定所传输数据的边界(用于同步)。对于 DVI 传输,整个视频的消隐期都用来传输控制字符。而 HDMI 传输的消隐期除了控制字符之外,还可以用于传输音频或者其他附加数据(例如字母信息),4-bit 音频和附加数据将通过 TERC4 编码机制转换成 10-bit TERC4 字符,然后再绿色和红色通道上传输。从上图也可以看出这一差别,即“Auxiliary Data”接口标有“HDMI Olny”,即它是 HDMI 所独有的接口。如果我们不需要附加数据,只传输视频数据的话,完全可以把 HDMI 接口当做 DVI 接口进行驱动。关于其他区别,可以查看这个表:

  下图是 DVI 编码器示意图:

  每个通道输入的视频像素数据都要使用 DVI 规范中的 TMDS 编码算法进行编码。每个 8-bit 的数据都将被转换成 460 个特定 10-bit 字符中的一个。这个编码机制大致上实现了传输过程中的直流平衡,即一段时间内传输的高电平(数字“1”)的个数大致等于低电平(数字“0”)的个数。同时,每个编码后的 10-bit 字符中状态跳转(“由 1 到 0”或者“由 0 到 1”)的次数将被限制在五次以内。除了视频数据之外,每个通道 2-bit 控制信号的状态也要进行编码,编码后分别对应四个不同的 10-bit 控制字符,分别是 10'b1101010100,10'b0010101011,10'b0101010100,和 10'b1010101011。可以看出,每个控制字符都有七次以上的状态跳转。视频字符和控制字符状态跳转次数的不同将会被用于发送和接收设备的同步。 

  再重复一遍,HDMI 在输入附加数据的同时,还需要输入 ADE(Aux/Audio Data Enable)信号,其作用和 VDE 是类似的:当 ADE 为高电平时,表明输入端的附加数据或者音频数据有效,DIV 是不能传音频的。想了解更多有关 HDMI的细节,可以参考HDMI 接口规范——《High-Definition Multimedia Interface Specification Version 1.3a》,英语不好的也可以查看文档《HDMI1.4规范中文版》。

 

三、HDMI 电路原理

  这里直接引用正点原子领航者 ZYNQ 底板的 HDMI 接口原理图来说明:

 

 

  HDMI 的三个数据通道 HDMI_D[2:0] 只和一个时钟通道 HDMI_CLK 直接与 TMDS 差分引脚相连。 HDMI_CEC 指的是用户电气控制(Consumer Electronics Control),它用于 HDMI 连接线上的设备之间进行信息交换。当一个设备的状态发生变化时,CEC 可以使用远程控制或自动改变设置来命令连接的关联设备的状态发生相应的变化。例如,如果用户放置一张碟片到蓝光播放器并开始播放,那么高清电视机将会自动打开电源,设置正确的视频输入格式和打开环绕声设备等等,这种关联通信提供了一个更好的客户体验。 HDMI_HPD 指的是热拔插检测(Hot Plug Detect),当视频设备与接收设备通过 HDMI 连接时,接收设备将 HPD 置为高电平,通知发送设备。当发送设备检测到 HPD 为低电平时,表明断开连接。 HDMI_OUT_EN 信号,用于设置 HDMI 接口的输入输出模式,当其为高电平时作为输出端,此时由 FPGA 底板输出 HDMI 接口的 5V 电源。同时,HDMI_HPD 将作为输入信号使用。反之,当 HDMI_OUT_EN 为低电平时,HDMI_HPD 将输出高电平,用于指示 HDMI 连接状态。 HDMI_SCL 和 HDMI_SDA信号, 是 HDMI 接口的显示数据通道(DDC,Display Data Channel),用于 HDMI 发送端和接收端之间交换一些配置信息,通过 I2C 协议通信。发送端通过 DDC 通道,读取接收端保存在 EEPROM 中的 EDID 数据,获取接收端的信息,确认接收端终端显示的设置和功能,决定跟接收端之间以什么格式传输音/视频数据。    本次实验只使用到了 TMDS 数据、TMDS 时钟以及 HDMI 输出使能等信号,相关的管脚约束如下所示:  set_property IOSTANDARD TMDS_33 [get_ports HDMI_clk_p] set_property IOSTANDARD TMDS_33 [get_ports HDMI_clk_n] set_property IOSTANDARD TMDS_33 [get_ports HDMI_d0_p] set_property IOSTANDARD TMDS_33 [get_ports HDMI_d0_n] set_property IOSTANDARD TMDS_33 [get_ports HDMI_d1_p] set_property IOSTANDARD TMDS_33 [get_ports HDMI_d1_n] set_property IOSTANDARD TMDS_33 [get_ports HDMI_d2_p] set_property IOSTANDARD TMDS_33 [get_ports HDMI_d2_n] set_property PACKAGE_PIN C18 [get_ports HDMI_clk_p] set_property PACKAGE_PIN D20 [get_ports HDMI_d0_p] set_property PACKAGE_PIN C22 [get_ports HDMI_d1_p] set_property PACKAGE_PIN B21 [get_ports HDMI_d2_p]   需要注意的是,TMDS 数据和时钟信号需要在约束文件中指定电平标准为 TMDS_33。另外,对于差分信号我们只需要指定正极的引脚位置,工具会自动对负极进行管脚分配。

 

四、HDMI 程序设计

  TMDS 连接从逻辑功能上可以划分成两个阶段:编码和并串转换。在编码阶段,编码器将视频源中的像素数据、HDMI 的音频/附加数据、行同步和场同步信号分别编码成 10 位的字符流,然后在并串转换阶段将上述的字符流转换成串行数据流,并将其从三个差分输出通道发送出去。示意图如下所示:

   将其放大,可以得到下面这个框图:

  Encoder 模块负责对数据进行编码,Serializer 模块对编码后的数据进行并串转换,最后通过 OBUFDS 转化成 TMDS 差分信号传输。 图中左下脚 HDMI 的音频/附加数据输入在本次实验中并未用到,因此以虚线表示。 

 

1、encoder:8B/10B

  8B10B 编码是可以从 Xilinx 官网下载到此模块,模块名为 encode,此模块把 8 比特的数据进行从新映射为 10bit 数据,防止连续的 0 和 1 出现导致直流不平衡造成误码率升高。

1 `timescale 1 ps / 1ps 2 3 module encode ( 4 input clkin, // pixel clock input 5 input rstin, // async. reset input (active high) 6 input [7:0] din, // data inputs: expect registered 7 input c0, // c0 input 8 input c1, // c1 input 9 input de, // de input 10 output reg [9:0] dout // data outputs 11 ); 12 13 //////////////////////////////////////////////////////////// 14 // Counting number of 1s and 0s for each incoming pixel 15 // component. Pipe line the result. 16 // Register Data Input so it matches the pipe lined adder 17 // output 18 //////////////////////////////////////////////////////////// 19 reg [3:0] n1d; //number of 1s in din 20 reg [7:0] din_q; 21 22 always @ (posedge clkin) begin 23 n1d 4'h4) | ((n1d == 4'h4) & (din_q[0] == 1'b0)); 35 /* 36 reg [8:0] q_m; 37 always @ (posedge clkin) begin 38 q_m[0] 0) and (N1q_m > N0q_m)] or [(cnt < 0) and (N0q_m > N1q_m)] 81 ///////////////////////////////////////////////////////////////////////// 82 assign decision3 = (~cnt[4] & (n1q_m > n0q_m)) | (cnt[4] & (n0q_m > n1q_m)); 83 84 //////////////////////////////////// 85 // pipe line alignment 86 //////////////////////////////////// 87 reg de_q, de_reg; 88 reg c0_q, c1_q; 89 reg c0_reg, c1_reg; 90 reg [8:0] q_m_reg; 91 92 always @ (posedge clkin) begin 93 de_q ========================================== 10 ( 11 input wire HDMI_clk1x , 12 input wire HDMI_clk5x , 13 input wire HDMI_rst , 14 //VGA ----------------------------------------------- 15 input wire VGA_de , 16 input wire VGA_vsync , 17 input wire VGA_hsync , 18 input wire [7:0] VGA_r , 19 input wire [7:0] VGA_g , 20 input wire [7:0] VGA_b , 21 //HDMI ---------------------------------------------- 22 output wire HDMI_clk_p , 23 output wire HDMI_clk_n , 24 output wire HDMI_chn0_p , 25 output wire HDMI_chn0_n , 26 output wire HDMI_chn1_p , 27 output wire HDMI_chn1_n , 28 output wire HDMI_chn2_p , 29 output wire HDMI_chn2_n 30 ); 31 //========================< 信号 >========================================== 32 wire [9:0] dout_r ; //红 33 wire [9:0] dout_g ; //绿 34 wire [9:0] dout_b ; //蓝 35 //========================================================================== 36 //== encode 例化,RGB三个通道进行8B转10B转换 37 //========================================================================== 38 encode u_encode_red 39 ( 40 .clkin (HDMI_clk1x ), 41 .rstin (HDMI_rst ), 42 .din (VGA_r ), 43 .c0 (1'b0 ), 44 .c1 (1'b0 ), 45 .de (VGA_de ), 46 .dout (dout_r ) 47 ); 48 49 encode u_encode_green 50 ( 51 .clkin (HDMI_clk1x ), 52 .rstin (HDMI_rst ), 53 .din (VGA_g ), 54 .c0 (1'b0 ), 55 .c1 (1'b0 ), 56 .de (VGA_de ), 57 .dout (dout_g ) 58 ); 59 60 encode u_encode_blue 61 ( 62 .clkin (HDMI_clk1x ), 63 .rstin (HDMI_rst ), 64 .din (VGA_b ), 65 .c0 (VGA_hsync ), 66 .c1 (VGA_vsync ), 67 .de (VGA_de ), 68 .dout (dout_b ) 69 ); 70 //========================================================================== 71 //== 并转串模块例化:时钟,给固定值 72 //========================================================================== 73 Serializer10_1 u_Serializer_clk 74 ( 75 .divclk (HDMI_clk1x ), 76 .serclk (HDMI_clk5x ), 77 .rst (HDMI_rst ), 78 .din (10'b11111_00000 ), //固定值 79 .do_p (HDMI_clk_p ), 80 .do_n (HDMI_clk_n ) 81 ); 82 //========================================================================== 83 //== 并转串模块例化:数据 84 //========================================================================== 85 Serializer10_1 u_Serializer_red 86 ( 87 .divclk (HDMI_clk1x ), 88 .serclk (HDMI_clk5x ), 89 .rst (HDMI_rst ), 90 .din (dout_r ), 91 .do_p (HDMI_chn2_p ), 92 .do_n (HDMI_chn2_n ) 93 ); 94 95 Serializer10_1 u_Serializer_green 96 ( 97 .divclk (HDMI_clk1x ), 98 .serclk (HDMI_clk5x ), 99 .rst (HDMI_rst ), 100 .din (dout_g ), 101 .do_p (HDMI_chn1_p ), 102 .do_n (HDMI_chn1_n ) 103 ); 104 105 Serializer10_1 u_Serializer_blue 106 ( 107 .divclk (HDMI_clk1x ), 108 .serclk (HDMI_clk5x ), 109 .rst (HDMI_rst ), 110 .din (dout_b ), 111 .do_p (HDMI_chn0_p ), 112 .do_n (HDMI_chn0_n ) 113 ); 114 115 116 endmodule

 

5、HDMI_top:模块完整封装

  可以看出 HDMI 模块还是比较复杂的,因此我们添加 VGA 时序模块,和 HDMI_trans 模块一起封装成 HDMI_top 模块,以后可以直接把这个模块拿来用。HDMI_top 的框图如下所示:

   HDMI_top 模块代码如下所示:

1 `timescale 1ns / 1ps 2 //************************************************************************** 3 // *** 名称 : HDMI_top.v 4 // *** 作者 : xianyu_FPGA 5 // *** 博客 : https://www.cnblogs.com/xianyufpga/ 6 // *** 日期 : 2019-08-10 7 // *** 描述 : HDMI顶层文件 8 //************************************************************************** 9 module HDMI_top 10 //========================< 端口 >========================================== 11 ( 12 //system -------------------------------------------- 13 input wire HDMI_clk1x , 14 input wire HDMI_clk5x , 15 input wire rst , 16 //HDMI in ------------------------------------------- 17 output wire HDMI_req , 18 input wire [15:0] HDMI_data , 19 //HDMI out ------------------------------------------ 20 output wire HDMI_clk_p , 21 output wire HDMI_clk_n , 22 output wire HDMI_d0_p , 23 output wire HDMI_d0_n , 24 output wire HDMI_d1_p , 25 output wire HDMI_d1_n , 26 output wire HDMI_d2_p , 27 output wire HDMI_d2_n 28 ); 29 //========================< 连线 >========================================== 30 wire VGA_req ; 31 wire [15:0] VGA_data ; 32 wire VGA_de ; 33 wire VGA_vsync ; 34 wire VGA_hsync ; 35 wire [ 7:0] VGA_r ; 36 wire [ 7:0] VGA_g ; 37 wire [ 7:0] VGA_b ; 38 //========================================================================== 39 //== VGA控制器 40 //========================================================================== 41 VGA_driver u_VGA_driver 42 ( 43 .clk (HDMI_clk1x ), 44 .rst (rst ), 45 .VGA_data (HDMI_data ), 46 .VGA_req (HDMI_req ), 47 .VGA_de (VGA_de ), 48 .VGA_vsync (VGA_vsync ), 49 .VGA_hsync (VGA_hsync ), 50 .VGA_r (VGA_r ), 51 .VGA_g (VGA_g ), 52 .VGA_b (VGA_b ) 53 ); 54 //========================================================================== 55 //== HDMI转换 56 //========================================================================== 57 HDMI_trans u_HDMI_trans 58 ( 59 .HDMI_clk1x (HDMI_clk1x ), 60 .HDMI_clk5x (HDMI_clk5x ), 61 .HDMI_rst (rst ), 62 //----------------------------------------------- 63 .VGA_de (VGA_de ), 64 .VGA_vsync (VGA_vsync ), 65 .VGA_hsync (VGA_hsync ), 66 .VGA_r (VGA_r ), 67 .VGA_g (VGA_g ), 68 .VGA_b (VGA_b ), 69 //----------------------------------------------- 70 .HDMI_clk_p (HDMI_clk_p ), 71 .HDMI_clk_n (HDMI_clk_n ), 72 .HDMI_chn0_p (HDMI_d0_p ), 73 .HDMI_chn0_n (HDMI_d0_n ), 74 .HDMI_chn1_p (HDMI_d1_p ), 75 .HDMI_chn1_n (HDMI_d1_n ), 76 .HDMI_chn2_p (HDMI_d2_p ), 77 .HDMI_chn2_n (HDMI_d2_n ) 78 ); 79 80 81 endmodule

 

五、上板现象

  将 HDMI_top 模块和 DDR3 控制模块一起建立工程,编译下载,那么 HDMI 接口的屏幕会显示乱序的彩条,表明此次实验设计成功。

 

参考资料:

[1]威三学院FPGA教程

[2]正点原子FPGA开发指南

[3]https://www.cnblogs.com/ninghechuan/p/8353827.html



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3