FPGA-VGA成像原理与时序

什么是VGA:

VGA, Video Graphics Array。即视频图形阵列,具有分辨率高、显示速率快、颜色丰富等优点。VGA接口不但是CRT显示设备的标准接口,同样也是LCD液晶显示设备的标准接口,具有广泛的应用范围。在FGPA中,常广泛用于图像处理等领域。

VGA 显示器成像原理

在 VGA 标准刚兴起的时候,常见的 VGA 接口彩色显示器一般基于 CRT(阴极射线管) 实现,色彩由 RGB 三基色组成,显示是用逐行扫描的方式。下图为基于 CRT 的显示器实物图。

阴极射线枪发出的电子束打在涂有荧光粉的荧光屏上,产生 RGB 三基色,合成一个彩 色像素,扫描从屏幕的左上方开始,从左到右,从上到下进行扫描,每扫完一行,电子束都 回到屏幕的下一行左边的起始位置。

在回扫的过程中,电子枪不能发射电子,否则会影响荧光屏上既有图像的颜色,所以 回扫期间,需要进行行消隐,简单来说就是关闭电子枪。每行结束时,用行同步信号进行行 同步,图中从右上方向左下方的斜向虚线就是其回行扫示意图。

当整个屏幕的所有行都扫描完后,使用场同步信号进行场同步,并使扫描回到屏幕的 左上方。同样的,为了避免电子枪在回到左上方的过程中发出的电子破坏荧光屏上既有的图 像内容,这个回扫的过程也需要关闭电子枪,即场消隐。

随着显示技术的发展,出现了液晶显示器,液晶显示器让显示设备彻底摆脱了厚重的 机身,也为便携式计算机的出现创造了可能。

液晶显示器的成像原理与 CRT 不同。液晶显示器是通过改变对液晶像素点单元施加电 压的电压大小,来改变液晶单元的透光性。在液晶单元背后发射白光,并添加三色滤光片, 分别使 R、G、B 这 3 种光线透过滤光片,最后通过 3 个像素点合成一个彩色像素点,从而 实现彩色显示。

由于液晶技术晚于 CRT 显示技术诞生,在液晶显示器出现的时候,计算机显示接口已 经确定,很难再突然改变。所以为了能够兼容传统的显示接口,液晶显示器通过内部电路实 现了对 VGA 接口的完全兼容。因此,在使用显示器时,只要该显示器带有标准的 VGA 接口, 就不用去关注其成像原理,直接使用标准的 VGA 时序即可驱动。

当使用 VGA 接口传输图像时,显示驱动芯片(如显卡)输出的 RGB 数据先要经过 DAC 转换为 3 路分别代表 R、G、B 颜色分量的模拟信号,送到 VGA 接口,这些模拟信号经由 VGA 线缆到达显示器的 VGA 接口,对于模拟的 CRT 显示器,这些信号会直接被放大后用于驱动 电子枪发射电子,而对于液晶显示器,则需要显示器使用专门的模拟数字转换芯片将模拟信 号再转换为数字信号后,去驱动 RGB 接口的液晶显示屏显示图像。

VGA 时序

CRT 行扫描过程

对于 CRT 显示器,虽然扫描的时候是按照一行一行的方式进行的,但不是扫描完一行 有效数据段之后就立马返回,而是会继续向右扫描一段区域,这个区域称为右边界区域 (horizontal right border),该区域已经不在有效的显示范围内,如果从物理结构的角度来说, 这一段对应的荧光屏玻璃上就不再有荧光粉了,但是电子枪还在继续向右走,可以形象理解为显示器右边的黑边。同样的,显示器左边也有这样一段黑边,在开始显示有效数据之 前,电子枪扫描到的这段区域同样也是没有荧光粉的,不会显示图像, 这个区域称为左边界区域(horizontal left border)

