赞
踩
一、video_display模块
通过像素点坐标,来规定显示的内容,像素点坐标由驱动模块根据时钟及行场计数来动态改变。
二、video_driver模块
行计数和场计数
//行计数器对像素时钟计数 always @(posedge pixel_clk ) begin if (!sys_rst_n) cnt_h <= 11'd0; else begin if(cnt_h < H_TOTAL - 1'b1) cnt_h <= cnt_h + 1'b1; else cnt_h <= 11'd0; end end //场计数器对行计数 always @(posedge pixel_clk ) begin if (!sys_rst_n) cnt_v <= 11'd0; else if(cnt_h == H_TOTAL - 1'b1) begin if(cnt_v < V_TOTAL - 1'b1) cnt_v <= cnt_v + 1'b1; else cnt_v <= 11'd0; end end
行场同步信号:
- assign video_hs = ( cnt_h < H_SYNC ) ? 1'b0 : 1'b1; //行同步信号赋值
- assign video_vs = ( cnt_v < V_SYNC ) ? 1'b0 : 1'b1; //场同步信号赋值
使能信号(在有效显示区间内为1):
- //使能RGB数据输出
- assign video_en = (((cnt_h >= H_SYNC+H_BACK) && (cnt_h < H_SYNC+H_BACK+H_DISP))
- &&((cnt_v >= V_SYNC+V_BACK) && (cnt_v < V_SYNC+V_BACK+V_DISP)))
- ? 1'b1 : 1'b0;
像素点坐标:
- //请求像素点颜色数据输入
- assign data_req = (((cnt_h >= H_SYNC+H_BACK-1'b1) &&
- (cnt_h < H_SYNC+H_BACK+H_DISP-1'b1))
- && ((cnt_v >= V_SYNC+V_BACK) && (cnt_v < V_SYNC+V_BACK+V_DISP)))
- ? 1'b1 : 1'b0;
-
- //像素点坐标
- assign pixel_xpos = data_req ? (cnt_h - (H_SYNC + H_BACK - 1'b1)) : 11'd0;
- assign pixel_ypos = data_req ? (cnt_v - (V_SYNC + V_BACK - 1'b1)) : 11'd0;
data_req提前请求一排所以减一。
RGB数据输出:
- //RGB888数据输出
- assign video_rgb = video_en ? pixel_data : 24'd0;
三、dvi_transmitter_top
异步复位,同步释放:
module asyn_rst_syn( input clk, //目的时钟域 input reset_n, //异步复位,低有效 output syn_reset //高有效 ); reg reset_1; reg reset_2; assign syn_reset = reset_2; //对异步复位信号进行同步释放,并转换成高有效 always @ (posedge clk or negedge reset_n) begin if(!reset_n) begin reset_1 <= 1'b1; reset_2 <= 1'b1; end else begin reset_1 <= 1'b0; reset_2 <= reset_1; end end endmodule
当reset信号为active的时候,寄存器立刻被复位,与时钟沿到来与否没有关系。用两级寄存器,是消除复位释放中可能存在的亚稳态。
异步复位的亚稳态:当异步复位信号的撤销时间在Trecovery(恢复时间)和Tremoval(移除时间)之间时,输出结果就会出现亚稳态,造成复位失败。
TMDS编码算法:
串转并:
module serializer_10_to_1( input reset, // 复位,高有效 input paralell_clk, // 输入并行数据时钟 input serial_clk_5x, // 输入串行数据时钟 input [9:0] paralell_data, // 输入并行数据 output serial_data_out // 输出串行数据 ); //wire define wire cascade1; //用于两个OSERDESE2级联的信号 wire cascade2; //***************************************************** //** main code //***************************************************** //例化OSERDESE2原语,实现并串转换,Master模式 OSERDESE2 #( .DATA_RATE_OQ ("DDR"), // 设置双倍数据速率 .DATA_RATE_TQ ("SDR"), // DDR, BUF, SDR .DATA_WIDTH (10), // 输入的并行数据宽度为10bit .SERDES_MODE ("MASTER"), // 设置为Master,用于10bit宽度扩展 .TBYTE_CTL ("FALSE"), // Enable tristate byte operation (FALSE, TRUE) .TBYTE_SRC ("FALSE"), // Tristate byte source (FALSE, TRUE) .TRISTATE_WIDTH (1) // 3-state converter width (1,4) ) OSERDESE2_Master ( .CLK (serial_clk_5x), // 串行数据时钟,5倍时钟频率 .CLKDIV (paralell_clk), // 并行数据时钟 .RST (reset), // 1-bit input: Reset .OCE (1'b1), // 1-bit input: Output data clock enable .OQ (serial_data_out), // 串行输出数据 .D1 (paralell_data[0]), // D1 - D8: 并行数据输入 .D2 (paralell_data[1]), .D3 (paralell_data[2]), .D4 (paralell_data[3]), .D5 (paralell_data[4]), .D6 (paralell_data[5]), .D7 (paralell_data[6]), .D8 (paralell_data[7]), .SHIFTIN1 (cascade1), // SHIFTIN1 用于位宽扩展 .SHIFTIN2 (cascade2), // SHIFTIN2 .SHIFTOUT1 (), // SHIFTOUT1: 用于位宽扩展 .SHIFTOUT2 (), // SHIFTOUT2 .OFB (), // 以下是未使用信号 .T1 (1'b0), .T2 (1'b0), .T3 (1'b0), .T4 (1'b0), .TBYTEIN (1'b0), .TCE (1'b0), .TBYTEOUT (), .TFB (), .TQ () ); //例化OSERDESE2原语,实现并串转换,Slave模式 OSERDESE2 #( .DATA_RATE_OQ ("DDR"), // 设置双倍数据速率 .DATA_RATE_TQ ("SDR"), // DDR, BUF, SDR .DATA_WIDTH (10), // 输入的并行数据宽度为10bit .SERDES_MODE ("SLAVE"), // 设置为Slave,用于10bit宽度扩展 .TBYTE_CTL ("FALSE"), // Enable tristate byte operation (FALSE, TRUE) .TBYTE_SRC ("FALSE"), // Tristate byte source (FALSE, TRUE) .TRISTATE_WIDTH (1) // 3-state converter width (1,4) ) OSERDESE2_Slave ( .CLK (serial_clk_5x), // 串行数据时钟,5倍时钟频率 .CLKDIV (paralell_clk), // 并行数据时钟 .RST (reset), // 1-bit input: Reset .OCE (1'b1), // 1-bit input: Output data clock enable .OQ (), // 串行输出数据 .D1 (1'b0), // D1 - D8: 并行数据输入 .D2 (1'b0), .D3 (paralell_data[8]), .D4 (paralell_data[9]), .D5 (1'b0), .D6 (1'b0), .D7 (1'b0), .D8 (1'b0), .SHIFTIN1 (), // SHIFTIN1 用于位宽扩展 .SHIFTIN2 (), // SHIFTIN2 .SHIFTOUT1 (cascade1), // SHIFTOUT1: 用于位宽扩展 .SHIFTOUT2 (cascade2), // SHIFTOUT2 .OFB (), // 以下是未使用信号 .T1 (1'b0), .T2 (1'b0), .T3 (1'b0), .T4 (1'b0), .TBYTEIN (1'b0), .TCE (1'b0), .TBYTEOUT (), .TFB (), .TQ () ); endmodule
serdes又可以分为iserdes与oserdes两个操作分别是串行转并行以及并行转串行。
串转并之后,产生差分信号:
//转换差分信号 OBUFDS #( .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS ) TMDS0 ( .I (tmds_data_serial[0]), .O (tmds_data_p[0]), .OB (tmds_data_n[0]) ); OBUFDS #( .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS ) TMDS1 ( .I (tmds_data_serial[1]), .O (tmds_data_p[1]), .OB (tmds_data_n[1]) ); OBUFDS #( .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS ) TMDS2 ( .I (tmds_data_serial[2]), .O (tmds_data_p[2]), .OB (tmds_data_n[2]) ); OBUFDS #( .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS ) TMDS3 ( .I (tmds_clk_serial), .O (tmds_clk_p), .OB (tmds_clk_n) );
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。