码迷,mamicode.com
首页 > 其他好文 > 详细

实现两个sym转一个sym

时间:2018-04-15 14:53:13      阅读:163      评论:0      收藏:0      [点我收藏+]

标签: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 = 1b0;
    reg cnt = 1b0;
  reg [31:0] din_r = 32d0;
  reg [1:0] h_sync_i_r = 2b00;
  reg [1:0] v_sync_i_r = 2b00; 
  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] } == 2b01 );
    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 = 1b0;
/************************************************************************
把行消隐区间的长度去掉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} == 2b01;
    assign neg_black_len_m4 = {black_len_m4_dly,black_len_m4} == 2b10;
/************************************************************************
在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 + 1b1;
    end   
    

    always @( posedge clk )
    begin
            case( cnt )
            4h0 :
                    vout_r <= 16hffff;
            4h1 : 
                    vout_r <= 16h0000;
            4h2 :
                    vout_r <= 16h0000;
            4h3 :
                    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({1b0,v_r[0],h_r[0]});
assign vout = vout_r;
function [9:0] calc_xyz;
  input [2:0] FVH;
  case (FVH)
    3b000 : calc_xyz = 10h200;
    3b001 : calc_xyz = 10h274;
    3b010 : calc_xyz = 10h2ac;
    3b011 : calc_xyz = 10h2d8;
    3b100 : calc_xyz = 10h31c;
    3b101 : calc_xyz = 10h368;
    3b110 : calc_xyz = 10h3b0;
    3b111 : calc_xyz = 10h3c4;
  endcase
endfunction






endmodule

 

实现两个sym转一个sym

标签:sync   分离   ssi   put   vip   sig   ***   像素   code   

原文地址:https://www.cnblogs.com/zhongguo135/p/8847317.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!