那么,电子枪什么时候会到最左侧准备开始新一行图像的扫描呢?当电子枪扫描一行 图像到达荧光屏的最右端后,其并不会自动回到最左边准备下一行,而是需要有一个通知信 号,通知其回去,这个通知信号就是行同步信号脉冲(horizontal sync pulse)。行同步信号是 一个脉冲,当该脉冲出现后,电子枪的指向会在一定时间内从最右侧回到显示屏的最左侧。 而这个回去的过程需要耗费一定的时间,这个时间就称为 horizontal back porch。这也是这个名词中 back 的意义所在,即出现行同步信号后,电子枪从显示屏最右侧回到最左侧的时间。 

当电子枪扫描过了右侧没有荧光粉的区域后,还没有收到回到最左侧的命令(行同步信号脉冲)之前,电子枪需要关闭以实现消隐,这个消隐的时间段就称为 horizontal front porch, 直观一点理解就是完成了一行图像的扫描,但还没收到回到最左侧命令之前的一段时间。这也是这个名词中 front 的意义所在。

CRT 场扫描过程

一幅完整的图像可以看作是多行图像平铺构成的,所以理解了行扫描的过程中每个时间段对应的时间参数名称之后,再来理解场扫描中的名词就非常简单了。

首先来讲,CRT 在扫描一行图像的时候,电子枪的水平位置是保持稳定不变的,而当一 行图像扫描完成,开始扫描下一行图像的时候,电子枪的水平位置会向下调整一定的值。因此,我们可以认为,场时序就是在垂直方向上从上往下依次扫描。

其次来说,对于 CRT 显示器来说,其不是扫描完所有行的图像后就立马返回最上方, 而是会继续向下扫描一段区域,这个区域称为下边界区域(vertical bottom border),该区域 已经不在有效的显示范围内,如果从物理结构的角度来说,这一段对应的荧光屏玻璃上就不 再有荧光粉了,但是电子枪还在继续向下走,大家可以形象理解为显示器下边的黑边。同样 的,显示器上边也有这样一段黑边,在开始显示有效数据之前,电子枪扫描到的这段区域同 样也是没有荧光粉的,不会显示图像, 这个区域称为上边界区域(vertical top border)

再来说说,电子枪什么时候会到最上方准备开始新一场图像的扫描。当电子枪扫描一场图像到达荧光屏的最下方后,其并不会自动回到最上边准备下一场,而是需要有一个通知 信号,通知其回去,这个通知信号就是场同步信号脉冲(vertical sync pulse)。场同步信号是 一个脉冲,当该脉冲出现后,电子枪的指向会在一定时间内从最下方回到显示屏的最上方。 而这个回去的过程需要耗费一定的时间,这个时间就称为 vertical back porch。即出现场同步信号后,电子枪从显示屏最下方回到最上方的时间。

当电子枪扫描过了下方没有荧光粉的区域后,还没有收到回到最上方的命令(场同步信号脉冲)之前,电子枪需要关闭以实现消隐,这个消隐的时间段就称为 vertical front porch, 直观一点理解就是完成了一场图像的扫描,但还没收到回到最上方命令之前的一段时间。、

行扫描时序图 

场扫描时序图

上述两幅图中,都只给出了时序参数的名称,并没有给出每个参数具体的值是多少。 而每个参数具体的值是多少,并不是固定的,而是根据需要扫描的有效图像区域的大小确定 的。需要扫描的有效图像区域的大小,一般用分辨率来表示。

 下表给出了若干个常见分辨率对应的行场时序中各个参数的具体数值,注意,这些参 数值中,行相关的参数都是以像素的更新频率,也就是像素时钟作为单位而场相关的参数, 则是以行作为单位。

分析

以800x480为例  行同步信号分析

场同步信号分析

编写逻辑代码:

