HDMI物理层详解:TMDS编码原理、差分信号、电气特性与PCB设计要点
各位同学,今天我们来啃一块硬骨头——HDMI的物理层。说实话,很多做FPGA采集的朋友,一上来就怼逻辑代码,结果板子调不通,最后发现是物理层出了问题。我当年也吃过这个亏,所以今天把这部分掰开揉碎了讲清楚。
一、TMDS编码:从8位到10位的魔法
TMDS,全称Transition Minimized Differential Signaling,翻译过来就是「最小化传输差分信号」。名字很长,但核心就两件事:减少跳变和直流平衡。
为什么要减少跳变?你想想看,信号每跳变一次,电磁辐射就多一分,功耗也大一分。HDMI跑的是高速,动辄几Gbps,跳变多了根本受不了。
TMDS编码器把8位数据变成10位,具体怎么变的?我画个简图你就明白了。
编码过程分两步走:
- 减少跳变:比较当前8位数据和上一个8位数据,看是XOR还是XNOR能让跳变更少。说白了就是「尽量不动」。
- 直流平衡:统计已经发送的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信号质量好不好,最直观的方法就是看眼图。眼图张开得越大,信号质量越好。
影响眼图的因素主要有三个:
- 抖动(Jitter):时钟和数据之间的时间偏差。抖动大了,眼图就闭合了。
- 反射:阻抗不匹配导致信号反弹。反射会在眼图上形成「鬼影」。
- 衰减:高频信号在传输线上会衰减。线越长,衰减越严重。
我记得有一次调试一个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设计,这四个方面环环相扣,哪一个出问题都会导致采集失败。希望大家在实际项目中,能把这些知识用起来,少走弯路。