发新帖

[原创] 【小梅哥 altera FPGA入门开发板试用体验】+遥控式VGA测试图卡

[复制链接]
发表于 2018-8-20 16:38:39
| 1307 查看 | 0 回复
本帖最后由 捷波 于 2018-8-21 16:24 编辑

      最近用小梅哥FPGA开发板制作了一款红外遥控式VGA测试图卡,也可称为VGA测试信号发生器。它可以用来检测显示器在亮度、对比度、色彩还原、清晰度等方面的性能,在测试时可以用红外遥控器来切换不同的测试画面,还是相当的方便实用。实际使用效果如视频所示,画面看着是不是还挺专业的,之前用过类似视频信号发生器的同学,对这些图谱应该感觉很亲切吧!
VGA_Test_Card.gif



      下面我就来介绍一下,这款测试图卡是如何用小梅哥FPGA开发板实现的。首先你要准备以下一些材料:
      1. 小梅哥FPGA开发板套件。本来就是基于它来制作的嘛!当然必不可少了。有能力的朋友也可以选择类似的FPGA板子,不过要是没有配套的VGA接口模块的话就要另想办法了。
xmg.jpg

      2. Quartues II v13.0,这里使用的是小梅哥官方提供的版本。为避免出现因版本不同而带来的一些不可预知的问题,建议采用官方推荐的这个版本。当然使用其它版本也未尝不可。
0.jpg

      3. 带VGA 15针接口的显示器。这个应该还是比较常见的,家里没有台式机显示器的,可以考虑用你家的平板电视,VGA接口基本都是标配。
VG2450_Right_h.jpg

      下面就开始搬砖了,首先下载小梅哥提供的VGA控制器设计与验证例程——VGA_CTRL,文件下载地址:http://pan.baidu.com/s/1qYBHiFU。下载解压后,打开Quartues II v13.0,载入VGA_CTRL项目文件。小梅哥提供的例程文件归档还是很有序的,工程文件,源代码,测试代码都分开目录存放。
7.jpg

      将工程直接编译,并下载到开发板后,在VGA显示器上就可以看到图示的彩条图像。看上去这和要实现的VGA测试卡比较接近了,接下来只需要在这个项目中增加红外遥控接收处理,并根据遥控能够信号输出特定的测试图即可。
8.jpg

      红外遥控接收部分可以拷贝小梅哥精品例程calculator中的ir_decode.v和ir_code_lut.v,并将这两个文件添加到VGA_CTRL项目中。
9'.jpg

      在Top_Level Entity文件VGA_CTRL_test.v中添加有关红外处理模块的例化代码及相关变量。
11.jpg


10.jpg

      接着还需要添加遥控接收用到的引脚,打开菜单Assignments -> Pin Planner,按下图所示设置即可。
12.jpg

      至此,已经为项目添加好了红外遥控接收解码的功能。下面需要做的是添加键码处理程序,根据收到的红外键码,对应产生不同的测试图像。按键事件的处理通过case(user_code)完成,下面这段代码是处理接收到“0”~“7”键后,将disp_data赋值,该值对应的白、黄、青、绿、粉、红、蓝纯色信号。
13'.jpg

      彩条信号代码及输出到显示器的效果。
14.jpg

      多波群信号代码及输出到显示器的效果。
15.jpg

      格子线信号代码及输出到显示器的效果。
16.jpg

      其它测试图显示效果。
17.jpg