`timescale 1ns / 1ps
//800x480
//H_Right_Borde = 0      V_Bottom_Bord   =  8
//H_Front_Porch = 40     V_Front_Porch   =  2
//H_Sync_Time   = 128    V_Sync_Time     =  2
//H_Back_Porch  = 88     V_Back_Porch    =  25
//H_Left_Border = 0      V_Top_Border    =  8
//H_Data_Time   = 800    V_Data_Time     =  480
//H_Total_Time  = 1056   V_Total_Time    =  525module VGA_CTRL(Clk_33M   ,Reset_n   ,Data_in   ,hcount    ,   //行扫描位置(显示图像行扫描地址)vcount    ,   //场扫描位置(显示图像场扫描地址)VGA_HS    ,   //行同步信号VGA_VS    ,   //场同步信号VGA_BLK   ,   //有效数据输出 VGA_CLK   ,   VGA_DATA      //红绿蓝三色 分别8位量化 R[7:0]G[7:0]B[7:0]  );input            Clk_33M;input            Reset_n;input   [23:0]   Data_in;output  [10:0]   hcount;output  [10:0]   vcount;output           VGA_HS;output           VGA_VS;output           VGA_BLK;output           VGA_CLK;output  [23:0]   VGA_DATA;  //红绿蓝三色 分别8位量化 R[7:0]G[7:0]B[7:0]  parameter  VGA_HS_end = 11'd127  ,hdat_begin = 11'd216  ,hdat_end   = 11'd1016 ,hpixel_end = 11'd1055 ,VGA_VS_end = 11'd1    , vdat_begin = 11'd35   ,vdat_end   = 11'd515  ,vline_end  = 11'd524  ;reg [10:0] hcount_r;reg [10:0] vcount_r;always@(posedge Clk_33M or negedge Reset_n)if(!Reset_n)hcount_r <= 0; else if(hcount_r == hpixel_end )hcount_r <= 0;elsehcount_r <= hcount_r + 1'b1;always@(posedge Clk_33M or negedge Reset_n)if(!Reset_n)vcount_r <= 0; else if(hcount_r == hpixel_end) if(vcount_r == vline_end )vcount_r <= 0;elsevcount_r <= vcount_r + 1'b1;elsevcount_r <= vcount_r;assign  VGA_BLK  =  ((hcount_r >= hdat_begin) && (hcount_r < hdat_end)&&(vcount_r >= vdat_begin) && (vcount_r < vdat_end)) ? 1'b1 : 1'b0;  assign  hcount   =   VGA_BLK ? (hcount_r - hdat_begin) : 10'd0;  assign  vcount   =   VGA_BLK ? (vcount_r - vdat_begin) : 10'd0;               assign  VGA_HS   =  (hcount_r > VGA_HS_end)? 1'b1 :1'b0;   assign  VGA_VS   =  (vcount_r > VGA_VS_end)? 1'b1 :1'b0;  assign  VGA_DATA =  (VGA_BLK) ? Data_in : 24'h000000;assign  VGA_CLK  =  ~Clk_33M;
endmodule

编写测试程序:

`timescale 1ns / 1ps
module VGA_CTRL_tb;reg            Clk_33M;reg            Reset_n;reg   [23:0]   Data_in;wire  [10:0]   hcount;wire  [10:0]   vcount;wire           VGA_HS;wire           VGA_VS;wire           VGA_BLK;wire           VGA_CLK;wire  [23:0]   VGA_DATA;  //红绿蓝三色 分别8位量化 R[7:0]G[7:0]B[7:0]  VGA_CTRL VGA_CTRL(.Clk_33M  (Clk_33M ) ,.Reset_n  (Reset_n ) ,.Data_in  (Data_in ) ,.hcount   (hcount  ) ,   //行扫描位置(显示图像行扫描地址).vcount   (vcount  ) ,   //场扫描位置(显示图像场扫描地址).VGA_HS   (VGA_HS  ) ,   //行同步信号.VGA_VS   (VGA_VS  ) ,   //场同步信号.VGA_BLK  (VGA_BLK ) ,   //有效数据输出 .VGA_CLK  (VGA_CLK ) ,   .VGA_DATA (VGA_DATA)     //红绿蓝三色 分别8位量化 R[7:0]G[7:0]B[7:0]  );initial Clk_33M = 1;always #15 Clk_33M = ~ Clk_33M;initial beginReset_n = 0;#201;Reset_n = 1;#200000000;$stop;  endalways@(posedge Clk_33M or negedge Reset_n)if(!Reset_n)Data_in <= 1'b0;else if(!VGA_BLK)Data_in <= Data_in;elseData_in <= Data_in + 1'b1;
endmodule

