引言

  VGA:video Graphics array,视频图形阵列,阴极射线显像管(CRT)显示器时代产物,很多老显卡、笔记本电脑、投影仪所用接口,已经比较过时。

  CRT是模拟设备,所以VGA也采用模拟协议,虽然现在很多液晶显示器仍有VGA接口,但是是内置了AD转换,将模拟信号转换为数字信号。

  虽然VGA已经基本被DVI、HDMI、DP等接口替代,但无法否认其学习价值。

介绍

  扫描方式分为逐行扫描和隔行扫描。

  逐行扫描:左上方开始,左到右,上到下。扫完一行到下一行起始,CRT对电子束消隐;每行结束用行同步信号同步,全部结束用场同步信号同步,扫描回到屏幕左上方,同时场消隐。

  隔行扫描:隔一行扫描,扫描完回来扫剩下的行(显示器闪烁严重,用眼疲劳)

  消隐信号:针对老式显像管的成像扫描电路而言。电子枪所发出的电子束从屏幕的左上角开始向右扫描,一行扫完需将电子束从右边移回到左边以便扫描第二行。在移动期间就必须有一个信号加到电路上,使得电子束不能发出。不然这个回扫线会破坏屏幕图像的。这个阻止回扫线产生的信号就叫作消隐信号。

  显示带宽:可处理的频率范围,60HZ,640X480分辨率,则带宽640X480X60=18.4MHZ(实际上大于这个值,因为648X480是表示显示有效区域,还有相当一部分是无效区域),详见下面时序部分。但这个带宽一般来使不用我们自己来计算,有VESA标准,具体可以查看http://tinyvga.com/vga-timing,或者移步https://download.csdn.net/download/AD7533/12561449下载Proposed VESA and Industry Standards and Guidelines for Computer Display Monitor Timing (DMT)文档,其中包含了几乎所有类型显示器的标准,作为手册使用,如下图。

  

时序

  信号:共5个,分别为:R、G、B三基色,HS(行同步),VS(场同步)。

  HS信号:信号无效时(即不在有效显示区域)时,为高;信号有效时(即进入有效显示区域内),拉低;VS信号同理。如下图所示。

  当HS和VS信号同时有效(低电平),即可输出图像。

