uisrc 发表于 2023-12-29 19:13:58

2-3-24 TPG图像测试数据发生器设计

软件版本:VIVADO2021.1操作系统:WIN10 64bit硬件平台:适用XILINX A7/K7/Z7/ZU/KU系列FPGA登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!1 概述TPG(video_test_pattern generator) 视频测试模式发生器用于产生测试数据,对视频数据通路测试。2 TPG视频测试模式发生器2.1 系统框图I_tpg_ck:视频格式的像素时钟I_tpg_vs: 视频格式的场同步信号I_tpg_hs: 视频格式的行同步信号I_tpg_de: 视频格式的有效数据阶段
O_tpg_vs:同I_tpg_vsO_tpg_hs:同I_tpg_hsO_tpg_de:同I_tpg_deO_tpg_data:rgb格式数据输出

2.2 时序设计视频数据的有效区域如下图所示:视频数据在H_AcitiveSize和V_AcitiveSize同时有效时候有效3 TPG源码产生彩条、纯色、黑白棋方格测试数据,用于视频测试。
`timescale 1ns / 1ns//仿真时间刻度/精度
module uitpg(input         I_tpg_clk, //系统时钟input         I_tpg_rstn,//系统复位input         I_tpg_vs,//场同步输入input         I_tpg_hs,//行同步输入input         I_tpg_de,//视频数据有效输入output          O_tpg_vs,//场同步输出output          O_tpg_hs,//行同步输出output          O_tpg_de,//视频数据有效输出    output    O_tpg_data //有效测试数据);
reg         tpg_vs_r   = 1'b0; //对vs信号寄存reg         tpg_hs_r   = 1'b0; //对hs信号寄存reg grid_data= 8'd0; //grid棋方格寄存器reg color_bar= 24'd0;//RGB 彩条寄存器reg dis_mode   = 11'd0;//显示模式寄存器reg r_reg      = 8'd0; //红寄存器reg g_reg      = 8'd0; //绿寄存器reg b_reg      = 8'd0; //蓝寄存器
always @(posedge I_tpg_clk)begin    tpg_vs_r <= I_tpg_vs; //对vs信号寄存一次    tpg_hs_r <= I_tpg_hs; //对hs信号寄存一次end
reg v_cnt = 12'd0; //视频垂直方向,行计数器reg h_cnt = 12'd0; //视频水平方向,列计数器
//h_cnt计数器模块always @(posedge I_tpg_clk)    h_cnt <= I_tpg_de ? h_cnt + 1'b1 : 12'd0; //计数行有效像素,当de无效,重置 h_cnt=0
//v_cnt计数器模块always @(posedge I_tpg_clk)if(I_tpg_vs) //通过vs产生同步复位    v_cnt <= 12'd0; //重置v_cnt=0else    v_cnt <= ((!tpg_hs_r)&&I_tpg_hs) ? v_cnt + 1'b1 : v_cnt; //hs信号的上升沿,v_cnt计数,这种方式可以不管hs有效是高电平还是低电平的情况,v_cnt 视频垂直方向,行计数器,计数行数量
//显示模式切换always @(posedge I_tpg_clk)   if(I_tpg_rstn==1'b0)    dis_mode <= 0;   else    dis_mode <= ((!tpg_vs_r)&&I_tpg_vs) ? dis_mode + 1'b1 : dis_mode;
//grid_data发生器always @(posedge I_tpg_clk)begin    grid_data <= ((v_cnt==1'b1) ^ (h_cnt==1'b1)) ? 8'h00 : 8'hff; //方格大小16*16,黑白交替end
//RGB彩条发生器always @(posedge I_tpg_clk)begin    if(h_cnt==260)    color_bar   <=24'hff0000;//红    else if(h_cnt==420)    color_bar   <=24'h00ff00;//绿    else if(h_cnt==580)    color_bar   <=24'h0000ff;//蓝    else if(h_cnt==740)    color_bar   <=24'hff00ff;//紫    else if(h_cnt==900)    color_bar   <=24'hffff00;//黄    else if(h_cnt==1060)    color_bar   <=24'h00ffff;//青蓝    else if(h_cnt==1220)    color_bar   <=24'hffffff;//白    else if(h_cnt==1380)    color_bar   <=24'h000000;//黑    else    color_bar   <=color_bar;end
//测试图形输出always @(posedge I_tpg_clk)begin    case(dis_mode)//截取高位,控制切换显示速度      4'd0:begin            r_reg <= 0;            b_reg <= 0;            g_reg <= 0;      end      4'd1:begin            r_reg <= 8'b11111111;               //白            g_reg <= 8'b11111111;            b_reg <= 8'b11111111;      end      4'd2,4'd3:begin//连续两个状态输出相同图形            r_reg <= 8'b11111111;            //红            g_reg <= 0;            b_reg <= 0;      end                4'd4,4'd5:begin//连续两个状态输出相同图形            r_reg <= 0;                         //绿            g_reg <= 8'b11111111;            b_reg <= 0;      end                        4'd6:begin                r_reg <= 0;                         //蓝            g_reg <= 0;            b_reg <= 8'b11111111;      end      4'd7,4'd8:begin//连续两个状态输出相同图形            r_reg <= grid_data;               //方格            g_reg <= grid_data;            b_reg <= grid_data;      end                        4'd9:begin                r_reg <= h_cnt;                //水平渐变            g_reg <= h_cnt;            b_reg <= h_cnt;      end      4'd10,4'd11:begin //连续两个状态输出相同图形            r_reg <= v_cnt;               //垂直渐变            g_reg <= v_cnt;            b_reg <= v_cnt;      end      4'd12:begin                r_reg <= v_cnt;               //红垂直渐变            g_reg <= 0;            b_reg <= 0;      end      4'd13:begin                r_reg <= 0;                        //绿垂直渐变            g_reg <= h_cnt;            b_reg <= 0;      end      4'd14:begin                r_reg <= 0;                        //蓝垂直渐变            g_reg <= 0;            b_reg <= h_cnt;                  end      4'd15:begin                r_reg <= color_bar;         //彩条            g_reg <= color_bar;            b_reg <= color_bar;                  end                  endcaseend
assign O_tpg_data = {r_reg,g_reg,b_reg};//测试图形RGB数据输出assign O_tpg_vs = I_tpg_vs;//VS同步信号assign O_tpg_hs = I_tpg_hs;//HS同步信号assign O_tpg_de = I_tpg_de;//DE数据有效信号
endmodule


4 RTL仿真4.1 仿真激励文件
/*************视频测试仿真文件*************************************************************************************************************/
`timescale 1ns / 1ns//仿真时间刻度/精度
module video_test_tb;
localparam SYS_TIME = 20;//系统时钟周期10ns
reg I_vid_rstn,I_vid_clk;wire O_vid_vs,O_vid_hs,O_vid_de;wire O_rgb_r,O_rgb_g,O_rgb_b;
//例化video_testvideo_test video_test_inst(.I_vid_clk(I_vid_clk),.I_vid_rstn(I_vid_rstn),.O_vid_vs(O_vid_vs),.O_vid_hs(O_vid_hs),.O_vid_de(O_vid_de),.O_rgb_r(O_rgb_r),.O_rgb_g(O_rgb_g),.O_rgb_b(O_rgb_b));
//初始化initial begin    I_vid_clk= 1'b0;    I_vid_rstn = 1'b0;    #100;//产生100ns的系统复位    I_vid_rstn = 1'b1;//复位完成end//产生仿真时钟always #(SYS_TIME/2) I_vid_clk= ~I_vid_clk;
endmodule





为简化仿真,这里模拟的视频格式为320*5 即一行的有效数据为350个像素,一帧数据有5行像素数据。4.2 仿真结果
页: [1]
查看完整版本: 2-3-24 TPG图像测试数据发生器设计