标签:sync 分离 ssi put vip sig *** 像素 code
CVO输出如果是一个像素并行输出,选择内嵌人插入同步码。如果两个像素并行输出是不能选择内嵌的,只能选择分离的方式。如果把输出的并行数据给VIP并且要求是内嵌,那只能在内部转或者外部转。
这里是实现外部转换的方式。
程序是比较简单的,只是防止以后找不到程序反复得写而已。
实现过程是:
1、先把两个像素转换成一个像素
module sym2_2_sym1( input clk_i, input [1:0] h_sync_i, input [1:0] v_sync_i, input [1:0] de_i, input [31:0] vin, input clk_o, output h_sync_o, output v_sync_o, output [15:0] vout ); reg de_i_r = 1‘b0; reg cnt = 1‘b0; reg [31:0] din_r = 32‘d0; reg [1:0] h_sync_i_r = 2‘b00; reg [1:0] v_sync_i_r = 2‘b00; reg h_sync_r =0; reg v_sync_r = 0; reg [15:0] vout_r =0; /********************************************************* 检测de信号上升沿,用于指示每行第一个有效数据 **********************************************************/ always @( posedge clk_o ) begin de_i_r <= de_i[0]; end wire pos_de = ({de_i_r,de_i[0] } == 2‘b01 ); always @( posedge clk_o ) begin cnt <= pos_de ? 0 : ~cnt; end /********************************************************* 由于de上升沿延时一个时钟周期,所以对数据也延时一个时钟周期 **********************************************************/ always @( posedge clk_o ) begin din_r <= vin; h_sync_i_r <= h_sync_i; v_sync_i_r <= v_sync_i; end /********************************************************* 2转1 **********************************************************/ always @( posedge clk_o ) begin vout_r <= cnt ? din_r[31:16] : din_r[15:0]; h_sync_r <= cnt ? h_sync_i_r[1]: h_sync_i_r[0]; v_sync_r <= cnt ? v_sync_i_r[1] : v_sync_i_r[0]; end assign h_sync_o = h_sync_r; assign v_sync_o = v_sync_r; assign vout = vout_r; endmodule
2、在像素中插入同步码
module seperate_2_embeded( input clk, input h_sync,//低电平有效 input v_sync,//低电平为有效区间 input f_sync, input [9:0] h_black_len, input [15:0] vin, output [15:0] vout ); reg [5:0] h_r = 0; reg [5:0] v_r = 0; reg [15:0] vin_r1 = 0; reg [15:0] vin_r2 = 0; reg [15:0] vout_r = 0; (*keep*)reg [3:0] cnt = 0; wire [9:0] xyz ; wire black_len_m4; reg black_len_m4_dly = 1‘b0; /************************************************************************ 把行消隐区间的长度去掉4个 ************************************************************************/ always @( posedge clk ) begin h_r <= {h_r[4:0],h_sync}; v_r <= {v_r[4:0],v_sync}; end assign black_len_m4 = h_r[3] & h_sync; /************************************************************************ 找到上升沿与下降沿,即SAV与EAV的位置 ************************************************************************/ always @( posedge clk ) begin black_len_m4_dly <= black_len_m4; end assign pos_black_len_m4 = {black_len_m4_dly,black_len_m4} == 2‘b01; assign neg_black_len_m4 = {black_len_m4_dly,black_len_m4} == 2‘b10; /************************************************************************ 在SAV 和EAV位置计数 ************************************************************************/ always @( posedge clk ) begin if( pos_black_len_m4 | neg_black_len_m4 ) cnt <= 0; else if( cnt == 5 ) cnt <= cnt; else cnt <= cnt + 1‘b1; end always @( posedge clk ) begin case( cnt ) 4‘h0 : vout_r <= 16‘hffff; 4‘h1 : vout_r <= 16‘h0000; 4‘h2 : vout_r <= 16‘h0000; 4‘h3 : vout_r <= {2{xyz[9:2]}}; default:vout_r <= data[4]; endcase end reg[15:0] data[4:0]; reg [2:0] i; generate // genvar i; always @( posedge clk ) begin for(i = 0;i <= 3;i= i + 1) data[i+1] <= data[i]; end endgenerate always @( posedge clk ) begin data[0] <= vin; end assign xyz = calc_xyz({1‘b0,v_r[0],h_r[0]}); assign vout = vout_r; function [9:0] calc_xyz; input [2:0] FVH; case (FVH) 3‘b000 : calc_xyz = 10‘h200; 3‘b001 : calc_xyz = 10‘h274; 3‘b010 : calc_xyz = 10‘h2ac; 3‘b011 : calc_xyz = 10‘h2d8; 3‘b100 : calc_xyz = 10‘h31c; 3‘b101 : calc_xyz = 10‘h368; 3‘b110 : calc_xyz = 10‘h3b0; 3‘b111 : calc_xyz = 10‘h3c4; endcase endfunction endmodule
标签:sync 分离 ssi put vip sig *** 像素 code
原文地址:https://www.cnblogs.com/zhongguo135/p/8847317.html