示例---利用FPGA和VGA实现方块碰撞

 环境

  1、vivado 2019.02,UE文本编辑器、Modelsim仿真环境

  2、Micro phase zynq-7010开发板

  3、TM043NDH02 LCD显示屏(开发板自带,有效480X272@60Hz,总525X286,有效区域为42~522、11~283)

 思路

  1、声明端口、变量及参数。

  1. module vga_lcd(
  2. input clk_50M,       //系统时钟
  3. input rst_n,       //复位
  4. output clk_9M,       //vga时钟
  5. output vga_en,        //vga数据有效信号,即行同步列同步都处于有效区
  6. output disp_en,       //vga显示开关
  7. output reg vga_hs,     //行同步
  8. output reg vga_vs,     //列同步
  9. output reg[23:0]vga_rgb   //三基色
  10. );
  11. parameter H_TOTAL = 525 - 1 ;//行计数总数
  12. parameter H_SYNC = 41 - 1 ;//行数据无效计数值
  13. parameter H_START = 43 - 1 ;//行数据开始有效计数值
  14. parameter H_END = 523 - 1 ;//行数据结束有效计数值
  15. parameter V_TOTAL = 286 - 1 ;//列计数总数
  16. parameter V_SYNC = 10 - 1 ;//列数据无效计数值
  17. parameter V_START = 12 - 1 ;//列数据开始有效计数值
  18. parameter V_END = 284 - 1 ;//行数据结束有效计数值
  19. parameter SQUARE_X = 150;//方块行
  20. parameter SQUARE_Y = 150;//方块列
  21. parameter SCREEN_X = 480;//行有效区域大小
  22. parameter SCREEN_Y = 272;//列有效区域大小
  23.  
  24. wire rst1; //时钟复位
  25. wire locked; //时钟稳定
  26. reg[10:0]cnt_x;
  27. reg[10:0]cnt_y;
  28. reg flag_x; //水平移动指示,0为右,1为左
  29. reg flag_y; //垂直移动指示,0为下,1为上
  30. reg [10:0]x;
  31. reg [10:0]y;
  32.  
  33. assign rst1=~rst_n; //高电平复位
  34. assign disp_en=1; //开

  2、开发板PL端时钟为50MHz,利用PLL IP进行分频(480X272X60≈9MHz)。

  1. clock instance_name(    //9M clk
  2. .clk_out1(clk_9M),
  3. .reset(rst1),
  4. .locked(locked),
  5. .clk_in1(clk_50M)
  6. );

  3、利用9MHz时钟分别对行(cnt_x)和列(cnt_y)计数。

  1. always@(posedge clk_9M or negedge rst_n)begin  //cnt_y计数
  2. if(~rst_n)begin
  3.   cnt_x<=0;
  4. end
  5. else if(cnt_x==H_TOTAL) begin
  6. cnt_x<=0;
  7. end
  8. else
  9.   cnt_x<=cnt_x+1;
  10. end

  4、根据计数值得到对应的行同步信号(vga_hs)和列(场)同步信号(vga_vs).

  1. always@(posedge clk_9M or negedge rst_n)begin //行同步信号
  2. if(~rst_n)begin
  3.   vga_hs<=1;
  4. end
  5. else if(cnt_x==H_TOTAL)begin
  6.   vga_hs<=1;
  7. end
  8. else if(cnt_x==H_SYNC)
  9.    vga_hs<=0;
  10. else
  11.    ga_hs<=vga_hs;
  12. end

  5、根据vga_hs和vga_vs得到vgs_en使能信号。

  1. assign vga_en=~(vga_vs||vga_hs); //信号有效使能

  6、根据移动标志flag_x和flag_y,设置方块移动方向。

  1. always@(posedge clk_9M or negedge rst_n)begin //方块左右移动
  2. if(~rst_n)begin
  3.   x<=0;
  4.   end
  5.   else if(flag_x==0&&cnt_x==H_TOTAL&&cnt_y==V_TOTAL)begin
  6.   x<=x+1;
  7. end
  8. else if(flag_x==1&&cnt_x==H_TOTAL&&cnt_y==V_TOTAL)begin
  9.   x<=x-1;
  10. end
  11. end

  7、根据方块移动方向及大小,判断是否到达边缘并改变移动标志。

  1. always@(posedge clk_9M or negedge rst_n)begin
  2.   if(~rst_n)begin
  3.   flag_x<=0;
      end
  4.   else if(flag_x==0&&cnt_x==H_TOTAL&&cnt_y==V_TOTAL&&x==(H_END-H_START-SQUARE_X-1))begin
  5. flag_x<=1;
  6.   end
  7.   else if(flag_x==1&&cnt_x==H_TOTAL&&cnt_y==V_TOTAL&&x==1) begin
  8. flag_x<=0;
  9.   end
  10. end

  8、输出色块和背景。

  1. always@(posedge clk_9M or negedge rst_n)begin
  2.   if(~rst_n)begin
  3.   vga_rgb<=0;
  4.   end
      else if(vga_en==1&&cnt_x>=H_START+x&&cnt_x<=H_START+x+SQUARE_X&&cnt_y>=y+V_START&&cnt_y<=V_START+y+SQUARE_Y)begin
  5.   ga_rgb<=24'hFFFFFF;
  6.   end
  7.   else if(vga_en==1)begin
  8. vga_rgb<=24'h000000;
  9.   end
  10. end

总结

  VGA的大概内容就这么多,写一个小东西大致就能掌握了。

  本次示例中的很多参数都以parameter给出的,对于不同的显示屏只需查手册,在实例化时填入对应参数即可,在移植时很方便。

  有什么错误之处还请指出。

  源码自取:https://download.csdn.net/download/AD7533/12563311

  

  

  

  

