基于VGA的彩条显示

一、VGA基本认识

1、基本标准

  • VGA(Video Graphics Array)即视频图形阵列,是IBM于1987年提出的一个使用模拟信号的电脑显示标准;
  • VGA最早指的是显示器640X480这种显示模式
  • 其接口采用VGA标准输出数据的专用接口,共有15针,分成3排,每排5个孔,是显卡上应用最为广泛的接口类型,绝大多数显卡都带有此种接口。它传输红、绿、蓝模拟信号以及同步信号(水平和垂直信号);
  • VGA是模拟信号,只能传输视频信号。

2、接口与针脚

15个针脚的名称和描述如下:
在这里插入图片描述
对应接口定义如下
在这里插入图片描述

3、基础原理

显示与时序
通用VGA显示卡系统主要由控制电路、显示缓存区和视频BIOS(Basic Input Output System即基本输入输出系统)程序三个部分组成。
在这里插入图片描述

  • 控制电路主要完成时序发生、显示缓冲区数据操作、主时钟选择和D/A(Digital to Analog即将数字信号转换为模拟信号)转换等功能;
  • 显示缓冲区提供显示数据缓存空间;
  • 视频BIOS作为控制程序固化在显示卡的ROM(Read-Only Memory即只读存储器)中。

VGA时序分析
通过对VGA显示卡基本工作原理的分析可知,要实现VGA显示就要解决数据来源、数据存储、时序实现等问题,其中关键还是如何实现VGA时序。 行时序和帧时序都需要产生同步脉冲(Sync a)、显示后沿(Back porch b)、显示时序段(Display interval c)和显示前沿(Front porch d)四个部分。

4、设计要求

  • VGA显示有多种模式,需要通过控制器实现模式间切换,还需要对显示的内容进行接收、处理和显示;
  • VGA显示要求显存速度快、容量大。读速度要达到65MHz以上,存储容量至少要2MB。可采用高速SRAM或SDRAM作为显示数据缓存;
  • VGA显示对数模转换DAC有如下要求:一是高速转换,转换的速度应该在80MHz或以上;二是同步性好,能保证 R、G、B三路信号的同步性;三是有相应的精度。可选择一种包括3路8位高速D/A的专用视频芯片;
  • 要提高VGA显示的效率,就要不断更新数据,同时还要保证实时性,因此需要非常高的接口速度。

5、VGA优点

  • 分辨率高、显示速率快、颜色丰富;
  • 成本低、结构简单、应用灵活;
  • 显示输出 RGB 三原色信号,RGB 色彩模式是工业界的一种颜色标准。它是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色。

二、VGA工作原理

1、接口定义

VGA的15个针脚名称和描述
在这里插入图片描述

说明:
①VGA传输标准:分解为红绿蓝三原色进行输出;
②引脚1→引脚3:模拟信号(数字信号转换为模拟信号进行输出),输出三原色,电压变化范围为0~0.714v;
③引脚13→引脚14:行场同步信号,TTL(逻辑电平)电平,可直接输出数字信号

2、行场信号时序

行同步时序
在这里插入图片描述
说明

  • DATA:视频图像
  • HSYNC:行同步信号
  • a:行同步,扫描地址复位
  • b:行显示后沿,数据稳定等待时间
  • c:有效数据,显示在显示器上的图像
  • d:行显示前沿,扫描地址转移的准备
  • e:行扫描总周期,一行数据扫描完成所需的时间

场同步时序
在这里插入图片描述
说明

  • DATA:视频图像
  • VSYNC:场同步信号
  • a:场同步,扫描地址复位
  • b:场显示后沿,数据稳定等待时间
  • c:有效数据,显示在显示器上的图像
  • d:场显示前沿,扫描地址转移的准备
  • e:场扫描总周期,一场数据扫描完成所需的时间

3、工作模式

行时序和场时序都需要同步脉冲(Sync a)、显示后沿(Back porch b)、显示时序段(Display interval c)和显示前沿(Front porch d)四部分VGA工业标准显示模式要求:行同步,场同步都为负极性,即同步脉冲要求是负脉冲
在这里插入图片描述

