威三电子  

               威三电子

HDMI数据的接收发送实验(十九)

2026-08-05 14:11:12

浏览:

一、    概况经过时钟的动态相位偏移后,此时的10bit数据已经正确。这10bit数据为并行数据(8位数据 + 2位编码信息)。需要对接收到的并行数据进行解码


一、    概况

经过时钟的动态相位偏移后,此时的10bit数据已经正确。这10bit数据为并行数据(8位数据 + 2位编码信息)。需要对接收到的并行数据进行解码,分离出控制信号和像素数据。本章节讲述如何对10比特数据解码,输出解码后的像素数据并产生行场同步信号。

二、实现10bit8bit

通过decode模块实现数据的解码。

模块接口列表:

信号名称

输入输出

位宽

备注

pixel_clk

input

1

像素时钟

rst_n

input

1

异步复位,低有效

i_par_dat

input

10

输入的并行数据(8位数据 + 2位编码信息)

de

output

1

数据有效标志(Data Enable

c0

output

1

行同步

c1

output

1

场同步

pixel_dat

output

8

解码后的像素数据

 

参数定义:

 

parameter CTRLTOKEN0 = 10'b1101010100; // 0x354 HSYNC 开始

parameter CTRLTOKEN1 = 10'b0010101011; // 0x0AB VSYNC 开始 

parameter CTRLTOKEN2 = 10'b0101010100; // 0x154 HSYNC 结束

parameter CTRLTOKEN3 = 10'b1010101011; // 0x2AB VSYNC 结束

这是典型的 MIPI DSI 长包(Long Packet)控制参数:

 

CTRLTOKEN0 (0x354)HSSHorizontal Sync Start

CTRLTOKEN1 (0x0AB)VSSVertical Sync Start

CTRLTOKEN2 (0x154)HSEHorizontal Sync End

CTRLTOKEN3 (0x2AB)VSEVertical Sync End

这四个参数共同实现显示时序的帧同步(VSYNC)和行同步(HSYNC)。

 

i_par_dat[9]表示极性。

 

判断极性:

 

i_par_dat[9] = 1(差分信号正极性),数据取反恢复

i_par_dat[9] = 0(差分信号负极性),数据直接使用

 

 

控制参数的译码真值表:

de 为高时,表示当前输出的是有效像素数据;de 为低时,c0/c1 编码当前的控制令牌类型。

参数

C1

C0

de

含义

CTRLTOKEN0

0

0

0

行同步开始

CTRLTOKEN1

0

1

0

场同步开始

CTRLTOKEN2

1

0

0

行同步结束

CTRLTOKEN3

1

1

0

场同步结束

default

------

------

1

有效像素

 

对于有效像素的解码部分计算如下:

i_par_dat[8]表示编码方式。

 

 

模块示例代码:

module             decode(

input    wire                    pixel_clk           ,

input    wire                    rst_n                  ,

input    wire[9:0]          i_par_dat         ,

 

output reg                      de                       ,

output reg                      c0                        ,

output reg                      c1                        ,

output reg[7:0]            pixel_dat                                     

);

//---------------

// Distinct Control Tokens

parameter CTRLTOKEN0 = 10'b1101010100; //354

parameter CTRLTOKEN1 = 10'b0010101011; //AB

parameter CTRLTOKEN2 = 10'b0101010100; //154

parameter CTRLTOKEN3 = 10'b1010101011; //2AB

 

wire [7:0] data;

 

assign data = (i_par_dat[9]) ? ~i_par_dat[7:0] :  i_par_dat[7:0];

 

always @ (posedge pixel_clk)

if(rst_n==1'b0) begin

                            c0 <=  1'b0;

                            c1 <=  1'b0;

                            de <=  1'b0;

                            pixel_dat<=0;

              end

else

case (i_par_dat)

CTRLTOKEN0: begin

                            c0 <=  1'b0;

                            c1 <=  1'b0;

                            de <=  1'b0;

              end

 

CTRLTOKEN1: begin

                            c0 <=  1'b1;

                            c1 <=  1'b0;

                            de <=  1'b0;

              end

 

CTRLTOKEN2: begin

                            c0 <=  1'b0;

                            c1 <=  1'b1;

                            de <=  1'b0;

              end

 

CTRLTOKEN3: begin

                            c0 <= 1'b1;

                            c1 <= 1'b1;

                            de <= 1'b0;

              end

 

default: begin

                            pixel_dat[0] <=  data[0];

                            pixel_dat[1] <=  (i_par_dat[8]) ? (data[1] ^ data[0]) : (data[1] ~^ data[0]);

                            pixel_dat[2] <=  (i_par_dat[8]) ? (data[2] ^ data[1]) : (data[2] ~^ data[1]);

                            pixel_dat[3] <=  (i_par_dat[8]) ? (data[3] ^ data[2]) : (data[3] ~^ data[2]);

                            pixel_dat[4] <=  (i_par_dat[8]) ? (data[4] ^ data[3]) : (data[4] ~^ data[3]);

                            pixel_dat[5] <=  (i_par_dat[8]) ? (data[5] ^ data[4]) : (data[5] ~^ data[4]);

                            pixel_dat[6] <=  (i_par_dat[8]) ? (data[6] ^ data[5]) : (data[6] ~^ data[5]);

                            pixel_dat[7] <=  (i_par_dat[8]) ? (data[7] ^ data[6]) : (data[7] ~^ data[6]);

                            de <=  1'b1;

              end                                                                     

endcase

endmodule

 

 

三、          总结

本章节讲述了对接收到的10bit信号转换成8bit像素数据的过程。下一章节讲述如何通过行场同步信号和数据有效信号来计算像素。

 

本文章由威三学院出品

对课程感兴趣可以私信联系

0
HDMI数据的接收发送实验(十九)
一、    概况经过时钟的动态相位偏移后,此时的10bit数据已经正确。这10bit数据为并行数据(8位数据 + 2位编码信息)。需要对接收到的并行数据进行解码
长按图片保存/分享

北京威三电子科技有限公司

突破技术壁垒,芯创智联领航未来

 


北京威三电子科技有限公司 版权所有
京ICP备2026012969号
 

热线:

159-2199-9232

 

图片展示

淘宝店铺:

威三科教

地址:

北京市延庆区辰龙国际6号楼406室

微信公众号:

北京威三电子科技有限公司 

热线:159-2199-9232

淘宝店铺:威三科教

地址:北京市延庆区辰龙国际6号楼406


微信公众号

图片展示
北京威三电子科技有限公司 版权所有| 京ICP备2026012969号
微信公众号
客服中心
热线电话
15921999232
上班时间
周一到周五
二维码
扫码关注
客服中心
热线电话
15921999232
上班时间
周一到周五
二维码
扫码关注
添加微信好友,详细了解产品
使用企业微信
“扫一扫”加入群聊
复制成功!
添加微信好友,详细了解产品
我知道了