[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA基础篇连载-24 TPG图像测试数据发生器设

文档创建者:FPGA课程
浏览次数:220
最后更新:2024-09-02
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 1-FPGA基础入门实验
本帖最后由 FPGA课程 于 2024-9-2 10:41 编辑

​ 软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://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_vs
O_tpg_hs:同I_tpg_hs
O_tpg_de:同I_tpg_de
O_tpg_data:rgb格式数据输出
18f28c7328a44c15884b4711140619d8.jpg


2.2时序设计
视频数据的有效区域如下图所示:视频数据在H_AcitiveSize和V_AcitiveSize同时有效时候有效
dcf457016bae41ea8bfe93cc1a704a4f.jpg
3 TPG源码
产生彩条、纯色、黑白棋方格测试数据,用于视频测试。
  1. `timescale 1ns / 1ns//仿真时间刻度/精度

  2. module uitpg
  3. (
  4. input           I_tpg_clk, //系统时钟
  5. input           I_tpg_rstn,//系统复位
  6. input           I_tpg_vs,  //场同步输入
  7. input           I_tpg_hs,  //行同步输入
  8. input           I_tpg_de,  //视频数据有效输入   
  9. output          O_tpg_vs,  //场同步输出
  10. output          O_tpg_hs,  //行同步输出
  11. output          O_tpg_de,  //视频数据有效输出   
  12. output [23:0]   O_tpg_data //有效测试数据
  13. );

  14. reg         tpg_vs_r   = 1'b0; //对vs信号寄存
  15. reg         tpg_hs_r   = 1'b0; //对hs信号寄存
  16. reg [7 :0]  grid_data  = 8'd0; //grid棋方格寄存器
  17. reg [23:0]  color_bar  = 24'd0;//RGB 彩条寄存器
  18. reg [10:0]  dis_mode   = 11'd0;//显示模式寄存器
  19. reg [7 :0]  r_reg      = 8'd0; //红寄存器
  20. reg [7 :0]  g_reg      = 8'd0; //绿寄存器
  21. reg [7 :0]  b_reg      = 8'd0; //蓝寄存器

  22. always @(posedge I_tpg_clk)begin
  23.     tpg_vs_r <= I_tpg_vs; //对vs信号寄存一次
  24.     tpg_hs_r <= I_tpg_hs; //对hs信号寄存一次
  25. end

  26. reg [11:0]v_cnt = 12'd0; //视频垂直方向,行计数器
  27. reg [11:0]h_cnt = 12'd0; //视频水平方向,列计数器

  28. //h_cnt计数器模块
  29. always @(posedge I_tpg_clk)
  30.     h_cnt <= I_tpg_de ? h_cnt + 1'b1 : 12'd0; //计数行有效像素,当de无效,重置 h_cnt=0

  31. //v_cnt计数器模块
  32. always @(posedge I_tpg_clk)
  33.   if(I_tpg_vs) //通过vs产生同步复位
  34.     v_cnt <= 12'd0; //重置v_cnt=0
  35.   else
  36.     v_cnt <= ((!tpg_hs_r)&&I_tpg_hs) ? v_cnt + 1'b1 : v_cnt; //hs信号的上升沿,v_cnt计数,这种方式可以不管hs有效是高电平还是低电平的情况,v_cnt 视频垂直方向,行计数器,计数行数量

  37. //显示模式切换
  38. always @(posedge I_tpg_clk)
  39.    if(I_tpg_rstn==1'b0)
  40.     dis_mode <= 0;
  41.    else
  42.     dis_mode <= ((!tpg_vs_r)&&I_tpg_vs) ? dis_mode + 1'b1 : dis_mode;

  43. //grid_data发生器  
  44. always @(posedge I_tpg_clk)begin
  45.     grid_data <= ((v_cnt[4]==1'b1) ^ (h_cnt[4]==1'b1)) ? 8'h00 : 8'hff; //方格大小16*16,黑白交替
  46. end

  47. //RGB彩条发生器
  48. always @(posedge I_tpg_clk)
  49. begin
  50.     if(h_cnt==260)
  51.     color_bar   <=  24'hff0000;//红
  52.     else if(h_cnt==420)
  53.     color_bar   <=  24'h00ff00;//绿
  54.     else if(h_cnt==580)
  55.     color_bar   <=  24'h0000ff;//蓝
  56.     else if(h_cnt==740)
  57.     color_bar   <=  24'hff00ff;//紫
  58.     else if(h_cnt==900)
  59.     color_bar   <=  24'hffff00;//黄
  60.     else if(h_cnt==1060)
  61.     color_bar   <=  24'h00ffff;//青蓝
  62.     else if(h_cnt==1220)
  63.     color_bar   <=  24'hffffff;//白
  64.     else if(h_cnt==1380)
  65.     color_bar   <=  24'h000000;//黑
  66.     else
  67.     color_bar   <=  color_bar;
  68. end
  69. //测试图形输出
  70. always @(posedge I_tpg_clk)begin
  71.     case(dis_mode[10:7])//截取高位,控制切换显示速度
  72.         4'd0:begin
  73.             r_reg <= 0;
  74.             b_reg <= 0;
  75.             g_reg <= 0;
  76.         end
  77.         4'd1:begin
  78.             r_reg <= 8'b11111111;               //白
  79.             g_reg <= 8'b11111111;
  80.             b_reg <= 8'b11111111;
  81.         end
  82.         4'd2,4'd3:begin//连续两个状态输出相同图形
  83.             r_reg <= 8'b11111111;              //红
  84.             g_reg <= 0;
  85.             b_reg <= 0;  
  86.         end           
  87.         4'd4,4'd5:begin//连续两个状态输出相同图形
  88.             r_reg <= 0;                         //绿
  89.             g_reg <= 8'b11111111;
  90.             b_reg <= 0;
  91.         end                  
  92.         4'd6:begin     
  93.             r_reg <= 0;                         //蓝
  94.             g_reg <= 0;
  95.             b_reg <= 8'b11111111;
  96.         end
  97.         4'd7,4'd8:begin  //连续两个状态输出相同图形   
  98.             r_reg <= grid_data;                 //方格
  99.             g_reg <= grid_data;
  100.             b_reg <= grid_data;
  101.         end                  
  102.         4'd9:begin   
  103.             r_reg <= h_cnt[7:0];                //水平渐变
  104.             g_reg <= h_cnt[7:0];
  105.             b_reg <= h_cnt[7:0];
  106.         end
  107.         4'd10,4'd11:begin //连续两个状态输出相同图形
  108.             r_reg <= v_cnt[7:0];                 //垂直渐变
  109.             g_reg <= v_cnt[7:0];
  110.             b_reg <= v_cnt[7:0];
  111.         end
  112.         4'd12:begin     
  113.             r_reg <= v_cnt[7:0];                 //红垂直渐变
  114.             g_reg <= 0;
  115.             b_reg <= 0;
  116.         end
  117.         4'd13:begin     
  118.             r_reg <= 0;                          //绿垂直渐变
  119.             g_reg <= h_cnt[7:0];
  120.             b_reg <= 0;
  121.         end
  122.         4'd14:begin     
  123.             r_reg <= 0;                          //蓝垂直渐变
  124.             g_reg <= 0;
  125.             b_reg <= h_cnt[7:0];            
  126.         end
  127.         4'd15:begin     
  128.             r_reg <= color_bar[23:16];           //彩条
  129.             g_reg <= color_bar[15:8];
  130.             b_reg <= color_bar[7:0];            
  131.         end               
  132.         endcase
  133. end

  134. assign O_tpg_data = {r_reg,g_reg,b_reg};//测试图形RGB数据输出
  135. assign O_tpg_vs = I_tpg_vs;  //VS同步信号
  136. assign O_tpg_hs = I_tpg_hs;  //HS同步信号
  137. assign O_tpg_de = I_tpg_de;  //DE数据有效信号
  138. endmodule
复制代码

4RTL仿真
4.1仿真激励文件
  1. /*************视频测试仿真文件****************************************
  2. *********************************************************************/

  3. `timescale 1ns / 1ns//仿真时间刻度/精度

  4. module video_test_tb;

  5. localparam SYS_TIME = 10;//系统时钟周期10ns

  6. reg I_vid_rstn,I_vid_sysclk_p,I_vid_sysclk_n;
  7. wire O_vid_vs,O_vid_hs,O_vid_de;
  8. wire [7:0]O_rgb_r,O_rgb_g,O_rgb_b;

  9. //例化video_test
  10. video_test video_test_inst
  11. (
  12. .I_vid_sysclk_p(I_vid_sysclk_p),
  13. .I_vid_sysclk_n(I_vid_sysclk_n),
  14. .I_vid_rstn(I_vid_rstn),
  15. .O_vid_vs(O_vid_vs),
  16. .O_vid_hs(O_vid_hs),
  17. .O_vid_de(O_vid_de),
  18. .O_rgb_r(O_rgb_r),
  19. .O_rgb_g(O_rgb_g),
  20. .O_rgb_b(O_rgb_b)
  21. );

  22. //初始化
  23. initial begin
  24.     I_vid_sysclk_p  = 1'b0;
  25.     I_vid_sysclk_n  = 1'b1;
  26.     I_vid_rstn = 1'b0;
  27.     #100;//产生100ns的系统复位
  28.     I_vid_rstn = 1'b1;//复位完成
  29. end
  30. //产生仿真时钟
  31. always #(SYS_TIME/2) I_vid_sysclk_p= ~I_vid_sysclk_p;
  32. always #(SYS_TIME/2) I_vid_sysclk_n= ~I_vid_sysclk_n;

  33. endmodule
复制代码

为简化仿真,这里模拟的视频格式为320*5 即一行的有效数据为350个像素,一帧数据有5行像素数据。
bed554d7c13e48b191a75f232f2e93cd.jpg
4.2仿真结果
96f5dbecc8654442a4ac28421b147546.jpg




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则