0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FPGA的VGA驱动设计(附源工程)

FPGA技术江湖 来源:FPGA技术江湖 2025-01-14 11:31 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

设计背景

VGA (Video Graphics Array) 即视频图形阵列,是IBM于1987年随PS/2机(PersonalSystem 2)一起推出的使用模拟信号的一种视频传输标准。这个标准对于现今的个人电脑市场已经十分过时。但在当时具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域取得了广泛的应用,是众多制造商所共同支持的一个低标准。

设计原理

VGA的实体图与接口示意图,如下图所示,它有15个针孔:

380c9a24-d144-11ef-9310-92fbcf53809c.png

3822736c-d144-11ef-9310-92fbcf53809c.png

在本次设计使用的开发板中,VGA的电路原理图如下图所示:

3839ca4e-d144-11ef-9310-92fbcf53809c.png

通过原理图,我们不难发现,VGA需要我们控制的接口只有5个:

384b9ae4-d144-11ef-9310-92fbcf53809c.png

显示器的扫描规律是什么?本设计采用逐行扫描,逐行扫描是扫描从屏幕左上角一点开始,从左向右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。通过这种扫描规律,很容易看出,在设计两个有效范围计数器时,场同步信号计数器是以行同步信号计数器为周期的。

VGA的显示标准如下表所示:

38578e62-d144-11ef-9310-92fbcf53809c.png

对于普通的VGA显示器都要严格遵循“VGA工业标准”,否则可能会损害VGA显示器,因此我们在设计时VGA控制器时,都需要参考显示器的显示标准,下面是VGA的行扫描时序与场扫描时序:

行扫描时序:

38690b60-d144-11ef-9310-92fbcf53809c.png

场扫描时序:

3878a5b6-d144-11ef-9310-92fbcf53809c.png

根据上述显示器的扫描参数以及扫描时序,例如800*600@60的显示模式,60指得是显示器图像的刷新频率,时钟40MHz指得是一个像素输出的频率。800*600为VGA的分辨率,指有效显示区域为时序中的c段只有800*600,也就是行计数在[216,1016],列计数在[27,627],在这个范围内,给RGB色值才会有效。

在VGA 工业标准显示模式要求:行同步、场同步都为负极性,即同步脉冲要求是负脉冲。行同步信号上电拉高,在行同步计数为0时拉低a个时钟周期,即128,之后拉高,在行同步计数到1055时,行同步计数器清零,场同步计数器加1。在行扫描时序中,扫描计数时,周期就是一个像素点的时间。

场同步信号上电拉高,在场同步计数为0时拉低场同步a个时钟周期,即4,之后拉高,在场同步计数到627时,场同步计数器清零。

在VGA控制器中,还需要控制三个接口,即三种基色(R、G、B),它们共专用8位,分别是Red为3位,Green为3位,Blue为3位,所以可以显示256种颜色,RGB数据的格式如下表所示:

388275a0-d144-11ef-9310-92fbcf53809c.png

设计框架

本设计选择的VGA显示标准为800*600@60,实现点亮整个屏幕,并显示为全红。通过分析设计的功能,可以得到如下的顶层架构:

38a32796-d144-11ef-9310-92fbcf53809c.png

顶层模块端口列表如下:

38bc011c-d144-11ef-9310-92fbcf53809c.png

vga_pll模块是为了满足分辨率800*600@60的时钟为40MHz,而ZX_1开发板的系统时钟为50MHz,通过锁相环,将50MHz转化为40MHz。vga_control模块是为了设定行场同步信号,并标定出有效显示区域,并输出控制颜色的po_rgb信号。为了便于移植,根据800*600@60分辨率下的参数,对其进行参数化定义。

设计代码

顶层模块vga_display_pure代码:

module vga_display_pure (pi_clk, pi_rst_n, po_hs, po_vs, po_rgb);
  
  input pi_clk, pi_rst_n; //系统时钟复位
  output po_vs;  //VGA场同步信号
  output po_hs;  //VGA行同步信号
  output [7:0] po_rgb;  //VGA场红绿蓝三基色
  
  //----------------VGA时序-----------------------------------
  //    显示模式      时钟     
  //    800*600@60  40MHz  
  //行/场  同步(a)  消隐后沿(b)  有效显示(c)  消隐前沿(d)  扫描时间(e)
  //hs    128    88        800      40        1056
  //vs    4      23        600      1        628  
  
  wire vga_clk;
  
  vga_pll vga_pll_dut(
    .areset(~pi_rst_n),
    .inclk0(pi_clk),
    .c0(vga_clk)
  );
  
  vga_control vga_control_dut(
    .pi_clk(vga_clk), 
    .pi_rst_n(pi_rst_n), 
    .po_hs(po_hs),
    .po_vs(po_vs),
    .po_rgb(po_rgb)
  );
  
endmodule

