2、TMDS编码核心:8b/10b编码原理,DC平衡机制,最小化传输差分信号

各位工程师朋友,咱们今天来啃一块硬骨头——TMDS的编码核心。说白了,就是HDMI和DVI接口背后那个把8位数据变成10位数据的“翻译官”。

我当年第一次接触TMDS时,心里直犯嘀咕:好好的8位数据不用,非要折腾成10位,这不是吃饱了撑的吗?直到我在一个项目中,因为信号质量不过关,画面出现闪烁和噪点,才真正体会到这其中的门道。

2.1 为什么需要8b/10b编码?

先问大家一个问题:如果你直接把8位数据通过差分线发出去,会有什么问题?

嗯,问题大了去了。首先,连续的0或1会导致直流分量漂移。你想想看,如果发送一串“00000000”,接收端那边直流电平就偏了,后面再收数据就容易误判。其次,没有足够的跳变沿,时钟恢复就成了难题。

8b/10b编码就是为了解决这两个痛点而生的。它把每8位数据映射成10位,保证:

  • DC平衡:发送的0和1数量尽量相等,直流分量稳定
  • 足够跳变:保证接收端能可靠恢复时钟
  • 特殊字符:可以传输控制信号,比如行同步、场同步

核心要点:8b/10b不是简单的“加两位”,而是经过精心设计的编码映射,确保传输的鲁棒性。

2.2 编码原理:从8位到10位的魔法

8b/10b编码其实分两步走。第一步,把8位数据拆成3位和5位两部分;第二步,分别查表映射成4位和6位。最后拼成10位。

具体来说:

  • 高3位(bits[7:5])→ 通过3b/4b编码器 → 4位
  • 低5位(bits[4:0])→ 通过5b/6b编码器 → 6位

我习惯把这个过程想象成“分而治之”。3位和5位各自查表,组合起来就是10位。这样做的好处是查表规模小,硬件实现简单。

举个例子,假设我们要发送数据0xAB(二进制10101011):

原始数据:1010 1011
拆分成:  101(高3位) + 01011(低5位)

3b/4b编码:101 → 1010(假设)
5b/6b编码:01011 → 011001(假设)

最终10位:1010 011001

个人经验:我在调试FPGA的HDMI接口时,曾经因为编码表查错,导致画面出现彩色条纹。后来我写了个脚本,把8b/10b的映射表全部打印出来,逐条比对,才找到问题。所以,编码表一定要验证,不能想当然。

2.3 DC平衡机制:让信号“不偏不倚”

DC平衡,说白了就是让发送的0和1数量尽量相等。为什么这么重要?

你想想看,如果发送端一直发0,差分线上的电压就会偏向负方向。接收端那边有个阈值比较器,如果直流偏了,阈值也跟着偏,误码率就上去了。

TMDS的DC平衡机制是这样的:

  • 每个10位码字,计算其“不平衡度”(即1的数量减去0的数量)
  • 如果当前码字的不平衡度与之前累积的不平衡度同号,就把当前码字取反
  • 这样,累积不平衡度始终控制在很小的范围内

我举个例子:

假设当前累积不平衡度 = +2(表示多发了2个1)
新码字:1100110011(6个1,4个0,不平衡度=+2)
同号!所以取反为:0011001100(4个1,6个0,不平衡度=-2)
累积不平衡度变为:+2 + (-2) = 0

注意:我曾经在一个项目中,因为忽略了DC平衡的初始状态,导致上电后前几帧画面出现短暂的黑屏。后来我加了一个复位逻辑,确保编码器从平衡状态开始工作,问题就解决了。

2.4 最小化传输差分信号

TMDS的全称是Transition Minimized Differential Signaling,翻译过来就是“最小化传输差分信号”。这个名字其实暴露了它的核心思想:减少跳变。

为什么要减少跳变?因为跳变会产生电磁辐射(EMI)。跳变越多,辐射越强,对周围电路的干扰就越大。

TMDS的做法是:在编码时,尽量让相邻位之间的跳变次数最少。具体来说:

  • 如果当前位与上一位相同,则保持
  • 如果不同,则尽量通过编码选择来避免跳变

我画了一张图,帮大家理解这个流程:

TMDS 8b/10b编码流程 8位数据 拆分 3b/4b编码 5b/6b编码 合并 DC平衡调整 10位数据 高3位 低5位 查表映射 拼接 取反/保持

从这张图可以看出,整个编码流程是流水线式的。数据先拆分,再分别编码,然后合并,最后做DC平衡调整。每一步都有明确的逻辑。

2.5 编码表与特殊字符

8b/10b编码除了传输数据,还能传输控制信号。TMDS定义了4个控制字符:

控制字符 含义 10位编码
CTL0 控制信号0 1101010100
CTL1 控制信号1 0010101011
CTL2 控制信号2 0101010100
CTL3 控制信号3 1010101011

这些控制字符在行消隐期和场消隐期传输,用于告诉接收端:接下来是数据还是控制信息。

避坑指南:我曾经在调试时,发现接收端偶尔会误把数据当成控制字符。后来查了协议才发现,控制字符的编码是精心挑选的,与任何数据编码都不冲突。但如果你自己实现编码器,一定要确保控制字符的优先级高于数据字符。

2.6 性能指标

最后,我们来看看8b/10b编码的几个关键指标:

  • 编码效率:8/10 = 80%,也就是说每传输10位,只有8位是有效数据
  • 最大连续相同位:不超过5位,保证时钟恢复
  • DC平衡精度:累积不平衡度不超过±2
  • 跳变密度:平均每10位有4-6次跳变

这些指标保证了TMDS在高速传输时的可靠性。我做过一个测试,在1.65Gbps的速率下,8b/10b编码的信号眼图非常清晰,误码率低于10^-12。

好了,这一章的内容就到这里。8b/10b编码是TMDS的基石,理解了它,后面讲链路层和物理层就容易多了。


可可精品资料库