HDMI的A型引脚解析
引脚 | 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位的串行颜色数据进行输出
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的数量不相等
- 如果( 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]} );
- 如果( 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]} );