一、 概况
经过时钟的动态相位偏移后,此时的10bit数据已经正确。这10bit数据为并行数据(8位数据 + 2位编码信息)。需要对接收到的并行数据进行解码,分离出控制信号和像素数据。本章节讲述如何对10比特数据解码,输出解码后的像素数据并产生行场同步信号。
二、实现10bit转8bit
通过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):HSS(Horizontal Sync Start)
CTRLTOKEN1 (0x0AB):VSS(Vertical Sync Start)
CTRLTOKEN2 (0x154):HSE(Horizontal Sync End)
CTRLTOKEN3 (0x2AB):VSE(Vertical 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像素数据的过程。下一章节讲述如何通过行场同步信号和数据有效信号来计算像素。
本文章由威三学院出品
对课程感兴趣可以私信联系

京公网安备11022902000513号