仿真波形:

第一行开始时波形:

第一行结束时波形:

具体分析波形还需要从行同步脉冲时间,场同步脉冲时间,行消隐时间,场消隐时间,行数据传输时间,场数据传输结束时间等等,分析波形验证逻辑代码的正确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/713069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 vs Rust应该学习哪个?

C语言 vs Rust应该学习哪个&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&am…

linux系统如何安装nginx

首先下载nginx安装包 wget -c http://nginx.org/download/nginx-1.23.1.tar.gz然后解压安装包 tar -zxvf nginx-1.23.1.tar.gz如果服务器没有wget&#xff0c;可以安装一下&#xff0c;有的话可以跳过 yum install -y wget 然后安装相关依赖 yum install -y gcc-c zlib zl…

最新企微hook开源版

免费的企微框架 支持文本消息&#xff0c;图片消息&#xff0c;视频消息&#xff0c;文件消息。 其他可自行下载测试。 有兴趣可以进群交流。720192224 。群内不定期开源气味hook源码 BOOL WxWorkSendData(string data) { WX_GETOBJDATA obj { 0 }; //参数结构…

MATLAB练习题:排队论问题的模拟

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 下面我们来看一道排队论的题目。假设某银行工作时间内只有一个…

Kubernetes/k8s的核心概念

一、什么是 Kubernetes Kubernetes&#xff0c;从官方网站上可以看到&#xff0c;它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语&#xff0c;它的中文翻译是“舵手”或者“飞行员”。在一些常见的资料中也会看到“ks”这个词&#xff0c;也就是“k8s”&#xff…

如何解决代理ip服务器连接问题

在当今的数字化时代&#xff0c;互联网连接已成为生活和工作中不可或缺的一部分。然而&#xff0c;在尝试访问互联网资源时&#xff0c;用户有时会遇到“代理服务器可能有问题&#xff0c;或地址不正确(你尚未连接)”的错误提示。这种情况通常表明计算机的网络设置存在问题&…

python统计分析——广义线性模型的评估

参考资料&#xff1a;用python动手学统计学 残差是表现数据与模型不契合的程度的重要指标。 1、导入库 # 导入库 # 用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 导入绘图的库 import matplotlib.pyplot as plt i…

面经 | Java创建线程的三种方式

利用JUC包创建线程的三种方式&#xff1a; 通过继承Thread类创建线程类实现Runnable接口创建线程类通过Callable和Future接口创建线程 继承Thread类创建线程 class Thread1 extends Thread {Overridepublic void run() {System.out.println("启动线程1");} }实现R…

第七篇:微信小程序的跳转页面

前提&#xff1a;建议还没学HTML、CSS、JavaScript、JSON、vue、Ajax的兄弟姐妹们&#xff0c;先去把这些基础补好过一遍&#xff0c;不然不好理解微信小程序 前面这一篇已经讲过一次<navigator>跳转页面的用法了&#xff0c;今天详细讲解一下 回顾&#xff1a; 小程序…

Lesson 1 introduction of machine /deep learning

听课&#xff08;李宏毅老师的&#xff09;笔记&#xff0c;方便梳理框架&#xff0c;以作复习之用。本节课主要介绍了什么是机器学习&#xff0c;机器学习的类型和流程&#xff0c;用一个现实中的例子详细地展示了整个工作流程。 1. 机器学习的定义 2. 不同的函数类型 预测数…

