VGA显示(FPGA学习笔记四)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

对VGA的学习与实现,包含VGA的原理、FPGA的完整实现过程,使用FPGA开发板artix-7A35ftg256-1。


一、VGA的基本原理

VGA(Video Graphics Array)视频图形阵列是IBM于1987年随PS/2机一起推出的一种使用模拟信号的视频传输标准,具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用。不支持热插拔,不支持音频传输。

1.1 管脚

![在这里插入图片描述](https://img-blog.csdnimg.cn/3b8715b754b943c3adf0d3232fa1c118.png
1~3:红绿蓝,为光的三原色
13:行同步,执行水平同步(Hsync)扫描
14:列同步,执行垂直同步(Vsync)扫描


在这里插入图片描述
其中1、2、3接口的任意一个都连有多个电阻。图示为4K、2K、1K、510四种电阻,进行线或后加载到端口上。这种设计的权重约为8421,因此可以用二进制数字表示颜色。每种颜色的数字范围0000~1111,一共有三种颜色,所以总共是12位色(4096色)


1.2 VGA扫描

要显示整个图像,一行扫描完成后要进行回扫,然后开始下一行的扫描。所有行扫描完成后,需要进行垂直回扫完成扫描过程。垂直扫描的周期长,完成整个屏幕的显示,也称为场或帧。回扫过程需要消隐。
行场消隐信号:是针对老式显像管的成像扫描电路而言的。电子枪所发出的电子束从屏幕的左上角开始向右扫描,一行扫完需将电子束从右边移回到左边以便扫描第二行。在移动期间就必须有一个信号加到电路上,使得电子束不能发出。不然这个回扫线会破坏屏幕图像的。这个阻止回扫线产生的信号就叫作消隐信号,场信号的消隐也是一个道理。

在这里插入图片描述


VESA中定义行时序和场时序都需要同步脉冲(Sync a)、显示后沿(Back porch b)、显示时序段(Display interval c)和显示前沿(Front porch d)四部分。由VGA的行时序可知:每一行都有一个负极性行同步脉冲(Sync a),是数据行的结束标志,同时也是下一行的开始标志。在显示时间段(Display interval c)之外没有图像投射到屏幕是插入消隐信号,当消隐有效时,RGB信号无效,屏幕不显示数据。
在这里插入图片描述


VGA显示器是由一个一个的像素点组成的,如果有x行y列,就有x*y个像素点。按照规则,要一行一行地显示直到所有行显示完。这种方式也称为扫描。行数据时序就是一行数据的显示时序。
逐行扫描,每一行的时间是垂直扫描的一部分。因此,要完成显示驱动,最重要的工作就是实现水平同步(扫描〉Hsync和垂直同步(扫描)Vsync信号的时序。

在这里插入图片描述


分辨率、频率参数,其中时钟是每个像素点的刷新频率
在这里插入图片描述


二、FPGA实现

1.IP核调用

假设采用800×600@75的模式:
75 ∗ 1056 ∗ 625 = 49.5 M . 75*1056*625=49.5M. 751056625=49.5M.因此需要49.5M的时钟。现在有50M的时钟,要想得到49.5M的时钟,最直接简单合理的方法就是使用VIVADO提供的IP核。
clockwizard的窗口弹出,可以看到有IP符号和5个页框。在第一个页框(时钟选项页)中修改输入时钟频率为50MHz,然后切换到第二个页框(输出时钟)。在第二个页框中,将第一个输出时钟选中,将频率修改为49.5MHz。然后不选下面的复位(reset)和锁住(locked)检查框。这时得到下图所示的窗口。
在这里插入图片描述

2.电路设计

代码如下(示例):

module v_vga(
    input clk,
    //input sw,
   // output led,
    output Vsync,
    output Hsync,
    output [3:0]vgaRed,
    output [3:0]vgaGreen,
    output [3:0]vgaBlue
    );
    parameter 
    ta=80,tb=160,tc=800,td=16,te=1056,to=3,tp=21,tq=600,tr=1,ts=625;
    reg[10:0] x_counter=0;
    reg[10:0] y_counter=0;
    reg[2:0] colour;
    wire clk_vga;
 //   assign led=sw;

//调用的ip核模块
clk_wiz_0  ddd 
(
     .clk_out1(clk_vga),
     .clk_in1(clk)
 );
 //进行扫描   
  always @(posedge clk_vga) begin
    if (x_counter==te-1) begin 
            x_counter = 0;
            if(y_counter==ts-1) begin
                y_counter=0;
             end   
            else begin
                y_counter = y_counter+1;
            end
     end
     else begin
        x_counter = x_counter+1;
     end
  end
  //
  always @(x_counter or y_counter) begin
    if (x_counter<ta+tb) colour<=3'b000;
        else if (x_counter<ta+tb+300) colour<=3'b100;
        else if (x_counter<ta+tb+600) colour<=3'b010;
        else if (x_counter<ta+tb+800) colour<=3'b001;
        else colour<=3'b000;
  end
  assign vgaRed={4{colour[2]}};
  assign vgaGreen={4{colour[1]}};
  assign vgaBlue={4{colour[0]}};
  assign Hsync=!(x_counter<ta);
  assign Vsync=!(y_counter<to);
endmodule



3.仿真测试

module sim_vga;
    reg clk;
  //  reg sw;
  //  wire led;
    wire Vsync;
    wire Hsync;
    wire vgaRed;
    wire vgaGreen;
    wire vgaBlue;
v_vga tta( clk, Vsync, Hsync,vgaRed, vgaGreen,vgaBlue
    );
    initial begin
        clk=1;
    end
   always #10 clk=~clk;
endmodule

仿真结果
在这里插入图片描述

4.引脚约束

## CLK
set_property PACKAGE_PIN D4 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]  
# HS
set_property PACKAGE_PIN R13 [get_ports Hsync]
set_property IOSTANDARD LVCMOS33 [get_ports Hsync]  
# VS
set_property PACKAGE_PIN T13 [get_ports Vsync]
set_property IOSTANDARD LVCMOS33 [get_ports Vsync]  
#  RGB
set_property PACKAGE_PIN F5 [get_ports {vgaRed[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed[0]}]  
set_property PACKAGE_PIN F4 [get_ports {vgaRed[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed[1]}]  
set_property PACKAGE_PIN M16 [get_ports {vgaRed[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed[2]}]  
set_property PACKAGE_PIN M15 [get_ports {vgaRed[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed[3]}]  

set_property PACKAGE_PIN N16 [get_ports {vgaGreen[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen[0]}]  
set_property PACKAGE_PIN P15 [get_ports {vgaGreen[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen[1]}]  
set_property PACKAGE_PIN P16 [get_ports {vgaGreen[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen[2]}]  
set_property PACKAGE_PIN R15 [get_ports {vgaGreen[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen[3]}]  

set_property PACKAGE_PIN R16 [get_ports {vgaBlue[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue[0]}]  
set_property PACKAGE_PIN T15 [get_ports {vgaBlue[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue[1]}] 
set_property PACKAGE_PIN P14 [get_ports {vgaBlue[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue[2]}] 
set_property PACKAGE_PIN T14 [get_ports {vgaBlue[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue[3]}] 

5.实现结果

在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值