FPGA Player

好记性不如烂笔头

导航

实现两个sym转一个sym

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

 

posted on 2018-04-15 13:50  中国的孩子  阅读(417)  评论(0编辑  收藏  举报