VGA控制器vga_control 模块代码:

module vga_control (pi_clk, pi_rst_n, po_hs, po_vs, po_rgb);
  
  input pi_clk, pi_rst_n; //系统时钟复位
  output reg po_vs;  //VGA场同步信号
  output reg po_hs;  //VGA行同步信号
  output [7:0] po_rgb;  //VGA场红绿蓝三基色
  
  //----------------VGA时序-----------------------------------
  //    显示模式      时钟     
  //    800*600@60  40MHz  
  //行/场  同步(a)  消隐后沿(b)  有效显示(c)  消隐前沿(d)  扫描时间(e)
  //hs    128    88        800      40        1056
  //vs    4      23        600      1        628  
  
  //  行(Horizontal)扫描  Parameter (像素)
  parameter  H_A  =  128;
  parameter  H_B  =  80;
  parameter  H_C  =  800;
  parameter  H_D  =  40;
  parameter  H_E   =  1056;
  
  
  //  场(Vertical)扫描  Parameter (行数)
  parameter  V_A  =  4;
  parameter  V_B  =  23;
  parameter  V_C  =  600;
  parameter  V_D  =  1;
  parameter  V_E  =  628;
  
  //行扫描计数器, 
  reg [10:0] hcnt;
  
  always @ (posedge pi_clk or negedge pi_rst_n)
  begin
    if (!pi_rst_n)
      hcnt <= 11'd0;
    else
      begin
        if (hcnt == (H_E - 1'b1)) //扫描完一行像素
          hcnt <= 11'd0;
        else
          hcnt <= hcnt + 1'b1;
      end 
  end 
  
  //场扫描计数器
  reg [10:0] vcnt;  
  
  always @ (posedge pi_clk or negedge pi_rst_n)
  begin
    if (!pi_rst_n)
      vcnt <= 11'd0;
    else if (vcnt == (V_E - 1'b1)) 
      vcnt <= 11'd0;
    else if (hcnt == (H_E - 1'b1))
      vcnt <= vcnt + 1;
  end   


  //行同步输出
  always @ (posedge pi_clk or negedge pi_rst_n)
  begin
    if (!pi_rst_n)
      po_hs <= 1'b1;
    else if (hcnt < H_A)
      po_hs <= 1'b0;
    else
      po_hs <= 1'b1;
  end 
  
  //assign po_hs = (hcnt <= H_A - 1'b1) ? 1'b0 : 1'b1;
  
  //场同步输出
  always @ (posedge pi_clk or negedge pi_rst_n)
  begin
    if (!pi_rst_n)
      po_vs <= 1'b1;
    else if (vcnt < V_A)
      po_vs <= 1'b0;
    else
      po_vs <= 1'b1;
  end 
  
  //assign po_vs = (vcnt <= V_A - 1'b1) ? 1'b0 : 1'b1;
  
  wire rgb_en;
  
  assign rgb_en = (hcnt >= H_A + H_B  && hcnt < H_A + H_B + H_C) && 
            (vcnt >= V_A + V_B  && vcnt < V_A + V_B + V_C) ? 1'b1 : 1'b0;
  
  assign po_rgb = rgb_en ? 8'b111_000_00 : 8'b0000_0000;
  
endmodule 

通过编译后生成的RTL视图如下:

38d27730-d144-11ef-9310-92fbcf53809c.png

仿真测试

为了验证本设计的逻辑正确性,我们先对其进行了仿真,在仿真时,为了减少仿真的时间,先将行、场扫描的对应参数,进行了缩放,这样不仅节约了仿真时间,同时由于扫描数据量变少,更加便于分析观察。其仿真代码所示:

`timescale 1ns/1ps  //仿真时间精度时间单位


module vga_display_pure_tb;
  
  reg pi_clk, pi_rst_n; //系统时钟复位
  wire  po_vs;  //VGA场同步信号
  wire  po_hs;  //VGA行同步信号
  wire  [7:0] po_rgb;  //VGA场红绿蓝三基色
  
  //初始化数据,并附相应初值
  initial begin
    pi_clk = 0;
    pi_rst_n = 0;  
    #200.1 pi_rst_n = 1;  
  end 


  vga_display_pure vga_display_pure_inst (
    .pi_clk(pi_clk), 
    .pi_rst_n(pi_rst_n), 
    .po_hs(po_hs), 
    .po_vs(po_vs),
    .po_rgb(po_rgb)
  );
  
  always #10 pi_clk = ~pi_clk;  //50MHz时钟描述


endmodule

仿真图:

38f5382e-d144-11ef-9310-92fbcf53809c.png

rgb_en信号,只有当po_vs和po_hs同时为高电平时,才有效,并且有po_rgb Red基色信号输出,时序仿真细节图如下所示:

3911e226-d144-11ef-9310-92fbcf53809c.png

通过观察和分析时序图,可以发现与设计吻合,接下来则可进行管脚分配,并下板验证,验证结果如下:

3922c258-d144-11ef-9310-92fbcf53809c.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1665

    文章

    22587

    浏览量

    641144
  • VGA
    VGA
    +关注

    关注

    5

    文章

    579

    浏览量

    66674

原文标题:源码系列:基于FPGA的VGA驱动设计(附源工程)

文章出处:【微信号:HXSLH1010101010,微信公众号:FPGA技术江湖】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FPGA实战演练逻辑篇55:VGA驱动接口时序设计之2同步接口

    VGA驱动接口时序设计之2同步接口本文节选自特权同学的图书《FPGA设计实战演练(逻辑篇)》配套例程下载链接:http://pan.baidu.com/s/1pJ5bCtt 好,有了
    发表于 07-29 11:19

    Xilinx FPGA入门连载68:VGA驱动ColorBar显示

    `Xilinx FPGA入门连载68:VGA驱动ColorBar显示特权同学,版权所有配套例程和更多资料下载链接:http://pan.baidu.com/s/1jGjAhEm 1 功能简介如图所示
    发表于 04-11 09:51

    例说FPGA连载28:VGA显示驱动子板设计

    ``例说FPGA连载28:VGA显示驱动子板设计特权同学,版权所有配套例程和更多资料下载链接:http://pan.baidu.com/s/1c0nf6Qc SF-VGA板载用于
    发表于 09-05 18:46

    FPGA零基础学习:VGA协议驱动设计

    不多说,上货。VGA协议驱动设计本篇实现基于叁芯智能科技的SANXIN -B01 FPGA开发板,以下为配套的教程,如有入手开发板,可以登录官方淘宝店购买,还有配套的学习视频。叁芯智能科技 F
    发表于 03-22 16:51

    基于 FPGA Vivado 信号发生器设计(工程

    、书籍、源码、技术文档…(2023.07.09更新) 本篇掌握基于 FPGA Vivado 信号发生器设计(工程),掌握基于添加文件和IP的Vivado
    发表于 08-15 19:57

    基于 FPGA Vivado 示波器设计(工程

    今天给大侠带来基于 FPGA Vivado 示波器设计,开发板实现使用的是Digilent basys 3,话不多说,上货。 需要工程可以在以下资料获取里获取。 资料汇总|FPGA
    发表于 08-17 19:31

    基于 FPGA Vivado 的数字钟设计(工程

    今天给大侠带来基于 FPGA Vivado 的数字钟设计,开发板实现使用的是Digilent basys 3。话不多说,上货。 需要工程可以在以下资料获取里获取。 资料汇总|FPGA
    发表于 08-18 21:18

    fpga_vga显示程序

    fpga vga 显示,介绍了如何实现vga的操作以及如何配置
    发表于 03-15 18:29 8次下载

    VGA显示IP核(包括驱动

    Xilinx FPGA工程例子源码:VGA显示IP核(包括驱动
    发表于 06-07 14:54 18次下载

    基于XILINX的XC3系列FPGAVGA控制器的VHDL

    Xilinx FPGA工程例子源码:基于XILINX的XC3系列FPGAVGA控制器的VHDL源程序
    发表于 06-07 15:07 12次下载

    基于FPGAVGA图像控制器的设计与实现

    基于FPGAVGA图像控制器的设计与实现
    发表于 08-30 15:10 13次下载

    vga图像显示_fpga控制vga显示图片

    本文为大家分享fpga控制vga显示图片的方法。
    发表于 01-15 15:56 8430次阅读

    基于叁芯智能科技的SANXIN -B01 FPGA开发板的VGA协议驱动设计

    VGA协议驱动设计 作者:郝旭帅校对:陆辉 本篇实现基于叁芯智能科技的SANXIN -B01 FPGA开发板,以下为配套的教程,如有入手开发板,可以登录官方淘宝店购买,还有配套的学习视频
    的头像 发表于 09-28 11:49 3909次阅读
    基于叁芯智能科技的SANXIN -B01 <b class='flag-5'>FPGA</b>开发板的<b class='flag-5'>VGA</b>协议<b class='flag-5'>驱动</b>设计

    使用FPGA CPLD的VGA显示8种颜色的程序和工程文件

    本文档的主要内容详细介绍的是使用FPGA CPLD的VGA显示8种颜色的程序和工程文件免费下载。
    发表于 10-30 17:02 8次下载
    使用<b class='flag-5'>FPGA</b> CPLD的<b class='flag-5'>VGA</b>显示8种颜色的程序和<b class='flag-5'>工程</b>文件

    使用FPGA的的Uart发送图像数据到VGA显示的工程文件免费下载

    本文档的主要内容详细介绍的是使用FPGA的的Uart发送图像数据到VGA显示的工程文件免费下载。
    发表于 01-19 15:53 7次下载