相关Verilog文件:
  1. <font face="微软雅黑" size="3">module VGA_CTRL_test(
  2.         Clk,         //50MHZ时钟
  3.         Rst_n,
  4.         VGA_RGB,//TFT数据输出
  5.         VGA_HS,        //TFT行同步信号
  6.         VGA_VS,        //TFT场同步信号
  7.         iIR        //Ir
  8. );

  9.         input Clk;
  10.         input Rst_n;
  11.         output [7:0]VGA_RGB;
  12.         output VGA_HS;
  13.         output VGA_VS;
  14.        
  15.         reg [7:0]disp_data;
  16.         wire [9:0]hcount;
  17.         wire [9:0]vcount;
  18.         wire Clk25M;
  19.        
  20.         // add IR
  21.         input iIR;//红外键盘输入
  22.         wire ir_Get_Flag;
  23.         wire [3:0]user_code;
  24.         wire op_flag;
  25.         wire num_flag;
  26.         wire [15:0]irData;       
  27.                
  28.         vga_test_pll vga_test_pll(
  29.                 .inclk0(Clk),
  30.                 .c0(Clk25M)
  31.         );       
  32.        
  33.         VGA_CTRL VGA_CTRL(
  34.                 .Clk25M(Clk25M),        //系统输入时钟25MHZ
  35.                 .Rst_n(Rst_n),
  36.                 .data_in(disp_data),        //待显示数据
  37.                 .hcount(hcount),                //VGA行扫描计数器
  38.                 .vcount(vcount),                //VGA场扫描计数器
  39.                 .VGA_RGB(VGA_RGB),        //VGA数据输出
  40.                 .VGA_HS(VGA_HS),                //VGA行同步信号
  41.                 .VGA_VS(VGA_VS)                //VGA场同步信号
  42.         );
  43.        
  44.         ir_decode ir_decode
  45.         (
  46.                 .Clk50M(Clk),
  47.                 .Rst_n(Rst_n),               
  48.                 .iIR(iIR),               
  49.                 .Get_Flag(ir_Get_Flag),
  50.                 .irData(irData),
  51.                 .irAddr()
  52.         );
  53.        
  54.         ir_code_lut ir_code_lut(
  55.                 .ir_data(irData[7:0]),        //红外键值
  56.                 .user_code(user_code),        //译码得到的用户码(0~9,+ - * /)
  57.                 .num_flag(num_flag), //用户码为数字标志
  58.                 .op_flag(op_flag)        //用户码为操作(加减乘除=标志)
  59.         );
  60.        
  61. //定义颜色编码
  62. localparam
  63.         BLACK                = 8'h00, //黑色
  64.         BLUE                = 8'h03, //蓝色
  65.         RED                = 8'hE0, //红色
  66.         PURPPLE        = 8'hE3, //紫色
  67.         GREEN                = 8'h1C, //绿色
  68.         CYAN                = 8'h1F, //青色
  69.         YELLOW        = 8'hFC, //黄色
  70.         WHITE                = 8'hFF, //白色       
  71.         GRAY5                = 8'hDB,        //GRAY5
  72.         GRAY4                = 8'hB7,        //GRAY4
  73.         GRAY3                = 8'h92,        //GRAY3
  74.         GRAY2                = 8'h6E,        //GRAY2
  75.         GRAY1                = 8'h49,        //GRAY1
  76.         GRAY0                = 8'h24;        //GRAY0
  77.                                        
  78.        
  79.         always@(*)
  80.         case(user_code)
  81.                 4'h0:        // Key 0 WHITE
  82.                         disp_data = WHITE;       
  83.                 4'h1:        // Key 1 YELLOW
  84.                         disp_data = YELLOW;                       
  85.                 4'h2:        // Key 2 CYAN
  86.                         disp_data = CYAN;                       
  87.                 4'h3:        // Key 3 GREEN
  88.                         disp_data = GREEN;                       
  89.                 4'h4:        // Key 4 PURPPLE
  90.                         disp_data = PURPPLE;                       
  91.                 4'h5:        // Key 5 RED
  92.                         disp_data = RED;
  93.                 4'h6:        // Key 6 BLUE
  94.                         disp_data = BLUE;                                                               
  95.                 4'h7:        // Key 7 Vertical Color Bar                                                                               
  96.                         case(hcount/80)
  97.                                 3'h0:
  98.                                         disp_data = WHITE;       
  99.                                 3'h1:
  100.                                         disp_data = YELLOW;       
  101.                                 3'h2:
  102.                                         disp_data = CYAN;
  103.                                 3'h3:
  104.                                         disp_data = GREEN;                                                                                               
  105.                                 3'h4:
  106.                                         disp_data = PURPPLE;       
  107.                                 3'h5:
  108.                                         disp_data = RED;       
  109.                                 3'h6:
  110.                                         disp_data = BLUE;       
  111.                                 3'h7:
  112.                                         disp_data = BLACK;                                                                                                                                                                       
  113.                         endcase
  114.                 4'h8:        // Key 8 Vertical Multiburst
  115.                         case(hcount/80)
  116.                                 3'h0:
  117.                                         if(hcount%2)
  118.                                                 disp_data = WHITE;
  119.                                         else
  120.                                                 disp_data = BLACK;                                                       
  121.                                 3'h1:
  122.                                         if((hcount/2)%2)
  123.                                                 disp_data = WHITE;
  124.                                         else
  125.                                                 disp_data = BLACK;       
  126.                                 3'h2:
  127.                                         if((hcount/3)%2)
  128.                                                 disp_data = WHITE;
  129.                                         else
  130.                                                 disp_data = BLACK;       
  131.                                 3'h3:
  132.                                         if((hcount/4)%2)
  133.                                                 disp_data = WHITE;
  134.                                         else
  135.                                                 disp_data = BLACK;                                                                                       
  136.                                 3'h4:
  137.                                         if((hcount/5)%2)
  138.                                                 disp_data = WHITE;
  139.                                         else
  140.                                                 disp_data = BLACK;       
  141.                                 3'h5:
  142.                                         if((hcount/6)%2)
  143.                                                 disp_data = WHITE;
  144.                                         else
  145.                                                 disp_data = BLACK;       
  146.                                 3'h6:
  147.                                         if((hcount/7)%2)
  148.                                                 disp_data = WHITE;
  149.                                         else
  150.                                                 disp_data = BLACK;       
  151.                                 3'h7:
  152.                                         if((hcount/8)%2)
  153.                                                 disp_data = WHITE;
  154.                                         else
  155.                                                 disp_data = BLACK;                                                                                                                                                               
  156.                         endcase                               
  157.                 4'h9:        // Key 9 Half Color Bar and Half Multiburst
  158.                         if(vcount >= 240)begin
  159.                                 case(hcount/80)
  160.                                         3'h0:
  161.                                                 if(hcount%2)
  162.                                                         disp_data = WHITE;
  163.                                                 else
  164.                                                         disp_data = BLACK;                                                       
  165.                                         3'h1:
  166.                                                 if((hcount/2)%2)
  167.                                                         disp_data = WHITE;
  168.                                                 else
  169.                                                         disp_data = BLACK;       
  170.                                         3'h2:
  171.                                                 if((hcount/3)%2)
  172.                                                         disp_data = WHITE;
  173.                                                 else
  174.                                                         disp_data = BLACK;       
  175.                                         3'h3:
  176.                                                 if((hcount/4)%2)
  177.                                                         disp_data = WHITE;
  178.                                                 else
  179.                                                         disp_data = BLACK;                                                                                       
  180.                                         3'h4:
  181.                                                 if((hcount/5)%2)
  182.                                                         disp_data = WHITE;
  183.                                                 else
  184.                                                         disp_data = BLACK;       
  185.                                         3'h5:
  186.                                                 if((hcount/6)%2)
  187.                                                         disp_data = WHITE;
  188.                                                 else
  189.                                                         disp_data = BLACK;       
  190.                                         3'h6:
  191.                                                 if((hcount/7)%2)
  192.                                                         disp_data = WHITE;
  193.                                                 else
  194.                                                         disp_data = BLACK;       
  195.                                         3'h7:
  196.                                                 if((hcount/8)%2)
  197.                                                         disp_data = WHITE;
  198.                                                 else
  199.                                                         disp_data = BLACK;                                                                                                                                                               
  200.                                 endcase
  201.                         end       
  202.                         else begin                               
  203.                                 case(hcount/80)
  204.                                         3'h0:
  205.                                                 disp_data = WHITE;       
  206.                                         3'h1:
  207.                                                 disp_data = YELLOW;       
  208.                                         3'h2:
  209.                                                 disp_data = CYAN;
  210.                                         3'h3:
  211.                                                 disp_data = GREEN;                                                                                               
  212.                                         3'h4:
  213.                                                 disp_data = PURPPLE;       
  214.                                         3'h5:
  215.                                                 disp_data = RED;       
  216.                                         3'h6:
  217.                                                 disp_data = BLUE;       
  218.                                         3'h7:
  219.                                                 disp_data = BLACK;                                                                                                                                                                       
  220.                                 endcase
  221.                         end
  222.                 4'ha:        // Key A Vertical Color_Gray_Multiburst Bar                                                                               
  223.                         if(vcount >= 320)begin
  224.                                 case(hcount/80)
  225.                                         3'h0:
  226.                                                 if(hcount%2)
  227.                                                         disp_data = WHITE;
  228.                                                 else
  229.                                                         disp_data = BLACK;                                                       
  230.                                         3'h1:
  231.                                                 if((hcount/2)%2)
  232.                                                         disp_data = WHITE;
  233.                                                 else
  234.                                                         disp_data = BLACK;       
  235.                                         3'h2:
  236.                                                 if((hcount/3)%2)
  237.                                                         disp_data = WHITE;
  238.                                                 else
  239.                                                         disp_data = BLACK;       
  240.                                         3'h3:
  241.                                                 if((hcount/4)%2)
  242.                                                         disp_data = WHITE;
  243.                                                 else
  244.                                                         disp_data = BLACK;                                                                                       
  245.                                         3'h4:
  246.                                                 if((hcount/5)%2)
  247.                                                         disp_data = WHITE;
  248.                                                 else
  249.                                                         disp_data = BLACK;       
  250.                                         3'h5:
  251.                                                 if((hcount/6)%2)
  252.                                                         disp_data = WHITE;
  253.                                                 else
  254.                                                         disp_data = BLACK;       
  255.                                         3'h6:
  256.                                                 if((hcount/7)%2)
  257.                                                         disp_data = WHITE;
  258.                                                 else
  259.                                                         disp_data = BLACK;       
  260.                                         3'h7:
  261.                                                 if((hcount/8)%2)
  262.                                                         disp_data = WHITE;
  263.                                                 else
  264.                                                         disp_data = BLACK;                                                                                                                                                               
  265.                                 endcase
  266.                         end       
  267.                         else begin
  268.                                 if(vcount >= 160)begin                               
  269.                                         case(hcount/80)
  270.                                                 3'h0:
  271.                                                         disp_data = WHITE;       
  272.                                                 3'h1:
  273.                                                         disp_data = GRAY5;       
  274.                                                 3'h2:
  275.                                                         disp_data = GRAY4;
  276.                                                 3'h3:
  277.                                                         disp_data = GRAY3;                                                                                               
  278.                                                 3'h4:
  279.                                                         disp_data = GRAY2;       
  280.                                                 3'h5:
  281.                                                         disp_data = GRAY1;       
  282.                                                 3'h6:
  283.                                                         disp_data = GRAY0;       
  284.                                                 3'h7:
  285.                                                         disp_data = BLACK;                                                                                                                                                                       
  286.                                         endcase
  287.                                 end
  288.                                 else begin
  289.                                         case(hcount/80)
  290.                                                 3'h0:
  291.                                                         disp_data = WHITE;       
  292.                                                 3'h1:
  293.                                                         disp_data = YELLOW;       
  294.                                                 3'h2:
  295.                                                         disp_data = CYAN;
  296.                                                 3'h3:
  297.                                                         disp_data = GREEN;                                                                                               
  298.                                                 3'h4:
  299.                                                         disp_data = PURPPLE;       
  300.                                                 3'h5:
  301.                                                         disp_data = RED;       
  302.                                                 3'h6:
  303.                                                         disp_data = BLUE;       
  304.                                                 3'h7:
  305.                                                         disp_data = BLACK;                                                                                                                                                                       
  306.                                         endcase
  307.                                 end
  308.                         end                                               
  309.                 4'hb:        // Key B Herizontal half Color Bar
  310.                         if(hcount >= 0 && hcount < 320)begin
  311.                                 if(vcount >= 0 && vcount < 120)       
  312.                                         disp_data = WHITE;       
  313.                                 else if(vcount >= 120 && vcount < 240)
  314.                                         disp_data = YELLOW;       
  315.                                 else if(vcount >= 240 && vcount < 360)
  316.                                         disp_data = CYAN;       
  317.                                 else
  318.                                         disp_data = GREEN;       
  319.                         end
  320.                         else begin
  321.                                 if(vcount >= 0 && vcount < 120)       
  322.                                         disp_data = PURPPLE;       
  323.                                 else if(vcount >= 120 && vcount < 240)
  324.                                         disp_data = RED;       
  325.                                 else if(vcount >= 240 && vcount < 360)
  326.                                         disp_data = BLUE;       
  327.                                 else
  328.                                         disp_data = BLACK;       
  329.                         end               
  330.                 4'hc:        // Key C Herizontal Color Bar
  331.                         case(vcount/60)
  332.                                 3'h0:
  333.                                         disp_data = WHITE;       
  334.                                 3'h1:
  335.                                         disp_data = YELLOW;       
  336.                                 3'h2:
  337.                                         disp_data = CYAN;
  338.                                 3'h3:
  339.                                         disp_data = GREEN;                                                                                               
  340.                                 3'h4:
  341.                                         disp_data = PURPPLE;       
  342.                                 3'h5:
  343.                                         disp_data = RED;       
  344.                                 3'h6:
  345.                                         disp_data = BLUE;       
  346.                                 3'h7:
  347.                                         disp_data = BLACK;                                                                                                                                                                       
  348.                         endcase
  349.                 4'hd:        // Key D Cross Hatch
  350.                         if((vcount/40)*40 < vcount && vcount < (vcount/40)*40 + 3)begin
  351.                                         disp_data = WHITE;
  352.                         end
  353.                         else begin
  354.                                 if((hcount/40)*40 < hcount && hcount < (hcount/40)*40 + 3)
  355.                                         disp_data = WHITE;       
  356.                                 else
  357.                                         disp_data = BLACK;
  358.                         end               
  359.                 4'hf:        // Key E Circle
  360.                                 if(((320-hcount)*(320-hcount) + (240-vcount)*(240-vcount)) <= 160000)
  361.                                         disp_data = WHITE;       
  362.                                 else
  363.                                         disp_data = BLACK;                               
  364.                 default:        // default Black
  365.                         disp_data = BLACK;                                                                                       
  366.         endcase
  367. endmodule
  368. </font>
复制代码





我要点赞 0

举报

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