TMDS简介
HDMI和DVI协议使用TMDS作为它们的物理层。支持高达225MHz的传输速率,一个传输链路能满足高达2048*1536分辨率电视信号。一般来说,一个HDMI/DVI接口包含四个TMDS通道,三条数据通道和一条时钟通道,每条通道采用差分电平传输,即一条通道要2根线,正极和负极。TMDS编解码算法可以使得被传输信号过渡过程的上冲和下冲减小,传输的数据趋于直流平衡,使信号对传输线的电磁干扰减少,提高信号传输的速度和可靠性。
TMDS编码
需要解释以下几点:
图中cnt(t)表示这一次的cnt值,cnt(t-1)表示上一次的cnt值,用一个变量cnt表示就可以了,这一次开头读取cnt值,读到的是上一次的,这一次最后给cnt赋新值,给下一次用,cnt初始值为0。
q_out[9]表示q_out[0:7]与q_m[0:7]的关系,q_out[9]==1表示q_out[0:7] = ~q_m[0:7],q_out[9]==0表示q_out[0:7] = q_m[0:7]
q_out[8]表示q_m[0:7]是用什么方式产生的,q_out[8]==1表示q_m[0:7]是用XOR方式产生的,q_out[8]==0表示q_m[0:7]是用XNOR方式产生的,q_out[8]永远等于q_m[8]
- 首先,它会根据输入的8bit数据中1的个数来决定中间值q_m的产生方式,这里大概是为了满足最后输出数据的跳变次数要求。对于输入8bit像素数据,其输出的10bit数据中0-1或1-0的跳变次数要小于5次;对于输入控制数据,其输出的10bit数据中0-1或1-0的跳变次数要大于等于7次。
- 然后,它根据上一次记录的cnt值(该值表示了上次输出的10bit数据中1的个数比0的个数多几个,最高位为符号位,取值范围为-7~7)和本次生成的中间值的0、1个数比,来决定输出的10bit数据q_out与中间值的关系。大致思路如下:上一次输出1的个数偏多了,这一次如果中间值还是1多,那么把中间值每个位取反,这一次如果中间值还是0多,那么照常输出,保证这一次的输出可以补偿上一次的不足,已达到直流平衡。
- 最后,它会计算这一次输出的10bit数据中1比0多了几个,存到变量cnt中。
TMDS解码
解码流程要比编码流程简单太多了,因为D[9]即q_out[9],D[8]即q_out[8],这两位完整地反映了此次10bit数据是怎么被编码的,只要检测这两位,然后逆着编码方式执行就能还原出原始的8bit数据,不多说了。