目录

1、简介

1.1、物理接插件

1.1.1、Type A Connector

1.1.2、Type B Connector

1.1.3、Type C Connector

1.1.4、Type D Connector

1.2、管脚信号定义

2、基本结构

3、链路层分析

3.1、链路层结构

3.2、几个传输阶段定义

3.3、传输内容

3.3.1、Control Period

3.3.2、Video Data Period

3.3.3、Data Island Period

3.4、数据编码

3.4.1、Control Period 数据编码

3.4.2、Data Island Period 数据编码

3.4.3、Video Data Period 数据编码

4、视频传输

4.1、时钟

4.2、像素编码

4.3、颜色深度

4.4、视频格式

5、其他


 

手上的 Zynq 7020 单板带 HDMI 接口,Zynq 的 PS 并没有支持 HDMI IP 外设,所以再单板上的 HDMI 接口是直接接到了 PL 的引脚上,如果要用到 HDMI 来做为显示的话,那么就要在 PL 端去做一个 HDMI 协议层出来,既然要搞,那么需要先研究一下 HDMI 的协议;

总所周知,HDMI 是用来传输音频和视频的,在他之前,还有 DVI 接口,VGA 接口;

HDMI 协议现在最新的 Specification 版本是 2.1,可以支持 8K@60Hz 和 4K@120Hz, 动态 HDR;用的比较多的版本是 HDMI Specification 1.4,可以支持 4K 分辨率以及 1080p@120Hz;

这里,仅仅为了能够正常将视频信息进行输出显示到对端设备,所以选个简单的 HDMI Specification 1.4 入手分析,并暂时只看了 Video 部分的内容,以后有机会再去看 2.1 的协议;

HDMI 的官方协议下载:

https://hdmi.org/spec/index

本文将从几个点入手,对 HDMI 1.4 进行简单的分析和学习:

1、简介

首先需要说明的是,在 HDMI 传输协议中规定了数据的发送端,叫做源端(Source),接收数据端叫做接收端(Sink),一个设备可以有一路或者多路输出,同样,一个接收设备可以有多个输入;比如,咱们的电视机,现在一般都会有多个 HDMI 输入;

HDMI 协议传输的,都是数字信号,非模拟信号;

1.1、物理接插件

HDMI 的物理接插件也就是人们熟知的电视机 HDMI 那根线的两端接口;其实 HDMI 协议中规定了很多种接插件,他们分别为 Type A(最常见的)、Type B、Type C、Type D、Type E;

1.1.1、Type A Connector

Type A 类的接插件是我们 99% 的时候用到的,一共有 19 个物理管脚,就是和电视机相接触的那种:

1.1.2、Type B Connector

这种类型网上查到说是:

This type of HDMI connector was also launched with the original standard in 2002 and it is aimed at carrying dual link DVD-I video. The connector has never been used in products because with the introduction of HDMI 1.3, the speed of a single link exceeded that of the old dual link. As the connector is larger than the single link standard style, there has been no reason for its use. However it is still retained within the specifications

这种接口从未在实际产品中用到;所以,不管他;

1.1.3、Type C Connector

Type C 类型的 HDMI 接口,也叫 Mini-HDMI Connector :

This is the mini-HDMI connector and is smaller than the Type A connector, measuring 10.42 mm × 2.42 mm but still retaining the 19-pin configuration. The mini-HDMI retains all the functionality of the larger HDMI Type A, but the connector is much smaller

这种类型的接口比 Type A 更小,但是也是 19 引脚

HDMI Type C connector 可以和 Type A Connector 连接,但是需要一个 Type A 转 Type C 的适配器;

这种 Mini-HDMI 接插件在小型设备中使用广泛,比如相机这种

1.1.4、Type D Connector

Type D 的接插件也叫 micro-HDMI connector,它更小巧:

The measurements are just 6.4 mm × 2.8 mm and within this outline the micro-HDMI retains the 19 pins of the other connectors, although the pin assignments are different. The micro-HDMI connector was introduced with HDMI Version 1.4. It was developed specifically for audio-video connectivity in small and portable devices like mobile phones

他也是 19 管脚,在 HDMI 1.4 中引入,为更小的设备,诸如手机;

更多具体的介绍可以参考:

https://www.electronics-notes.com/articles/audio-video/hdmi/hdmi-connectors.php#:~:text=Summaries%20of%20the%20different%20HDMI%20connector%20types%20are,5%20HDMI%20Type%20E%20connector%3A%20The%20Typ%20

