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

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

3天内不再提示

FPGA学习系列:27. VGA驱动设计

FPGA学习交流 2018-08-13 13:45 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

设计背景:

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

设计原理:

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


在开发板(ZX_1)中,VGA电路原理图如下图所示:

image.png


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

image.png


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

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

image.png


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

行扫描时序:

image.png


场扫描时序:

image.png


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

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

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

VGA控制器中,还需要控制三个接口,即三种基色(RGB),它们共专用8位,分别是Red3位,Green3位,Blue3位,所以可以显示256种颜色,RGB数据的格式如下表所示:

image.png


设计架构图:

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

image.png


顶层模块端口列表如下:

image.png


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

设计代码:

VGA控制器代码:

0modulevga_control (pi_clk,pi_rst_n,po_hs,po_vs,po_rgb);

1

2inputpi_clk,pi_rst_n;//系统时钟复位

3outputregpo_vs;//VGA场同步信号

4outputregpo_hs;//VGA行同步信号

5output[7:0]po_rgb;//VGA场红绿蓝三基色

6

7//----------------VGA时序-----------------------------------

8// 显示模式 时钟

9// 800*600@60 40MHz

10///场 同步(a) 消隐后沿(b) 有效显示(c) 消隐前沿(d) 扫描时间(e)

11//hs 128 88 800 40 1056

12//vs 4 23 600 1 628

13

14// (Horizontal)扫描 Parameter (像素)

15parameterH_A =128;

16parameterH_B =80;

17parameterH_C =800;

18parameterH_D =40;

19parameterH_E =1056;

20

21

22// (Vertical)扫描 Parameter (行数)

23parameterV_A =4;

24parameterV_B =23;

25parameterV_C =600;

26parameterV_D =1;

27parameterV_E =628;

28

29//行扫描计数器,

30reg[10:0]hcnt;

31

32always@(posedgepi_clk ornegedgepi_rst_n)

33begin

34if(!pi_rst_n)

35hcnt <=11'd0;

36else

37begin