MyBatis 学习(四)之 SQL 映射文件

目录 1 SQL 映射文件介绍 2 select 元素 3 insert 元素 4 update 和 delete 元素 5 sql 元素 6 parameterType 元素 7 resultType 元素 8 resultMap 元素&#xff08;重要&#xff09; 9 参考文档 1 SQL 映射文件介绍 映射器是 MyBatis 中最复杂并且是最重要的…

Vue(3.3.4)+three.js(0.161.0)实现3D可视化地图

一.前言 由于最近在学习three.js,所以观摩了一下掘金&#xff0c;csdn等网站上的有关这部分的内容&#xff0c;刚好看到一个带你入门three.js——从0到1实现一个3d可视化地图 - 掘金 (juejin.cn)&#xff0c;再加上我的专业属性是地理相关&#xff0c;可以说是专业对口&#xf…

存储xss实现获取cookie(本地实战)

实战更能体验收获&#xff01;&#xff01;&#xff01; 环境准备&#xff1a; 1.phpstudy 2.dvwa靶场 实战 首先我们在phpstudy指定的localhost网站目录下编写一个xss.php文件&#xff0c;内容如下&#xff1a; <?php $cookie $_GET[cookie]; $ip getenv (REMOTE_…

electron+vue3全家桶+vite项目搭建【28】封装窗口工具类【2】窗口组,维护窗口关系

文章目录 引入实现效果思路主进程模块渲染进程模块测试效果 引入 demo项目地址 窗口工具类系列文章&#xff1a; 封装窗口工具类【1】雏形 我们思考一下窗口间的关系&#xff0c;窗口创建和销毁的一些动作&#xff0c;例如父子窗口&#xff0c;窗口组合等等&#xff0c;还有…

【前端素材】推荐优质在线高端家具电商网页Classi平台模板(附源码)

一、需求分析 1、系统定义 在线高端家具商城是一个专门销售高端家具产品的电子商务平台&#xff0c;旨在为消费者提供购买高品质家具的便捷渠道。 2、功能需求 在线高端家具商城是一个专门销售高端家具产品的电子商务平台&#xff0c;旨在为消费者提供购买高品质家具的便捷…

Maven高级(黑马学习笔记)

Maven 是一款构建和管理 Java 项目的工具。 分模块设计与开发 介绍 所谓分模块设计&#xff0c;顾名思义指的就是我们在设计一个 Java 项目的时候&#xff0c;将一个 Java 项目拆分成多个模块进行开发。 1). 未分模块设计的问题 如果项目不分模块&#xff0c;也就意味着所有…

node.js和electron安装

文章目录 一、node.js安装1.node.js下载安装2.设置镜像 二、其它问题1.文件夹创建错误2.electron安装错误 一、node.js安装 1.node.js下载安装 参考B站视频node.js安装&#xff0c;没有按视频中设置镜像 2.设置镜像 参考&#xff1a;https://npmmirror.com/ npm config se…

十八:Java8新特性

文章目录 01、Java8概述02、Java8新特性的好处03、并行流与串行流04、Lambda表达式4.1、Lambda表达式使用举例4.2、Lambda表达式语法的使用14.3、Lambda表达式语法的使用2 05、函数式(Functional)接口5.1、函数式接口的介绍5.2、Java内置的函数式接口介绍及使用举例 06、方法引…

Hgame题解(第二星期)

Hgame题解&#xff08;第二星期&#xff09; Web Select More Courses 打开靶机发现是一个登陆页面&#xff0c;根据题目提示下载弱密码字典&#xff0c;通过BP爆破获得用户密码为qwert123 登陆后进入下一个页面&#xff0c;由于学分已满无法选课&#xff0c;所以需要先进行…

回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测

回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测 目录 回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BiTCN基于双向时间卷积网络的数据回归预测&#xff08;完整源码和数据&a…