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]用途
000010101011数据使能低电平
011101010100行同步有效
100101010101场同步有效
111010101010空闲/保留

这里有个坑——控制编码的跳变数固定在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位一组对齐。对齐的关键是控制字符——接收端会先锁定控制字符(比如数据使能无效期间的固定编码),再通过这个参考点找到后续数据的边界。

解码的四个步骤:

  1. 串转并:恢复10位数据字
  2. DC平衡逆运算:根据第9位判断是否需要取反
  3. 6→5和4→3逆编码:恢复原始8位数据
  4. 控制字符检测:提取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编码核心流程图

下面这张图概括了编码与解码的完整流程,我建议你把它贴在工位上。每次做验证时扫一眼,脑海里自动过一遍每个节点的检查项。

TMDS编码与解码核心流程图 TMDS编码与解码核心流程图 发送端(编码) 8位并行数据 5→6编码 3→4编码 DC平衡 计数器判断 10位→串行 差分输出 传输通道 接收端(解码) 差分输入 CDR 时钟恢复 串→并转换 DC逆运算 判第9位 6→5解码 4→3解码 8位输出 说明: 编码侧蓝色→红色→绿色→紫色→橙色对应四步串行化流程;解码侧反向执行。 每个节点的输出质量直接影响下一个节点,验证时要逐级卡位。

4.7 一致性验证中的关键检查项

做TMDS编码相关的一致性验证时,我个人习惯重点盯这几个指标:

  • 最大连续相同位检查:不允许超过5个连续相同电平,否则PLL会跑偏
  • DC平衡偏移量检查:实时偏移不超过±4,窗口偏移不超过±10
  • 编码表覆盖率:测试图案必须覆盖8位数据的256种取值
  • 跳变密度检查:任意16位窗口中,跳变数必须≥4且≤12

这些检查项最好做成自动化脚本,手工跑一遍太容易漏了。我记得有一次客户送测的样品,彩条测试全过,但转到深蓝画面就黑屏,最后发现是DC平衡窗口检测的边界条件没写对。

嗯,TMDS编码这块说深了可以讲一整天,但作为验证工程师,你只要抓住编码表、DC平衡、串行化三个核心点,再加上我上面说的那几个检查项,基本不会出大问题。