4、分辨率

常见VGA分辨率表格
在这里插入图片描述
特别说明
以分辨率为640x480为例

①分辨率:640X480
②640:每一行有640个像素点;480:每一帧有480行
③@60:VGA显示器刷新频率
④时钟:行扫描总时间x场扫描总时间x刷新频率
80052560=25200000≈25.2Mhz
⑤总扫描时间=同步+显示后沿+有效数据+显示前沿

5、原理图

VGA原理图
在这里插入图片描述
说明:左边16个信号,分为三组,第一组5个信号,第二组6个信号,第三组5个信号,分别连接红绿蓝,称之为RGB565
使用一系列电阻匹配网络将数字信号转换为模拟信号。

6、权电阻网络

简易权电阻网络电路图
在这里插入图片描述
具体原理可参考如下链接:
权电阻网络DA转换器

三、VGA彩条显示

1、原理图

系统框图
在这里插入图片描述
布局布线综合图(RTL)
在这里插入图片描述

2、信号说明与引脚配置

定义信号说明与引脚配置

信号定义 引脚 描述
sys_clk E1 系统时钟
sys_rst_n E15 系统复位,低电平有效
vga_hs C16 VGA行同步信号
vga_vs D15 VGA场同步信号
vga_rgb - 红绿蓝三原色输出
vga_rgb[0] C15 VGA蓝
vga_rgb[1] B16 VGA蓝
vga_rgb[2] A15 VGA蓝
vga_rgb[3] B14 VGA蓝
vga_rgb[4] A14 VGA蓝
vga_rgb[5] B13 VGA绿
vga_rgb[6] A13 VGA绿
vga_rgb[7] B12 VGA绿
vga_rgb[8] A12 VGA绿
vga_rgb[9] B11 VGA绿
vga_rgb[10] A11 VGA绿
vga_rgb[11] B10 VGA红
vga_rgb[12] A10 VGA红
vga_rgb[13] B9 VGA红
vga_rgb[14] A9 VGA红
vga_rgb[15] C8 VGA红

关于有关信号定义说明,源码中都有详细注解。

3、项目源码

顶层模块
vga_top.v

/******************************
项目说明:VGA彩条显示实验
******************************/

module vga_top(

    input                       sys_clk        ,//系统时钟
    input                       sys_rst_n      ,//系统复位  低电平有效

    //VGA接口
    output                      vga_hs         ,//行同步信号
    output                      vga_vs         ,//场同步信号
    output       [15:0]         vga_rgb         //红绿蓝三原色输出 RGB565
);

    //信号定义
    wire                        vga_clk_w     ;//PLL分频得到的25Mhz时钟
    wire                        locked_w      ;//PLL输出稳定信号
    wire                        rst_n_w       ;//内部复位信号
    wire         [15:0]         pixel_data_w  ;//像素点数据
    wire         [9:0]          pixel_xpos_w  ;//像素点横坐标
    wire         [9:0]          pixel_ypos_w  ;//像素点纵坐标

    //pll输出稳定后 停止复位
    assign rst_n_w = sys_rst_n && locked_w;

    //模块例化
    //时钟分频pll
    vga_pll       u_vga_pll
    (
        .areset                ( ~sys_rst_n ),//高电平有效
	    .inclk0                ( sys_clk    ),
	    .c0                    ( vga_clk_w  ),
	    .locked                ( locked_w   )
    );

    //vga驱动
    vga_driver u_vga_driver
    (
        .vga_clk                (vga_clk_w     ),
        .sys_rst_n              (rst_n_w       ),
        //VGA接口
        .vga_hs                 (vga_hs        ),
        .vga_vs                 (vga_vs        ),
        .vga_rgb                (vga_rgb       ),
        //像素
        .pixel_data             (pixel_data_w  ),
        .pixel_xpos             (pixel_xpos_w  ),
        .pixel_ypos             (pixel_ypos_w  )
    );

    //vga显示
    vga_disp      u_vga_disp
    (
        .vga_clk                (vga_clk_w     ),
        .sys_rst_n              (rst_n_w       ),
        //像素
        .pixel_data             (pixel_data_w  ),
        .pixel_xpos             (pixel_xpos_w  ),
        .pixel_ypos             (pixel_ypos_w  )
    );
    