1.2、管脚信号定义

这里只看看 Type A 类型的管脚定义,其他的可以参考 HDMI Specification 1.4;

 

对应到实际的物理器件如下:

这里的:

数据1+、数据1-;

数据2+、数据2-;

数据3+、数据3-;

指的是3组用于数据传送的差分信号;

时钟+和时钟-,是差分时钟信号;

 

2、基本结构

HDMI 传输的拓扑结构如下所示:

hdmi_block

左边称为 Source,负责将 Video、Audio、控制信息等与 Sink 设备进行传输、交互;这里的信号与前一小结的信号定义相对应;可以看到,Source 和 Sink 端基本的数据传输由一个叫做 TMDS Channel 构成,一共有 3 个通道,同时,Source 负责提供 TMDS 的同步时钟信号;

这里多次提到了 TMDS,那么 TMDS 是什么呢?

HDMI 的数据传送,并不是直接传数字信号,而是将要传输的数字信号采用 TMDS 编码,TMDS 编码也叫最小化传输差分信号,原始数据经过这种编码后,以差分的方式在线上传输,Sink 端收到数据后,再通过解码,解出原始数据;

除了 TMDS 的 3 路差分数据通道以及 TMDS 的差分时钟以外,还有 SCL/SDA 的串行通信接口用于和 Sink 端进行 EDID 交互以及 CEC 协议对设备进行控制;

 

3、链路层分析

3.1、链路层结构

物理结构,管脚描和信号描述后,现在我们知道,HDMI 传输有两端,Source 端通过 3 组差分信号(TMDS编码后)以差分时钟为驱动,给 Sink 端进行数据传送;那么是将什么数据进行 TMDS 编码传输的呢? TMDS 的编码规则是怎样的,以及传输的数据位宽和含义,甚至于传输的每个阶段是如何定义的,这些都由链路层来定义;

下面这个图就是逻辑链路层的示意图:

图中,左边为 Source 端,右边为 Sink 端,也就是说数据传输从左边到右边;

先看左边3个方框:

D[7:0]:8 bits 并行数据,是实际的图像数据,以 RGB 图像为例,Pixel component 指的是输入的 8 bits 的并行原始图像数据,这个数据从哪来?如果是图片,那么就是图片解码后的帧,如果是视频,那么就是视频解码后的帧;

D[1:0]:第一个是 HSYNC/VSYNC 信号(所有的显示数据输出都会有这个,不再额外说明,参考 VGA 时序分析,其实都类似),下面两个方框接收到的是 CTL0 ~CLT3 一共 4 个 bits 的控制信号;

D[3:0]:是额外的一些数据,比如音频等;

数据过来后接入到 Source 端,由于来的数据是并行的,而且是原始数据,这些数据需要进行编码(TMDS)串行化,再在 Channel 0 ~ Channel 2 这 3 个数据通道上,以像素时钟为驱动,进行发送;

右边的 Sink 端,会按照协议,按照传来的数据进行解析并相应的动作;

值得关注的是,Channel 0 ~ Channel 2 这 3 个数据通道上发送的数据,总是以 10 bits 为一个有效数据进行发送;这是什么含义呢?等会马上说明!现在只需要知道,传输给 Source 端的元数据有多种,包括:

1、真实有效的图像数据(比如 RGB);

2、HSYNC/VSYNC 场同步和行同步信号;

3、CTL0 ~ CTL3 控制信息;

4、额外数据;

那么对端是如何知道传来的数据到底是啥?应该如何处理这些数据?是用来显示到屏还是控制信息呢?这就是接下来 Source 和 Sink 双方都需要遵守的协议规则内容;

3.2、几个传输阶段定义

HDMI 链路将数据传输分为了3个阶段:

1、Video Data Period:顾名思义,这个阶段用于传输实际有效的视频图像数据,Source 端给 Sink 端发送图像数据,Sink 端显示;

2、Data Island Period:这个阶段用于传输音频或者额外定义的数据(以数据包的形式);

3、Control Period:当没有视频图像数据和音频数据,或者额外数据的时候,都处于这个阶段;

值得注意的是,协议规定 Control Period 阶段一定是夹在 Video Data Period 和 Data Island Period 阶段之间的,也就是说,不可能存在 Video Data Period 和 Data Island Period 阶段连着的情况;

