• 实现两个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

     

  • 相关阅读:
    Yii Framework 开发教程: 总结
    code first 如何创建索引字段
    Entity Framework 使用 Left Join
    如何查看IIS并发连接数
    c# List<int> 转 string 以及 string [] 转 List<int>
    linq中如何在join中指定多个条件
    关于学习的感悟
    c# 的访问修饰符是private 还是 internal?
    C# 与 .Net 3.5 高级程序设计(第四版) 读书笔记(一)
    解决Excel 提示向程序发送命令时出现错误
  • 原文地址:https://www.cnblogs.com/zhongguo135/p/8847317.html
Copyright © 2020-2023  润新知