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. 第一步:选择编码方式
    • 如果数据中1的个数太多(超过4个),或者0和1个数相等但最后一位是0,就取反
    • 否则保持原样
  2. 第二步:添加直流平衡位
    • 根据当前编码器的直流偏移状态,决定第10位是0还是1
    • 目的是让长期来看,0和1的数量尽量相等

我习惯用一张图来理解这个过程:

TMDS编码流程 8位数据 D[7:0] 第一步:编码选择 判断1的个数 决定是否取反 9位数据 q_out[8:0] 第二步:直流平衡 计算偏移量 添加第10位 10位数据 TMDS[9:0] 编码效率:8/10 = 80%,额外20%开销用于降低EMI和保证直流平衡 控制信号 C0, C1 控制信号有固定编码 不经过上述流程

实战小技巧:

我在调试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编码
001101010100
010010101011
100101010100
111010101011

你看,控制信号的编码里0和1的数量差都是2,而且跳变次数很少。这就是TMDS设计的精妙之处——不管传什么数据,信号质量都有保障。

好了,TMDS信号基础就讲到这里。这些概念看着简单,但实际做项目时处处都能用上。下一节咱们聊聊怎么用FPGA实现TMDS解码器,到时候我会分享一些具体的Verilog代码和调试技巧。


可可精品资料库