官方举了个例子,以 720x480p 的图像帧为例:

蓝色部分是 Data Island Period

深灰色部分是有效的图像数据 Video Data Period

浅灰色是 Control Period

可以看到,在有效图像部分,是 720x480 的宽度;没有传送 Data Island Period 的时候,都在传送 Control Period

3.3、传输内容

上面我们看到了有3个传输阶段,以及每个传输阶段大致应该传输什么东西,接下来我们将它们细节放大,更加细颗粒度的看看他们是传输什么样的数据、每个bit是如何传输的以及3个阶段之间的关系;

前面提到一个小点:Control Period 阶段一定是夹在 Video Data Period 和 Data Island Period 阶段之间

他们是怎么夹的呢?

1.4 的协议规定如下:

1、每个 Video Data Period  Data Island Period 都是以一个叫做 Leading Guard Band 开始!这样设计的目的是考虑到从 Control Period 阶段转换到数据传送阶段的鲁棒性,这个 Leading Guard Band 包含两个特殊字符;

2、每个 Data Island Period 尾部都是由一个叫做 Trailing Guard Band 来保护,目的也是为了考虑从 Data Island Period 阶段完成后,转换到 Control Period 阶段的鲁棒性;

每个传输阶段传输的数据内容都不相同,但是,线上传输的都是 10bits 的 TMDS 信号

可以看到,在 Video Data 阶段,传输的主要是实际的图像信息的数据,每个通道将 8bits 的串行原始数据编码后,成为线上的 10bits TMDS 信号,在 3 个 通道上传送;

Data Island 阶段,主要传送 Packet Data,它将 4 bits 的信息数据通过编码后,成为 10bits 的 TMDS 信号,在 3 个通道上传输;

Control 阶段,传输 Preamble 和 HSYNC/VSYNC ,将 2 bits 实际数据通过编码后,成为 10bits 的 TMDS 信号传输;

我们对照之前那个实际的连接图来看,便可以理解上面所说的 xx bits 数据编码后,在各个通道上传输的过程:

注意,每个阶段的编码方式均不一样,后面将会讲解;

这里,引入了一个叫做 Preamble 的东西,下面来描述;

 

3.3.1、Control Period

前面说的引入了一个叫做 Preamble 的东西,也知道了 Control Period 是夹在 Data Island 和 Video Data 阶段之间的,而且带有 Guard 区间;那么问题来了,Control Period 后面跟的到底是 Data Island 呢,还是 Video Data 阶段呢?这就是靠 Preamble 来区分了:

Control Period 传输的最后阶段定位为 Preamble,它指示了后面即将来到的是 Data Island 还是 Video Data 阶段,还记得之前有 CTL0 ~ CTL3 吗,这时候他们起作用了:

Control Period 阶段会一直传输 HSYNC/VSYNC,但在最后即将进入其他阶段的时候,传输 Preamble 来指示下一个具体是哪个阶段;

3.3.2、Video Data Period

在 Control Period 后,如果指示了下一个阶段为 Video Data Period,那么即将开始实际的图像数据(通过 TMDS 编码后)的数据传输;还记得吗,在进入 Video Data Period 之前,有一个 Guard Band,叫做 Video Guard Band,它的 TMDS 编码后每个通道的 10 bits 数据定义如下:

case (TMDS Channel Number):

    Ch0: q_out[9:0] = 0b1011001100;

    Ch1: q_out[9:0] = 0b0100110011;

    Ch2: q_out[9:0] = 0b1011001100;

endcase

在传输完 Video Guard Band 后,便开始真实的数据传送了;数据的编码方式稍后描述;

3.3.3、Data Island Period

在 Control Period 后,如果指示了下一个阶段为 Data Island Period,那么即将开始 Data Island Period 的数据传输;这个阶段的内容较为复杂,也是以一个 Guard Band 作为开始的,最后以一个 Trailing Guard Band 结束,他们遵循如下编码后的格式:

case (TMDS Channel Number):

    Ch0: q_out[9:0] = n.a;

    Ch1: q_out[9:0] = 0b0100110011;

    Ch2: q_out[9:0] = 0b0100110011;

endcase

所以,官方给了一个图,来表达这 3 个阶段的一个大致情况:

这个图,从左到右,分别代表了不同的阶段以及阶段之间的转换,我使用方框进行标记,并写上了字母;解释如下:

A、空闲时候的 Control Period;

