2、HDMI协议深度解析:TMDS编码原理、差分信号、EDID与DDC通道、HDMI 1.4 vs 2.0 vs 2.1标准对比

好,咱们进入第二章。HDMI协议,说白了就是视频和音频数据怎么从你的FPGA板卡跑到显示器上去。很多初学者觉得这东西就是个接口,插上就能用。其实不然,里面的门道多着呢。我当年第一次调HDMI输出,画面全是雪花点,折腾了整整三天才发现是TMDS的时序偏差了一个比特。嗯,咱们今天就把这些坑一个个填平。

2.1 TMDS编码原理:为什么需要8b/10b?

TMDS,全称是Transition Minimized Differential Signaling。翻译过来就是「最小化转换差分信号」。名字很长,但核心就两件事:减少信号跳变和直流平衡。

你想想看,如果原始数据里连续出现多个0或1,信号线上就会长时间保持同一电平。这对接收端的时钟恢复是灾难性的——锁相环会失锁。所以HDMI用了8b/10b编码,把8位数据变成10位。多出来的2位干嘛用?

  • 保证足够的跳变:让接收端能准确恢复时钟
  • 直流平衡:让信号中0和1的数量尽量相等,避免电荷积累

我个人习惯把TMDS编码分成两步理解:

  1. 第一步:XOR/XNOR编码。根据数据特征选择一种方式,让跳变次数最少
  2. 第二步:直流平衡。根据已发送的0/1数量,决定是否翻转整个10位码字

核心公式(简化版):

编码后的10位数据 = 编码控制位 + 8位数据 + 直流平衡位

其中直流平衡位决定是否对前9位取反,以保证长期来看0和1的数量差不超过±1。

我在项目中遇到过一个问题:用逻辑分析仪抓TMDS信号,发现某些像素点总是错的。后来发现是编码器里对「控制周期」和「数据周期」的切换没处理好。记住:TMDS有三种周期——控制周期、数据周期、前导周期,每种周期的编码规则不一样。

2.2 差分信号:为什么用两根线传一个信号?

HDMI的物理层用的是差分信号。说白了就是每个通道用两根线(D+和D-),传的是它们的电压差,而不是对地电压。

为什么这么做?抗干扰。你想想看,如果外界有电磁干扰,它会同时影响D+和D-两根线。但它们的差值基本不变。这就是共模抑制。

实战经验:

在FPGA里做差分输出时,一定要用专用的差分输出原语(比如Xilinx的OBUFDS)。别想着用两个普通IO口模拟,时序根本对不上。我曾经试过,结果画面闪烁得像迪斯科舞厅。

HDMI一共有4对差分线:3对数据通道(R/G/B或数据通道0/1/2)和1对时钟通道。时钟通道的频率是像素时钟,数据通道的频率是像素时钟的10倍(因为8b/10b编码)。

2.3 EDID与DDC通道:显示器在跟你说话

EDID,Extended Display Identification Data。说白了就是显示器的「身份证」。里面存着显示器的分辨率、刷新率、色彩深度等能力信息。

DDC通道(Display Data Channel)用的是I2C协议。地址是0xA0(写)和0xA1(读)。FPGA作为主机,去读显示器的EDID数据。

我建议你在初始化HDMI输出时,一定要先读EDID。别想当然地认为显示器支持4K@60Hz。我遇到过一台老投影仪,只支持1024x768@60Hz,强行输出1080p的结果就是黑屏。

注意:

EDID数据是128字节的块结构。如果显示器支持4K,可能会有第二个128字节的扩展块。读取时要注意地址偏移。

DDC通道的时序要求很严格:I2C时钟频率不能超过100kHz(标准模式)。有些FPGA的I2C核默认跑400kHz,直接挂掉。嗯,这里要注意。

2.4 HDMI 1.4 vs 2.0 vs 2.1:到底差在哪?

咱们直接上表格,一目了然:

特性 HDMI 1.4 HDMI 2.0 HDMI 2.1
最大带宽 10.2 Gbps 18 Gbps 48 Gbps
最大分辨率 4K@30Hz 4K@60Hz 8K@60Hz / 4K@120Hz
色彩深度 8bit 10bit/12bit 12bit/16bit
编码方式 TMDS 8b/10b TMDS 8b/10b FRL 16b/18b(部分)
可变刷新率 不支持 不支持 支持VRR
eARC 不支持 不支持 支持

看到没?HDMI 2.1最大的变化是引入了FRL(Fixed Rate Link)模式,不再用TMDS了。但别高兴太早——很多HDMI 2.1设备仍然兼容TMDS模式,用于低分辨率输出。

我个人建议:如果你做的是消费级产品,直接上HDMI 2.0。因为2.1的FRL编码器在FPGA里实现起来非常复杂,需要大量的逻辑资源。除非你非要做8K@60Hz,否则2.0完全够用。

2.5 知识体系结构图

下面这张图展示了HDMI协议的核心层次关系。我画的时候特意把TMDS编码放在中间,因为它是整个协议的基石。

HDMI协议核心知识体系 应用层:视频/音频数据 EDID/DDC通道(I2C协议) TMDS编码(8b/10b) 最小化跳变 + 直流平衡 差分信号(D+/D- 共模抑制) HDMI标准对比:1.4 vs 2.0 vs 2.1 带宽:10.2Gbps → 18Gbps → 48Gbps 编码:TMDS → TMDS → TMDS/FRL混合 数据流向 →

这张图从下往上看:最底层是物理层的差分信号,往上是TMDS编码,再往上是EDID/DDC通道负责握手,最顶层才是我们关心的视频音频数据。标准对比则贯穿整个体系,告诉你不同版本在每一层的变化。

2.6 避坑指南

最后,分享几个我踩过的坑:

  • TMDS时钟频率计算:像素时钟 × 10 = TMDS时钟。比如1080p@60Hz的像素时钟是148.5MHz,TMDS时钟就是1.485GHz。别算错了,否则PLL锁不住。
  • 差分线等长:PCB布线时,D+和D-的长度差不要超过5mil。我有一块板子差了15mil,结果3米线缆直接花屏。
  • EDID读取超时:有些显示器响应很慢,I2C读取时一定要加超时处理。我习惯设100ms超时,重试3次。
  • HDMI 2.1的FRL模式:如果你非要做2.1,记得FRL模式下没有TMDS时钟通道,时钟是嵌入在数据流里的。这意味你的接收端需要CDR(时钟数据恢复)电路。

好了,这一章的内容就到这。HDMI协议说深也深,说浅也浅。关键是动手调一次,比看十遍书都管用。下一章咱们会讲怎么在FPGA里实现TMDS编码器,到时候我会贴出完整的Verilog代码。

本章要点回顾:

  • TMDS编码 = 8b/10b + 直流平衡
  • 差分信号抗干扰能力强,但布线要等长
  • EDID是显示器的身份证,必须读
  • HDMI 2.1引入了FRL模式,实现更复杂

可可精品资料库