1. TMDS信号基础:HDMI/DVI接口标准概述、TMDS编码原理、直流平衡概念
各位同学好,我是老张。做FPGA视频接口这块有些年头了,今天咱们聊聊TMDS信号的基础。说实话,刚入行那会儿我也被这玩意儿搞得一头雾水,后来踩了不少坑才慢慢摸清楚门道。
1.1 HDMI与DVI接口标准概述
先说说这两个接口的关系。DVI是Digital Visual Interface的缩写,最早是1999年由DDWG组织推出的。HDMI则是High-Definition Multimedia Interface,2002年才出来。说白了,HDMI就是在DVI基础上加了音频传输和更小的连接器。
我做过一个项目,客户要求同时支持DVI和HDMI输入。当时我就在想,能不能共用一套解码逻辑?答案是肯定的。因为它们的物理层都是TMDS,区别主要在协议层。嗯,这里要注意,DVI只有视频通道,HDMI多了音频和数据包通道。
核心要点:
- DVI只传视频,HDMI可以同时传视频+音频+控制信号
- 两者物理层完全兼容TMDS,解码电路可以复用
- HDMI的TMDS时钟频率最高可达340MHz(HDMI 1.4)
- DVI单链路最高165MHz,双链路可以到330MHz
1.2 TMDS编码原理
TMDS全称是Transition Minimized Differential Signaling,翻译过来就是「最小化转换差分信号」。名字挺长,但核心思想很简单:减少信号跳变次数,降低电磁干扰。
为什么会这样?你想想看,如果原始数据里连续出现01010101这种模式,信号线就会不停地跳变,产生大量高频分量。TMDS编码就是要把8位数据变成10位,让跳变次数尽可能少。
编码过程分两步走:
- 第一步:选择编码方式
- 如果数据中1的个数太多(超过4个),或者0和1个数相等但最后一位是0,就取反
- 否则保持原样
- 第二步:添加直流平衡位
- 根据当前编码器的直流偏移状态,决定第10位是0还是1
- 目的是让长期来看,0和1的数量尽量相等
我习惯用一张图来理解这个过程:
实战小技巧:
我在调试TMDS解码时,习惯先用逻辑分析仪抓一下原始10位数据。看看有没有连续的0000000000或1111111111出现。如果有,说明编码器可能有问题。正常TMDS信号里,连续相同位的长度不会超过5个。
1.3 直流平衡概念
直流平衡,英文叫DC Balance。这个概念在高速串行传输里特别重要。说白了,就是让信号的平均电平保持稳定,不偏向高电平也不偏向低电平。
为什么需要直流平衡?我举个例子。有一次我在做一块HDMI采集卡,发现画面时不时出现横纹。查了半天,原来是接收端的AC耦合电容在作怪。如果信号直流分量不平衡,电容就会慢慢充电,导致信号电平漂移,最终误码。
TMDS的直流平衡机制是这样的:
| 参数 | 含义 | 我的经验 |
|---|---|---|
| disparity | 当前编码的偏移量(1比0多几个) | 范围在-4到+4之间,超出就要警惕 |
| running disparity | 累计偏移量,从复位开始累加 | 理想情况是0,实际会在±2之间摆动 |
| DC balance | 长期来看0和1数量相等 | 这是保证信号质量的关键 |
编码器内部维护一个计数器,叫running disparity。每发一个10位码字,就计算这个码字里1比0多几个(或者少几个),然后累加到计数器上。如果当前计数器为正,就选择让1变少的编码;如果为负,就选择让1变多的编码。这样来回调整,就能保证长期直流平衡。
注意:
我曾经遇到过一个坑:FPGA复位后,TMDS接收端的running disparity没有正确初始化。结果前几个像素的解码全是错的,画面顶部出现一条彩色条纹。后来我加了一个同步头检测逻辑,在检测到DE信号上升沿时强制复位disparity计数器,问题就解决了。
1.4 特殊字符与编码表
TMDS除了传视频数据,还要传控制信号和同步信号。这些都有固定的编码:
- 视频数据:经过8b/10b编码,DE为高时传输
- 控制信号:DE为低时传输,有固定4种编码
- 同步信号:HSYNC和VSYNC嵌入在控制信号中
控制信号的编码很简单:
| C0 | C1 | TMDS编码 |
|---|---|---|
| 0 | 0 | 1101010100 |
| 0 | 1 | 0010101011 |
| 1 | 0 | 0101010100 |
| 1 | 1 | 1010101011 |
你看,控制信号的编码里0和1的数量差都是2,而且跳变次数很少。这就是TMDS设计的精妙之处——不管传什么数据,信号质量都有保障。
好了,TMDS信号基础就讲到这里。这些概念看着简单,但实际做项目时处处都能用上。下一节咱们聊聊怎么用FPGA实现TMDS解码器,到时候我会分享一些具体的Verilog代码和调试技巧。
可可精品资料库