B、也属于 Control Period,但是接下来快要进入 Data Island Period 了,所以在 Control Period 阶段的尾部,传输了 Preamble 信息,代表接下来要进入 Data Island Period;

C、在 Data Island Period 阶段的起始部分,插入了 Guard Band;

D、Data Island Period 的传输阶段;

E、Data Island Period 传输完成,插入的 Guard Band;

F、进入 Control Period 的空闲阶段,只传输 HSYNC/VSYNC;

G、也属于 Control Period,但是接下来快要进入 Video Data Period 了,所以在 Control Period 阶段的尾部,传输了 Preamble 信息,代表接下来要进入 Video Data Period;

H、进入 Video Data Period 阶段的起始部分,插入 Guard Band;

I、进入实际有效的图像数据传送;

可以看到,在 Data Island Period 阶段,传输的有:

1、HSYNC

2、VSYNC

3、Packet Header

4、Packet

所以,Data Island Period 阶段传输,是以 Packet 为单位来进行传输,并在对端进行解析的;现在我们关注这个 Packet ;

HDMI 1.4 协议规定:Data Island Period 阶段传输中包含的 Packet 数量范围为:1-18。允许在 Video Data Period 之间出现 0 个 Data Island Period;

可以看到,上面的图中,每一个 Packet Header N + Packet N,都是 32 个 TMDS Clock;

一个完整的 Packet 体由头部和包体构成(也就是 32 个 TMDS Clock 中传输的内容);每一个包体包含4个子 Packet,每个子 Packet 含有 64 bits 数据,前 56 bits 为有效数据,后 8 bits 数据为 8bits ECCparity。每个子 Packet 都占据 TMDS 1、2通道。具体如下:

首先看 Header,32 个 TMDS Clock,Header 以 1 个 bit 进行传输,所以最后就会传 32 bits,也就是 4 个 Bytes,组合后,最后一个 Bytes 就是校验位;

再看包体部分,Ch1 和 Ch2 传输的包体,按照上面的规则进行合并,成为 Subpacket 0 ~ Subpacket 3,并且每个 Subpacket 的最后一个 Byte 成为校验位;

校验位的填充,由 ECC 方式填充:

所以,最终 Data Island Period 阶段传输的一个 Packet 的有效数据的组成就由 3 Bytes Header + 28 Bytes Packets 构成;

和普通的通信一样,Header 代表了包属于的类型,也就是后面跟的实际包体的数据含义,Spec 将 3 Bytes 的 Header 定义为:HB0、HB1、HB2:

第一个字节 HB0代表了后面数据的类型,后面两个字节是一些特殊的数据:

当然,这部分内容非常非常多,有兴趣的建议仔细研磨 Spec 和 CEA-861 规范,这里不再多说;

3.4、数据编码

上面的部分,反复提到了数据是经过了 TMDS 编码后,xx bits 转为 10 bits,再在线上传输的,这里看看这几种编码;

3.4.1、Control Period 数据编码

从上面的内容知道,Control Period 阶段传输的内容只有 Ch 0 的 VSYNC/HSYNC 和 Ch1 上的 CTL0 和 CTL1,以及 Ch2 上的 CTL2 和 CTL3 信号;

也就是说,每个通道上,只对 2 bits 的数据进行编码,成为 10 bits 的数据,specification 使用 D0/D1 来代表着 2 bits,并定义如下;

这 2 bits 的编码到 10bits 的方式如下:

3.4.2、Data Island Period 数据编码

Data Island Period 阶段的传输数据,每个通道是 4 bits,所以,这个阶段的编码,需要将 4bits 的数据,编码成为 10 bits 的 TMDS 数据;

这个阶段的编码叫做 TMDS Error Reduction Coding(TERC4),它的规则如下所示:

3.4.3、Video Data Period 数据编码

这个阶段传输的实际图像数据,来自 8bits 的 pixel 并行数据,它首先将这 8 bits 数据并转串,然后通过 TMDS 最小化传输编码,变成 9 bits,然后经过一个叫做 DC-balanced 的方式将这 9bits 数据变成 10 bits 数据,然后以差分的形式在线上传输;

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

整个编码过程如下,有兴趣的可以看看 Spec

这里写图片描述

4、视频传输

4.1、时钟

在介绍颜色深度之前,再强调介绍一下像素(Pixel Clock)时钟和 TMDS 时钟;