VGA详解及色块碰撞示例的更多相关文章

  1. ls(list)命令详解及生产使用示例

    文件有文件名与数据,在linux上被分为两个部分:用户数据(user data)与元数据(metadata) 用户数据,即文件数据块(data block),数据块是记录文件真实内容的地方,我们将其称 ...

  2. Android Fragment详解(六):Fragement示例

    把条目添加到动作栏 你的fragment们可以向activity的菜单(按Manu键时出现的东西)添加项,同时也可向动作栏(界面中顶部的那个区域)添加条目,这都需通过实现方法onCreateOptio ...

  3. Python爬虫之爬取淘女郎照片示例详解

    这篇文章主要介绍了Python爬虫之爬取淘女郎照片示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 本篇目标 抓取淘宝MM ...

  4. 【转】Java内部类详解

    一.内部类基础 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类.下面就先来了解一 ...

  5. sed 详解【转】

    原文地址:http://www.cnblogs.com/sparkdev/archive/2017/07/10/7138073.html 基本命令格式 sed [常用选项] 命令文本 输入 常用选项 ...

  6. MySQL表与表之间的关系详解

    外键 说到表与表之间的关系就不得不说到一个关键词:外键 MySQ中的外键是什么,和表与表之间有什么关联? 外键(foreign key)又叫外连接, 在数据库中发挥着重要的作用 尤其是对于表和表之间的 ...

  7. Solr系列三:solr索引详解(Schema介绍、字段定义详解、Schema API 介绍)

    一.Schema介绍 1. Schema 是什么? Schema:模式,是集合/内核中字段的定义,让solr知道集合/内核包含哪些字段.字段的数据类型.字段该索引存储. 2. Schema 的定义方式 ...

  8. (转)Mysql 多表查询详解

    MySQL 多表查询详解 一.前言  二.示例 三.注意事项 一.前言  上篇讲到mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...

  9. Linux curl 命令详解

    命令概要 该命令设计用于在没有用户交互的情况下工作. curl 是一个工具,用于传输来自服务器或者到服务器的数据.「向服务器传输数据或者获取来自服务器的数据」 可支持的协议有(DICT.FILE.FT ...

随机推荐

  1. linux(centos8):awk在系统运维中的常用例子

    一,awk的作用 1,用途 AWK是一种处理文本文件的语言, 是一个强大的文本分析工具 2,awk和sed的区别 awk适合按列(域)操作, sed适合按行操作 awk适合对文件的读取分析, sed适 ...

  2. mysql中事件失效如何解决

    重启Mysql服务可能会导致event_scheduler关闭,事件失效.解决方法如下: 1.解决办法: #查看是否开启 show variables like 'event_scheduler'; ...

  3. selenium-绕过登录

    第一种方式:chrome-debug 1.现在终端输入一下命令,启动Chrome-debug模式 #windows a.首先将chrome的环境添加到PATH中 b.进入cmd 命令栏,输入:chro ...

  4. jmeter环境变量配置

    参考博客:超全 https://blog.csdn.net/qq_39720249/article/details/80721777

  5. POI样式设置详细解析

    ````````由于看到网上对poi做报告合成的内容不是很全面, ````````自己最近又有新的需求, 作为勉励, 会慢慢补充详细的样式设置, 希望也能帮到各位 设置段落方向 (默认是纵向, 这里可 ...

  6. Vue.js 3.0搭配.NET Core写一个牛B的文件上传组件

    在开发Web应用程序中,文件上传是经常用到的一个功能. 在Jquery时代,做上传功能,一般找jQuery插件就够了,很少有人去探究上传文件插件到底是怎么做的. 简单列一下我们要做的技术点和功能点 使 ...

  7. (PatchGANs)Pecomputed Real-time Texture Synthesis With Markovian Generative Adversarial Networks

    Introduction: Deconvolution;   Computational costs; Strided convolutional nets; Markov patches; 1. Q ...

  8. JAVA NIO 基础学习

    package com.hrd.netty.demo.jnio; import java.io.BufferedReader; import java.io.IOException; import j ...

  9. 博客主题——cnbook

    主题预览 主题下载 gshang.cnbook.rar version:2020-05-29 gshang.cnbook@2.0.rar version:2020-08-25 .source-down ...

  10. 前端小程序——js+canvas 给图片添加水印

    市场上各种各样的图片处理器有很多,那么作为程序员的我们是不是应该自己做一个呢?那就从加水印开始吧 html: <canvas id="shuiyinTest"> < ...