HDMI物理层详解:TMDS编码原理、差分信号、电气特性与PCB设计要点

各位同学,今天我们来啃一块硬骨头——HDMI的物理层。说实话,很多做FPGA采集的朋友,一上来就怼逻辑代码,结果板子调不通,最后发现是物理层出了问题。我当年也吃过这个亏,所以今天把这部分掰开揉碎了讲清楚。

一、TMDS编码:从8位到10位的魔法

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

为什么要减少跳变?你想想看,信号每跳变一次,电磁辐射就多一分,功耗也大一分。HDMI跑的是高速,动辄几Gbps,跳变多了根本受不了。

TMDS编码器把8位数据变成10位,具体怎么变的?我画个简图你就明白了。

TMDS编码流程 8位数据 编码器 (减少跳变) 9位数据 直流平衡 (XOR/XNOR) 10位数据 第一步:比较当前数据与上一数据,选择跳变少的编码方式 第二步:根据已发送的1/0数量,决定是否翻转数据以维持直流平衡 最终效果:跳变次数从平均4次降到2次以下,直流分量接近0 💡 我习惯用Xilinx的7系列FPGA做HDMI输入,它的SelectIO资源可以直接处理TMDS电平

编码过程分两步走:

  1. 减少跳变:比较当前8位数据和上一个8位数据,看是XOR还是XNOR能让跳变更少。说白了就是「尽量不动」。
  2. 直流平衡:统计已经发送的1和0的数量,如果1太多,就把数据翻转一下。这样长期来看,信号的平均电压稳定在中间值。

关键点:TMDS编码后,10位数据中1和0的数量差不超过2。这意味着信号没有直流分量,可以用变压器耦合,也方便接收端做时钟恢复。

我在项目中遇到过一个问题:用逻辑分析仪抓TMDS信号,发现某些像素点老是出错。查了半天,原来是编码器状态机没复位,导致直流平衡计算错误。从那以后,我每次上电都会先发几个「空白像素」让编码器稳定下来。

二、差分信号:为什么是3.3V的摆幅?

TMDS用的是差分信号,一对线传一个信号。正端和负端互为镜像,接收端看的是两者的差值。

这样做的好处很明显:

  • 抗共模干扰:外界噪声同时耦合到两根线上,一减就没了
  • 电磁辐射小:两根线的电流方向相反,磁场互相抵消
  • 摆幅小:TMDS的差分摆幅只有400mV到600mV,比单端信号省电多了

你可能会问:为什么是3.3V的共模电压?嗯,这是历史原因。早期的HDMI芯片用3.3V供电,TMDS的共模电压就定在了3.3V。后来虽然工艺进步了,但这个标准一直保留着。

参数 最小值 典型值 最大值 单位
差分摆幅 400 500 600 mV
共模电压 3.0 3.3 3.6 V
上升/下降时间 75 100 150 ps
数据速率(HDMI 1.4) - 3.4 - Gbps

⚠️ 注意:TMDS的共模电压是3.3V,但很多FPGA的IO bank只能承受2.5V。这时候需要加电平转换,或者用AC耦合电容隔直。我曾经因为没注意这个,烧了一块FPGA的bank,教训深刻。

三、电气特性:眼图与抖动

判断TMDS信号质量好不好,最直观的方法就是看眼图。眼图张开得越大,信号质量越好。

影响眼图的因素主要有三个:

  1. 抖动(Jitter):时钟和数据之间的时间偏差。抖动大了,眼图就闭合了。
  2. 反射:阻抗不匹配导致信号反弹。反射会在眼图上形成「鬼影」。
  3. 衰减:高频信号在传输线上会衰减。线越长,衰减越严重。

我记得有一次调试一个4K@60Hz的采集卡,画面老是闪。用示波器一看,眼图都快闭上了。查了半天,发现是HDMI线太长,信号衰减太厉害。换了一根短一点的线,问题就解决了。所以,线长不是你想加就能加的。

💡 经验之谈:对于HDMI 1.4(3.4Gbps),建议线长不超过5米。对于HDMI 2.0(6Gbps),建议不超过3米。如果非要长距离传输,用光纤HDMI线或者加中继器。

四、PCB设计要点:差分对的走线艺术

这部分是实战中的重头戏。TMDS信号跑到几Gbps,PCB设计稍微马虎一点,信号就废了。

我总结了几条铁律:

  • 差分阻抗100Ω:TMDS要求差分阻抗100Ω,单端对地50Ω。这个要靠叠层设计和线宽线距来保证。
  • 等长走线:同一对差分线,长度差不超过5mil。我习惯在布线时先走长的那根,再绕短的那根。
  • 远离干扰源:TMDS线不要靠近时钟线、电源开关管这些噪声源。实在避不开,就加地线隔离。
  • 减少过孔:每个过孔都会引入寄生电感和电容。能不走过孔就不走,非要走的话,每对线过孔数要一致。

下面是一个典型的4层板叠层设计:

层号 功能 厚度 备注
L1 信号层(TMDS) 1.4mil 微带线,参考L2
L2 地层(GND) 1oz 完整地平面,不分割
L3 电源层 1oz 3.3V、1.8V等
L4 信号层(低速) 1.4mil I2C、CEC等

核心原则:TMDS信号必须参考完整的地平面,不能跨分割。如果L2层被电源分割了,那TMDS的回流路径就会绕远路,产生严重的EMI问题。

我个人的习惯是,在TMDS差分对旁边加一排地过孔,间距不超过信号上升沿长度的1/10。比如3.4Gbps的信号,上升沿约100ps,对应的空间长度是1.5cm,那地过孔的间距就控制在1.5mm以内。这样做能有效抑制串扰。

五、避坑指南:那些年我踩过的雷

最后分享几个实战中容易忽略的点:

  • AC耦合电容:TMDS信号需要AC耦合,电容值一般选0.1uF。但要注意电容的封装,0402比0603的寄生电感小,更适合高速信号。
  • ESD保护:HDMI接口是热插拔的,静电防护不能少。我习惯用TVS管,结电容要小于0.5pF,否则会吃掉信号的高频分量。
  • 时钟恢复:接收端需要从数据中恢复时钟。这个PLL的带宽要设计好,太宽了噪声大,太窄了跟不上数据速率的变化。
  • 预加重与均衡:长线传输时,发送端可以加预加重(提升高频分量),接收端加均衡器(补偿衰减)。很多HDMI芯片内部已经集成了这些功能,但FPGA实现的话就要自己写。

我曾经在一个项目里,为了省成本,用了便宜的HDMI连接器。结果信号反射严重,眼图惨不忍睹。后来换了Molex的连接器,问题迎刃而解。所以,连接器这种小东西,真不能省。

好了,HDMI物理层的内容就讲到这里。TMDS编码、差分信号、电气特性、PCB设计,这四个方面环环相扣,哪一个出问题都会导致采集失败。希望大家在实际项目中,能把这些知识用起来,少走弯路。

可可精品资料库