38if(hcnt ==(H_E -1'b1))//扫描完一行像素

39hcnt <=11'd0;

40else

41hcnt <=hcnt +1'b1;

42end

43end

44

45//场扫描计数器

46reg[10:0]vcnt;

47

48always@(posedgepi_clk ornegedgepi_rst_n)

49begin

50if(!pi_rst_n)

51vcnt <=11'd0;

52elseif(vcnt ==(V_E -1'b1))

53vcnt <=11'd0;

54elseif(hcnt ==(H_E -1'b1))

55vcnt <=vcnt +1;

56end

57

58//行同步输出

59always@(posedgepi_clk ornegedgepi_rst_n)

60begin

61if(!pi_rst_n)

62po_hs <=1'b1;

63elseif(hcnt <H_A)

64po_hs <=1'b0;

65else

66po_hs <=1'b1;

67end

68

69//assign po_hs = (hcnt <= H_A - 1'b1) ? 1'b0 : 1'b1;

70

71//场同步输出

72always@(posedgepi_clk ornegedgepi_rst_n)

73begin

74if(!pi_rst_n)

75po_vs <=1'b1;

76elseif(vcnt <V_A)

77po_vs <=1'b0;

78else

79po_vs <=1'b1;

80end

81

82//assign po_vs = (vcnt <= V_A - 1'b1) ? 1'b0 : 1'b1;

83

84wirergb_en;

85

86assignrgb_en =(hcnt >=H_A +H_B &&hcnt <H_A +H_B +H_C)&&

87(vcnt >=V_A +V_B &&vcnt <V_A +V_B +V_C)?1'b1:1'b0;

88

89assignpo_rgb =rgb_en ?8'b111_000_00:8'b0000_0000;

90

91endmodule


顶层文件如下所示:

0modulevga_display_pure (pi_clk,pi_rst_n,po_hs,po_vs,po_rgb);

1

2inputpi_clk,pi_rst_n;//系统时钟复位

3outputpo_vs;//VGA场同步信号

4outputpo_hs;//VGA行同步信号

5output[7:0]po_rgb;//VGA场红绿蓝三基色

6

7//----------------VGA时序-----------------------------------

8// 显示模式 时钟

9// 800*600@60 40MHz

10///场 同步(a) 消隐后沿(b) 有效显示(c) 消隐前沿(d) 扫描时间(e)

11//hs 128 88 800 40 1056

12//vs 4 23 600 1 628

13

14wirevga_clk;

15

16vga_pll vga_pll_dut(

17.areset(~pi_rst_n),

18.inclk0(pi_clk),

19.c0(vga_clk)

20);

21

22vga_control vga_control_dut(

23.pi_clk(vga_clk),

24.pi_rst_n(pi_rst_n),

25.po_hs(po_hs),

26.po_vs(po_vs),

27.po_rgb(po_rgb)

28);

29

30endmodule

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

image.png

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

0`timescale1ns/1ps//仿真时间精度时间单位

1

2modulevga_display_pure_tb;

3

4regpi_clk,pi_rst_n;//系统时钟复位

5wirepo_vs;//VGA场同步信号

6wirepo_hs;//VGA行同步信号

7wire[7:0]po_rgb;//VGA场红绿蓝三基色

8

9//初始化数据,并附相应初值

10initialbegin

11pi_clk =0;

12pi_rst_n =0;

13#200.1pi_rst_n =1;

14

15end

16

17vga_display_pure vga_display_pure_inst (

18.pi_clk(pi_clk),

19.pi_rst_n(pi_rst_n),

20.po_hs(po_hs),

21.po_vs(po_vs),

22.po_rgb(po_rgb)

23);

24

25always#10pi_clk =~pi_clk;//50MHz时钟描述

26

27endmodule


仿真图:

image.png


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

image.png


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


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

    关注

    1664

    文章

    22502

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    探索Arria V系列FPGA:高性能与低功耗的完美结合

    探索Arria V系列FPGA:高性能与低功耗的完美结合 在当今的电子设计领域,FPGA(现场可编程门阵列)凭借其灵活性和高性能,成为了众多工程师的首选。而Intel的Arria V系列
    的头像 发表于 03-29 13:05 189次阅读

    VGA视频接口保护

    The VGA Input Port VGA输入端口 在大多数VGA输入电路设计中,通常存在两个电源:一个来自连接器的DSUB-5V引脚(其电位源自另一个VGA输出端口),另一个来自
    的头像 发表于 02-28 15:34 203次阅读
    <b class='flag-5'>VGA</b>视频接口保护

    Atmel AT17LV系列FPGA配置EEPROM的全面解析

    Atmel AT17LV系列FPGA配置EEPROM的全面解析 在FPGA设计领域,配置存储器的选择至关重要。Atmel的AT17LV系列FPGA
    的头像 发表于 02-27 16:15 346次阅读

    基于友晶DE10-Nano开发板的VGA显示控制器模块设计

    VGA显示控制器模块vga_generator.v(位于DemonstrationsFPGAHDMI_TXvpg_source路径下)可生成符合DMT(Display Monitor Timing 显示器时序)时序的视频信号。
    的头像 发表于 02-26 13:43 5598次阅读
    基于友晶DE10-Nano开发板的<b class='flag-5'>VGA</b>显示控制器模块设计

    UCC2753x系列单通道高速栅极驱动器:特性、应用与设计要点详解

    开关损耗起着关键作用。UCC2753x系列单通道高速栅极驱动器凭借其出色的性能和丰富的功能,成为众多应用场景中的理想选择。本文将详细介绍UCC2753x系列驱动器的特性、应用以及设计要
    的头像 发表于 01-09 16:05 824次阅读

    TDK HVC27系列高压接触器:高压直流切换的可靠之选

    TDK HVC27系列高压接触器:高压直流切换的可靠之选 在高压直流切换领域,一款性能可靠、设计合理的接触器至关重要。今天,我们就来深入了解一下TDK的HVC27系列高压接触器,看看它
    的头像 发表于 12-25 14:15 655次阅读

    广州易显VGA驱动板设置动态图片控件实验流程

    目录一、实验目的二、实验设备三、实验步骤3.1新建工程3.2新建画面3.3添加控件3.4模拟工程3.5硬件验证一、实验目的单片机或PLC的串口与VGA驱动板相连驱动大尺寸VGA显示器或
    的头像 发表于 12-01 14:06 1235次阅读
    广州易显<b class='flag-5'>VGA</b><b class='flag-5'>驱动</b>板设置动态图片控件实验流程

    广州易显VGA卡设置进度条实验教程

    目录一、实验目的二、实验设备三、实验步骤3.1新建工程3.2新建画面3.3添加控件3.4模拟工程3.5硬件验证一、实验目的单片机或PLC的串口与VGA卡相连驱动大尺寸VGA卡显示器或电视机进行
    的头像 发表于 11-26 10:51 1764次阅读
    广州易显<b class='flag-5'>VGA</b>卡设置进度条实验教程

    开源RISC-V处理器(蜂鸟E203)学习(二)修改FPGA综合环境(移植到自己的Xilinx FPGA板卡)

    1.简述 首先感谢芯来开源了蜂鸟E203 risc-v处理器,提供了比较完整的工程环境、配套的软硬件。但是配套的FPGA板卡实在太贵,对于自费学习的来说是不小的学习成本,而且我也认为完备环境
    发表于 10-31 08:46

    Pico2-ICE FPGA开发板的应用示例

    FPGA 和 MCU 结合的开发板不多,而 Pico2‑ICE 则把小巧、灵活和易上手完美结合。搭载 RP2350 双核 RISC-V MCU + Lattice iCE40UP5K FPGA,配合官方 SDK,你可以一步步跑通各种示例,从 LED 到
    的头像 发表于 09-06 10:02 1301次阅读
    Pico2-ICE <b class='flag-5'>FPGA</b>开发板的应用示例

    FPGA在机器学习中的具体应用

    随着机器学习和人工智能技术的迅猛发展,传统的中央处理单元(CPU)和图形处理单元(GPU)已经无法满足高效处理大规模数据和复杂模型的需求。FPGA(现场可编程门阵列)作为一种灵活且高效的硬件加速平台
    的头像 发表于 07-16 15:34 3088次阅读

    如何构建带有VGA输出的低分辨率热成像

    在本文中,我们将介绍如何构建带有VGA输出的低分辨率热成像。该解决方案基于Melexis MLX90640红外阵列、FPGA S7 50开发板(AMD-Xilinx Spartan-7 FPGA,带
    的头像 发表于 07-15 11:06 4370次阅读
    如何构建带有<b class='flag-5'>VGA</b>输出的低分辨率热成像

    开源电机驱动,免费直播学习!

    开源电机驱动,免费直播学习!
    的头像 发表于 06-13 10:07 2011次阅读
    开源电机<b class='flag-5'>驱动</b>,免费直播<b class='flag-5'>学习</b>!

    VGA接口静电保护方案

    一、概述VGA(VideoGraphicsArray)接口在实际应用中容易受到静电放电(ESD,ElectrostaticDischarge)的影响,特别是在插拔电缆或触摸端口时。如果不加保护
    的头像 发表于 06-09 13:38 1252次阅读
    <b class='flag-5'>VGA</b>接口静电保护方案

    VGA和DP的具体区别

    VGA和DP是两种常见的显示接口,它们在设计、性能和应用方面有显著区别。
    的头像 发表于 05-14 16:36 3649次阅读