HDMI接口介绍及TMDS编码

HDMI的A型引脚解析

请添加图片描述

引脚135791113151719
数据2+数据2-数据1屏蔽数据0+数据0-时钟屏蔽CECSCLDDC/CEC地热插拔检测
引脚24681012141618
数据2屏蔽数据1+数据1-数据0屏蔽时钟+时钟-保留SDA+5V

HDMI数据传输解析

将BGR888格式的原来8位并行颜色数据,通过TMDS编码为10位的串行颜色数据进行输出
在这里插入图片描述

TMDS编码

D[0:7] :8位原始数据

q_m[0:7] :8位原始数据进行XNOR编码或XOR编码后的结果

q_out[0:9]:TMDS编码最后的输出结果,其中q_out[0:7]为8位原始数据最后的编码结果

q_out[8]为编码方式标志位 1:异或编码方式 0:同或编码方式

q_out[9]平衡编码中0和1的个数

C1 :场同步信号,低电平有效
C0 :行同步信号,低电平有效

Cnt(t-1) :前t-1个数据当中,前8bit数据1的个数 - 前8bit数据0的个数,数值只在数据有效区变化,消隐区会被置0

N1{q_m[0:7]} :q_m[0:7]的8位数据中1的个数,N0{q_m[0:7]}同理

一、对原始数据D[0:7] 进行编码

判断条件:( N1{D} > 4 ) || ( N1{D} == 4 && D[0] == 0 )

如果数据D[0:7]中1的个数大于4或者1的个数等于4且D[0]等于0,进入同或(XNOR)编码方式,否则进入异或(XOR)编码方式

  • 判断成立:
// 同或(XNOR)编码方式						
											
q_m[0] = D[0];    							
											
q_m[1] = q_m[0] XNOR D[1];  				
											
q_m[2] = q_m[1] XNOR D[2];							
											
q_m[3] = q_m[2] XNOR D[3];						
											
q_m[4] = q_m[3] XNOR D[4];						
											
q_m[5] = q_m[4] XNOR D[5];						
											
q_m[6] = q_m[5] XNOR D[6];						
											
q_m[7] = q_m[6] XNOR D[7];						
											
q_m[8] = 0; /* D[0:7]中1多 */						
  • 判断不成立:
// 异或(XOR)编码方式

q_m[0] = D[0];           

q_m[1] = q_m[0] XOR D[1];

q_m[2] = q_m[1] XOR D[2];	
				
q_m[3] = q_m[2] XOR D[3];	
			
q_m[4] = q_m[3] XOR D[4];	
		
q_m[5] = q_m[4] XOR D[5];	
		
q_m[6] = q_m[5] XOR D[6];	
			
q_m[7] = q_m[6] XOR D[7];	
				
q_m[8] = 1; /* D[0:7]中0多 */	

二、判断是否对行场同步信号进行编码

判断条件:( DE == LOW )

  • 判断成立:如果DE为低通过判断C1,C0从而对行场同步信号(控制信号)进行编码,输出数据为q_out[0:9]
Cnt(t) = 0;

case(C1,C0)

    ​    00: q_out[0:9] = 0010101011; // 行场同步

    ​    01: q_out[0:9] = 1101010100; // 场同步

    ​    10: q_out[0:9] = 0010101010; // 行同步

    ​    11: q_out[0:9] = 1101010101; // 非行同步非场同步

endcase
  • 判断不成立:如果DE为高进入第三步对q_m[0:7]进行编码生成输出编码q_out[0:9]

三、对q_m[0:7]进行编码生成输出编码q_out[0:9]

判断条件:( Cnt(t-1) == 0 ) || ( N1{q_m[0:7]} == N0{q_m[0:7]} )

  • 判断成立:如果编码过程中1和0的总数量相等或者当前编码的1和0的数量相等
q_out[9]   = ~q_m[8];   

q_out[8]   =  q_m[8];   // 编码方式标志位不变

q_out[0:7] = q_m[8] ? q_m[0:7] : ~q_m[0:7];

// q_m[8]=0时,上一步对q_out取反了,所以是q_m[0:7]中0的个数减去1的个数,相当于现在q_out[0:7]中1的个数减去0的个数;q_m[8]=1时,同理
Cnt(t)     = q_m[8] ? ( Cnt(t-1) + (N1{q_m[0:7]} - N0{q_m[0:7]}) ) : ( Cnt(t-1) + (N0{q_m[0:7]} - N1{q_m[0:7]}) );

  • 判断不成立:如果每次编码的1和0的数量不相等当前编码的1和0的数量不相等
  1. 如果( Cnt(t-1) > 0 && N1{q_m[0:7]} > N0{q_m[0:7]} ) || ( Cnt(t-1) < 0 && N0{q_m[0:7]} > N1{q_m[0:7]} )成立,既**( 编码过程中1的总数量大于0的总数量且当前编码的1的数量大于0的数量 )** 或者 ( 编码过程中1的总数量小于0的总数量且当前编码的1的数量小于0的数量 )
q_out[9] = 1;

q_out[8] = q_m[8];

q_out[0:7] = ~q_m[0:7];

Cnt(t) = Cnt(t-1) + 2*q_m[8] + ( N0{q_m[0:7]} - N1{q_m[0:7]} );
  1. 如果( Cnt(t-1) > 0 && N1{q_m[0:7]} > N0{q_m[0:7]} ) || ( Cnt(t-1) < 0 && N0{q_m[0:7]} > N1{q_m[0:7]} )不成立
q_out[9] = 0;

q_out[8] = q_m[8];

q_out[0:7] = q_m[0:7];

Cnt(t) = Cnt(t-1) + 2*(~q_m[8]) + ( N1{q_m[0:7]} - N0{q_m[0:7]} );
  • 24
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值