endmodule

vga驱动模块

`include "para.v"

module vga_driver(

    input                       vga_clk    ,//vga驱动时钟
    input                       sys_rst_n  ,//复位
    //VGA接口
    output                      vga_hs     ,//行同步信号
    output                      vga_vs     ,//场同步信号
    output         [15:0]       vga_rgb    ,//红绿蓝三原色输出
    //像素
    input          [15:0]       pixel_data ,//像素点数据
    output         [9:0]        pixel_xpos ,//像素点横坐标
    output         [9:0]        pixel_ypos  //像素点纵坐标
);

    //信号定义
    reg           [9:0]         cnt_hs   ;//行计数器
    reg           [9:0]         cnt_vs   ;//场计数器

    wire                        vga_en   ;//使能RGB565输出
    wire                        data_req ;//请求数据输入

    //计数器设计
    //行计数器 cnt_hs
    always @(posedge vga_clk or negedge sys_rst_n) begin
        if(!sys_rst_n)begin
          cnt_hs <= 10'd0;
        end
        else begin
          if(cnt_hs < `H_TOTAL - 1'b1)//行扫描周期未结束 计数器自增
          cnt_hs <= cnt_hs + 1'b1;
          else //否则计数器归零
          cnt_hs <= 10'd0;
        end
    end

    //场计数器 cnt_vs
    always @(posedge vga_clk or negedge sys_rst_n) begin
        if(!sys_rst_n)begin
          cnt_vs <= 10'd0;
        end
        else if(cnt_hs == `H_TOTAL-1'b1)begin
          if(cnt_vs < `V_TOTAL-1'b1)//行扫描结束 场扫描未结束 场计数器自增
          cnt_vs <= cnt_vs + 1'b1;
          else 
          cnt_vs <= 10'd0;
        end
    end

    //VGA行场同步信号
    assign vga_hs = (cnt_hs <=`H_SYNC - 1'b1)?1'b0:1'b1;//行计数小于行同步周期为低电平 否则为高电平
    assign vga_vs = (cnt_vs <=`V_SYNC - 1'b1)?1'b0:1'b1;//场计数小于行同步周期为低电平 否则为高电平

    //使能RGB565输出
    /*
    在行场时序中,数据有效阶段,拉高使能信号 输出高电平
    */
    assign vga_en = (((cnt_hs >=`H_SYNC+`H_BACK)&&(cnt_hs<=`H_SYNC+`H_BACK+`H_DISP))
                 && ((cnt_vs >=`V_SYNC+`V_BACK) &&(cnt_vs<=`V_SYNC +`V_BACK+`V_DISP)))
                 ?1'b1:1'b0;

    //RGB数据输出
    assign vga_rgb = vga_en?pixel_data:16'd0;//使能有效 输出数据

    //请求像素点颜色数据输出
    assign data_req = (((cnt_hs >`H_SYNC +`H_BACK-1'b1) && (cnt_hs <`H_SYNC +`H_BACK +`H_DISP-1'b1))
                    && ((cnt_vs >`V_SYNC +`V_BACK-1'b1) && (cnt_vs <`V_SYNC +`H_BACK +`V_DISP-1'b1)))
                    ?1'b1:1'b0;

    //像素点坐标
    assign pixel_xpos = data_req?(cnt_hs - (`H_SYNC + `H_BACK-1'b1)):10'd0;
    assign pixel_ypos = data_req?(cnt_vs - (`V_SYNC + `V_BACK-1'b1)):10'd0; 


endmodule

vga显示模块

`include "cfg.v"
`include "para.v"

module vga_disp(

    input                        vga_clk    ,//vga驱动时钟
    input                        sys_rst_n  ,//复位

    input         [9:0]          pixel_xpos ,//像素点横坐标
    input         [9:0]          pixel_ypos ,//像素点纵坐标
    output     reg[15:0]         pixel_data  //像素点数据
);

   //根据像素点坐标获取像素数据 并在屏幕上显示
   always @(posedge vga_clk or negedge sys_rst_n) begin
       if(!sys_rst_n)begin
         pixel_data <= 16'd0;
       end
       else begin
         if((pixel_xpos >= 0) && (pixel_xpos <= (`H_DISP/5)*1))
         pixel_data <=`WHITE;//数据有效区域五等分 1区域显示白色
         else if((pixel_xpos >= (`H_DISP/5)*1) && (pixel_xpos < (`H_DISP/5)*2))
         pixel_data <= `BLACK;//数据有效区域五等分 2区域显示黑色
         else if((pixel_xpos >= (`H_DISP/5)*2) && (pixel_xpos < (`H_DISP/5)*3))
         pixel_data <= `RED;//数据有效区域五等分 3区域显示红色
         else if((pixel_xpos >= (`H_DISP/5)*3) && (pixel_xpos < (`H_DISP/5)*4))
         pixel_data <= `GREEN;//数据有效区域五等分 4区域显示绿色
         else
         pixel_data <= `BLUE;//数据有效区域五等分 5区域显示蓝色
       end
   end


endmodule

参数定义
para.v与cfg.v

//彩条颜色定义
`define               WHITE           16'b11111_111111_11111    //RGB565 白色
`define               BLACK           16'b00000_000000_00000    //RGB565 黑色
`define               RED             16'b11111_000000_00000    //RGB565 红色
`define               GREEN           16'b00000_111111_00000    //RGB565 绿色
`define               BLUE            16'b00000_000000_11111    //RGB565 蓝色
//行场时序参数定义

//行
`define      H_SYNC           10'd96    //行同步
`define      H_BACK           10'd48    //行显示后沿
`define      H_DISP           10'd640   //行有效数据
`define      H_FRONT          10'd16    //行显示前沿
`define      H_TOTAL          10'd800   //行扫描周期

//场
`define      V_SYNC           10'd2     //场同步 
`define      V_BACK           10'd33    //场显示后沿 
`define      V_DISP           10'd480   //场有效数据   
`define      V_FRONT          10'd10    //场显示前沿
`define      V_TOTAL          10'd525   //场扫描周期  

引脚约束

#VGA引脚 RGB 565
# red
set_location_assignment PIN_C15  -to   vga_rgb[0]  
set_location_assignment PIN_B16  -to   vga_rgb[1]  
set_location_assignment PIN_A15  -to   vga_rgb[2]
set_location_assignment PIN_B14  -to   vga_rgb[3]
set_location_assignment PIN_A14  -to   vga_rgb[4]
# green
set_location_assignment PIN_B13  -to   vga_rgb[5]
set_location_assignment PIN_A13  -to   vga_rgb[6]
set_location_assignment PIN_B12  -to   vga_rgb[7]
set_location_assignment PIN_A12  -to   vga_rgb[8]
set_location_assignment PIN_B11  -to   vga_rgb[9]
set_location_assignment PIN_A11  -to   vga_rgb[10]
# blue
set_location_assignment PIN_B10  -to   vga_rgb[11]
set_location_assignment PIN_A10  -to   vga_rgb[12]
set_location_assignment PIN_B9   -to   vga_rgb[13]
set_location_assignment PIN_A9   -to   vga_rgb[14]
set_location_assignment PIN_C8   -to   vga_rgb[15]
# 行场
set_location_assignment PIN_C16  -to   vga_hs 	    
set_location_assignment PIN_D15  -to   vga_vs

# 时钟 复位
set_location_assignment PIN_E1   -to   sys_clk
set_location_assignment PIN_E15  -to   sys_rst_n

4、编译与效果演示

全编译工程
在这里插入图片描述
烧录程序,效果演示
在这里插入图片描述

四、参考资料

VGA接口定义和使用详解
关于VGA、DVI、HDMI的几点误解和区别
vga 绿同步的时序_Verilog实现VGA通信的驱动

猜你喜欢

转载自blog.csdn.net/QWERTYzxw/article/details/121326584