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的做法是:在编码时,尽量让相邻位之间的跳变次数最少。具体来说:
- 如果当前位与上一位相同,则保持
- 如果不同,则尽量通过编码选择来避免跳变
我画了一张图,帮大家理解这个流程:
从这张图可以看出,整个编码流程是流水线式的。数据先拆分,再分别编码,然后合并,最后做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的基石,理解了它,后面讲链路层和物理层就容易多了。
可可精品资料库