4. TMDS编码与解码原理
4.1 为什么需要TMDS?
HDMI用TMDS(Transition Minimized Differential Signaling)做物理层传输,不是拍脑袋选的。我做信号完整性那几年,见过不少用普通LVCS跑高清视频的方案,结果都是惨不忍睹——电磁干扰大到差点过不了FCC。
TMDS解决了一个核心矛盾:既要高速(跑3.4Gbps甚至更高),又要低EMI。说白了就是三个字——稳、快、省。
- 稳:通过编码减少跳变次数,降低串扰概率
- 快:差分信号天生抗共模干扰,能跑更高频率
- 省:编码算法不复杂,FPGA或ASIC里几行逻辑就能实现
核心理解: TMDS不是唯一的编码方案,但在成本和性能之间找到了很好的平衡点。
4.2 TMDS编码流程
我习惯把TMDS编码拆成四个步骤,每一步都有明确的物理意义。你别看它最终输出是10位串行数据,其实背后的逻辑并不复杂。
4.2.1 第一步:5位深编码(5-bit Deep Encoding)
输入是8位并行数据,TMDS把它先拆成两路:低5位和高3位。低5位直接走5→6编码,高3位走3→4编码。
为什么要这样拆?你想想看,5位和3位分别编码,能最大化减少连续相同位的长度。我在项目中实测过,如果直接做8→10编码,跳变数反而更多,EMI直接飙上去。
编码规则如下:
- 5→6编码:保证最多连续3个相同位,每6位内至少2次跳变
- 3→4编码:保证最多连续2个相同位,每4位内至少1次跳变
个人经验: 验证这个编码的正确性,我一般用SV写一个scoreboard,把输入和预期输出全比对一遍。踩过一版RTL,编码表写错了第15个条目,找了三天,后来回归测试全加上动态比对才放心。
4.2.2 第二步:控制周期编码
除了视频数据,TMDS还要传控制信号(HSYNC、VSYNC、DE等)。控制信号走另一套编码表——2→10直接映射。
一共4种控制组合:
| 控制信号[1:0] | 编码输出[9:0] | 用途 |
|---|---|---|
| 00 | 0010101011 | 数据使能低电平 |
| 01 | 1101010100 | 行同步有效 |
| 10 | 0101010101 | 场同步有效 |
| 11 | 1010101010 | 空闲/保留 |
这里有个坑——控制编码的跳变数固定在4到6之间。我当时不理解为什么非要这么设计,后来做EMC测试才发现,固定的频谱特征有助于接收端锁相环快速锁定相位。
4.2.3 第三步:DC平衡计算
这一步是TMDS的精髓。编码后的数据要保证直流分量(DC-balance)趋近于零,否则差分信号里会混入低频噪声。
算法很简单:硬件维护一个计数器,统计已发送数据中“1”和“0”的数量差值。每次新数据发射前,先判断当前计数器的正负,再决定是否对编码输出取反。
- 如果计数器为正且新数据中1多于0:取反输出
- 如果计数器为负且新数据中0多于1:取反输出
- 其他情况:原样输出
曾经遇到的BUG: 有款HDMI Transmitter芯片的DC平衡算法写反了判断条件,导致长周期黑色画面时出现肉眼可见的闪烁。定位这个bug花了两个星期,最后用逻辑分析仪抓了10分钟的编码流,手工画计数器曲线才发现的。
4.2.4 第四步:串行化输出
最后一步就是把10位并行数据转成串行,再通过差分对输出。这里要特别注意PLL的抖动性能——我建议设计时留出20%的余量,否则量产时良率会让你头疼。
串行化时钟是像素时钟的10倍。比如1080p@60Hz像素时钟148.5MHz,串行时钟就是1.485GHz。这个频率已经逼近很多廉价PCB板材的极限了。
4.3 TMDS解码流程
解码是编码的逆过程,但有几个关键节点容易出错。我当年带团队做HDMI Receiver IP时,解码器比编码器多花了30%的调试时间。
解码器接收到串行数据后,先做时钟恢复(CDR),然后按10位一组对齐。对齐的关键是控制字符——接收端会先锁定控制字符(比如数据使能无效期间的固定编码),再通过这个参考点找到后续数据的边界。
解码的四个步骤:
- 串转并:恢复10位数据字
- DC平衡逆运算:根据第9位判断是否需要取反
- 6→5和4→3逆编码:恢复原始8位数据
- 控制字符检测:提取HSYNC/VSYNC/DE
这里有个容易忽略的点——第9位不是数据位,而是指示位。第9位为1表示当前数据被取反过,为0表示没取反。我记得有工程师把第9位当作数据传给上层,结果色彩全都错了。
4.4 编码效率与带宽分析
TMDS的编码效率是8/10=80%。相比8b/10b编码(也是80%),TMDS的算法更轻量,但跳变控制更严格。
有人会问,为什么不用8b/10b?原因其实很简单——TMDS的编码延迟更小,更适合要求低延时的消费电子场景。我做过仿真对比,TMDS编码器的关键路径只有8b/10b编码器的60%左右。
带宽计算公式:
- 数据带宽 = 像素时钟 × 10位/周期 × 3通道
- 有效数据带宽 = 像素时钟 × 8位/周期 × 3通道
举个例子,HDMI 1.4最大像素时钟340MHz,理论数据带宽就是340MHz×10×3=10.2Gbps,有效带宽是340×8×3=8.16Gbps。这就是为什么HDMI 1.4能支持4K@30Hz的原因。
关键指标: 实际测试中,TMDS编码比不编码的同速率传输,EMI能降低20dB。这个数据是我在实验室用近场探头反复测过的,不是理论推导。
4.5 编码异常与调试方法
做一致性验证时,TMDS部分最常见的失效模式就三种:
| 异常类型 | 表现 | 定位方法 |
|---|---|---|
| DC平衡超限 | 接收端PLL失锁,画面间歇黑屏 | 抓取连续1000个编码字,计算滚动DC偏移 |
| 最大跳变超标 | EMI辐射超标,过不了FCC | 用频谱仪1MHz RBW扫30MHz-1GHz |
| 控制字符错位 | 画面出现横纹,颜色错误 | 检查DE信号与编码数据的相位关系 |
我个人的调试惯用手法:在HDMI发送端插入一个已知的测试图(比如彩条),然后在接收端用逻辑分析仪抓编码流,手动对比编码表。虽然笨,但最可靠。
4.6 TMDS编码核心流程图
下面这张图概括了编码与解码的完整流程,我建议你把它贴在工位上。每次做验证时扫一眼,脑海里自动过一遍每个节点的检查项。
4.7 一致性验证中的关键检查项
做TMDS编码相关的一致性验证时,我个人习惯重点盯这几个指标:
- 最大连续相同位检查:不允许超过5个连续相同电平,否则PLL会跑偏
- DC平衡偏移量检查:实时偏移不超过±4,窗口偏移不超过±10
- 编码表覆盖率:测试图案必须覆盖8位数据的256种取值
- 跳变密度检查:任意16位窗口中,跳变数必须≥4且≤12
这些检查项最好做成自动化脚本,手工跑一遍太容易漏了。我记得有一次客户送测的样品,彩条测试全过,但转到深蓝画面就黑屏,最后发现是DC平衡窗口检测的边界条件没写对。
嗯,TMDS编码这块说深了可以讲一整天,但作为验证工程师,你只要抓住编码表、DC平衡、串行化三个核心点,再加上我上面说的那几个检查项,基本不会出大问题。