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编码分成两步理解:
- 第一步:XOR/XNOR编码。根据数据特征选择一种方式,让跳变次数最少
- 第二步:直流平衡。根据已发送的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编码放在中间,因为它是整个协议的基石。
这张图从下往上看:最底层是物理层的差分信号,往上是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模式,实现更复杂
可可精品资料库