asp网站 证书,seo网站推广的目的包括哪个方面,企业小程序建设的公司,有经验的永州网站建设因为使用的是DDR进行传输#xff0c;即双倍频率采样#xff0c;故时钟只用是并行数据数据的5倍#xff0c;而不是10倍。 TMDS算法流程#xff1a; 视频编码TMDS算法流程实现#xff1a;
timescale 1 ps / 1ps
//DVI编码通常用于视频传输#xff0c;将并行数据转换为适合… 因为使用的是DDR进行传输即双倍频率采样故时钟只用是并行数据数据的5倍而不是10倍。 TMDS算法流程 视频编码TMDS算法流程实现
timescale 1 ps / 1ps
//DVI编码通常用于视频传输将并行数据转换为适合串行传输的格式。
module dvi_encoder (input clkin, // pixel clock inputinput rstin, // async. reset input (active high)input [7:0] din, // data inputs: expect registeredinput c0, // c0 inputinput c1, // c1 input;c0 和 c1 用于指示视频的**水平同步HSYNC和垂直同步VSYNC**信号。input de, // de inputoutput reg [9:0] dout // data outputs
);// Counting number of 1s and 0s for each incoming pixel
// component. Pipe line the result.
// Register Data Input so it matches the pipe lined adder
// outputreg [3:0] n1d; //number of 1s in din
reg [7:0] din_q;//计算像素数据中“1”的个数
always (posedge clkin) beginn1d #1 din[0] din[1] din[2] din[3] din[4] din[5] din[6] din[7];din_q #1 din;
end///
// Stage 1: 8 bit - 9 bit
// Refer to DVI 1.0 Specification, page 29, Figure 3-5
///
wire decision1;//decision1 为真表示需要反转数据。
assign decision1 (n1d 4h4) | ((n1d 4h4) (din_q[0] 1b0));wire [8:0] q_m;
assign q_m[0] din_q[0];
assign q_m[1] (decision1) ? (q_m[0] ^~ din_q[1]) : (q_m[0] ^ din_q[1]);
assign q_m[2] (decision1) ? (q_m[1] ^~ din_q[2]) : (q_m[1] ^ din_q[2]);
assign q_m[3] (decision1) ? (q_m[2] ^~ din_q[3]) : (q_m[2] ^ din_q[3]);
assign q_m[4] (decision1) ? (q_m[3] ^~ din_q[4]) : (q_m[3] ^ din_q[4]);
assign q_m[5] (decision1) ? (q_m[4] ^~ din_q[5]) : (q_m[4] ^ din_q[5]);
assign q_m[6] (decision1) ? (q_m[5] ^~ din_q[6]) : (q_m[5] ^ din_q[6]);
assign q_m[7] (decision1) ? (q_m[6] ^~ din_q[7]) : (q_m[6] ^ din_q[7]);
assign q_m[8] (decision1) ? 1b0 : 1b1; //第9位 q_m[8] 用于指示数据是否被反转,0是数据被反转/
// Stage 2: 9 bit - 10 bit
// Refer to DVI 1.0 Specification, page 29, Figure 3-5
/
//计算1和0的个数
reg [3:0] n1q_m, n0q_m; // number of 1s and 0s for q_m
always (posedge clkin) beginn1q_m #1 q_m[0] q_m[1] q_m[2] q_m[3] q_m[4] q_m[5] q_m[6] q_m[7];n0q_m #1 4h8 - (q_m[0] q_m[1] q_m[2] q_m[3] q_m[4] q_m[5] q_m[6] q_m[7]);
end//控制令牌Control Tokens用于在视频的消隐期Blanking Period传输同步信息。
//这些控制令牌是10位的固定编码值用于表示视频的**水平同步HSYNC和垂直同步VSYNC**信号
parameter CTRLTOKEN0 10b1101010100;
parameter CTRLTOKEN1 10b0010101011;
parameter CTRLTOKEN2 10b0101010100;
parameter CTRLTOKEN3 10b1010101011;/*
差异计数器Disparity Counter在TMDS编码中差异计数器用于跟踪当前信号的直流偏差DC Disparity。直流偏差是指信号中1和0的数量之差。通过调整编码方式如反转数据差异计数器可以帮助实现直流平衡减少信号的直流分量。最高位是符号位MSB is the sign bit
差异计数器的最高位MSB表示偏差的方向如果最高位为 0表示偏差为负即0的数量多于1。如果最高位为 1表示偏差为正即1的数量多于0。其余位表示偏差的大小。
*/
reg [4:0] cnt; //disparity counter, MSB is the sign bit
wire decision2, decision3;assign decision2 (cnt 5h0) | (n1q_m n0q_m); //1和0的数量相等
/
// [(cnt 0) and (N1q_m N0q_m)] or [(cnt 0) and (N0q_m N1q_m)]
/
assign decision3 (~cnt[4] (n1q_m n0q_m)) | (cnt[4] (n0q_m n1q_m));//即cnt[4]0 cnt[4]1// pipe line alignmentreg de_q, de_reg;
reg c0_q, c1_q;
reg c0_reg, c1_reg;
reg [8:0] q_m_reg;always (posedge clkin) beginde_q #1 de;de_reg #1 de_q;c0_q #1 c0;c0_reg #1 c0_q;c1_q #1 c1;c1_reg #1 c1_q;q_m_reg #1 q_m;
end///
// 10-bit out
// disparity counter
///
always (posedge clkin or posedge rstin) beginif(rstin) begindout 10h0;cnt 5h0;end else beginif (de_reg) beginif(decision2) begindout[9] #1 ~q_m_reg[8]; dout[8] #1 q_m_reg[8]; dout[7:0] #1 (q_m_reg[8]) ? q_m_reg[7:0] : ~q_m_reg[7:0];cnt #1 (~q_m_reg[8]) ? (cnt n0q_m - n1q_m) : (cnt n1q_m - n0q_m); //第一个cnt代表当前cnt值后面两个cnt代表上一次执行时的值end else beginif(decision3) begindout[9] #1 1b1;dout[8] #1 q_m_reg[8];dout[7:0] #1 ~q_m_reg[7:0];cnt #1 cnt {q_m_reg[8], 1b0} (n0q_m - n1q_m);end else begindout[9] #1 1b0;dout[8] #1 q_m_reg[8];dout[7:0] #1 q_m_reg[7:0];cnt #1 cnt - {~q_m_reg[8], 1b0} (n1q_m - n0q_m);endendend else begincase ({c1_reg, c0_reg}) //进入消隐期2b00: dout #1 CTRLTOKEN0;2b01: dout #1 CTRLTOKEN1;2b10: dout #1 CTRLTOKEN2;default: dout #1 CTRLTOKEN3;endcasecnt #1 5h0;endend
endendmodule
解码使用xilinx原语serdes进行并转串serdes分为master和slave模式其中的master使用的是8bit数据另外带两个bit的扩展位放在了slave中。 参考正点原子