HDMI接口介绍及TMDS编码

HDMI的A型引脚解析

HDMI接口介绍及TMDS编码_第1张图片

引脚 1 3 5 7 9 11 13 15 17 19
数据2+ 数据2- 数据1屏蔽 数据0+ 数据0- 时钟屏蔽 CEC SCL DDC/CEC地 热插拔检测
引脚 2 4 6 8 10 12 14 16 18
数据2屏蔽 数据1+ 数据1- 数据0屏蔽 时钟+ 时钟- 保留 SDA +5V

HDMI数据传输解析

将BGR888格式的原来8位并行颜色数据,通过TMDS编码为10位的串行颜色数据进行输出
HDMI接口介绍及TMDS编码_第2张图片

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; // 消隐区C1,C0都为00

    ​    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]} );

你可能感兴趣的:(FPGA技术,硬件工程,fpga开发)