Pixel Clock :像素时钟指的是传输一个像素的时钟,可以理解是一个虚拟的时钟;

TMDS Clock :TMDS 时钟指的是实际线上的差分信号时钟;

TMDS 的 3 个通道的信号都被编码成 10bits 进行发送,物理上,每个 TMDS 时钟发送 10bits 数据

理解这一点非常重要,在后期理解 IP 非常有帮助;

4.2、像素编码

HDMI 支持三种像素编码 Pixel Encoding: RGB4:4:4, YCbCr4:4:4, YCbCr4:2:2,

RGB444每个颜色占8bit, YCbCr422中Y占12bit,C占12bit,YCbCr444中Y,Cb,Cr都占用8bit。

他们的传输分别为:

4.3、颜色深度

前面说了像素编码格式,以 RGB 为例,RGB4:4:4,说明他们的比例是一样的,那么每个通道多少呢?前面都是以 24bits 作为例子,这个 24bits 就是颜色深度,指的是一个 RGB 像素占用 24bits,也就是每个通道占用 8bits;除了 24bits 颜色深度,HDMI 协议还定义了 30bits 色深,36bits、48bits;

因为之前讲的都是以 24bits 色深的 RGB 为例,一个24bits实际像素的传输由 3 个通道 8bits 实际数据转为 TMDS 信号后,每个通道 10bits,使用一个 TMDS 时钟传输完成;所以呢,再 24 bits 情况下,输入的每个通道的原始信息正好等于编码前的 8bits,所以此刻 TMDS Clock 和 Pixel Clock 之间就是 1:1 的关系:

那么其他颜色深度呢?因为 Video 阶段的数据编码是以 8bits 串行输入,经过最小化和 DC 平衡后,编码为 10bits 传输,但到了 30bits 的色深,有点玩不转了,因为 RGB 每个通道就是 10bits 的原始数据了,编码的时候,只能够以 8bits 数据作为输入,那么咋办呢?拆分呗,以 30 bits 颜色深度为例:

可以看到再 30bits 色深的情况下,每个通道的原始数据为 10bits,但是编码器的输入为 8bits,所以如上述所示,A0-A7 属于像素 A 的一个通道的原始像素信息,使用它们进行第一次编码;然后会将像素 A 的 A8-A9与下一个像素 B 的 B0-B5 一起编码;如此下去;所以呢,5个分片,包含了 4 个像素 A、B、C、D;但是实际的线上的 TMDS Clock 消耗了 5 个,编码并传输了 4 个像素,OK,所以此刻 TMDS Clock 和 Pixel Clock 之间就是 5:4 的关系:

其他的 36bits 和 48bits 颜色深度一样如下:

所以呢,便可以得到再不同颜色深度下,虚拟的像素时钟和 TMDS 时钟以及分片信息的对应关系如下:

4.4、视频格式

其实这里写成视频格式,有一些牵强,并不是视频的编码格式(H.265/AVS),也不是封装格式(MP4/AVI)的含义,而是图像含义上的像素分布,也就是实际显示区域的横轴和纵轴像素点的数目,隔行或逐行扫描,以及扫描频率的组合;

比如什么 1080p、720p、4K这种;实际上,HDMI 中定义了非常非常多的格式,只不过有些常用,有些不常用而已;更多的格式描述全部包含再一篇 CEA-861-D 的文档中,文档中非常详细的记录了每一种格式的时序,以及根据时序计算出来的时钟频率等等信息;

我们以前经常叫的 1080i/p 指的是 1920x1080i/p,他又有 50Hz 和 60Hz 刷新率区分;p代表的是逐行扫描;i 代表的是隔行扫描方式;

我们可以通过查询 CEA-861-D 来找到相关的信息,比如 720p@60Hz,他是 1280x720p@60Hz 的标准:

可以看到有效像素:

横向有效显示 H=1280,纵向有效显示 V=720

横向填充 H bank=370,纵向填充 V bank=30

横向总共 H Total=1650,纵向总共 V Total=750

像素时钟频率 Pixel Freq = 1650x750x60Hz=74250000Hz=74.250MHz

5、其他

HDMI 还有 Audio、CEC、DDC(EDID 解析)等等内容,暂时分析到这里,接下来打算使用 FPGA 使用 IP 来将 HDMI 用起来;

同时,由于是高速差分信号,实际评价 HDMI 信号质量,还有一些电气特性手段,诸如眼图等等内容,有机会再分析;

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