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
仿真波形:

第一行开始时波形:

第一行结束时波形:

具体分析波形还需要从行同步脉冲时间,场同步脉冲时间,行消隐时间,场消隐时间,行数据传输时间,场数据传输结束时间等等,分析波形验证逻辑代码的正确性。
相关文章:
FPGA-VGA成像原理与时序
什么是VGA: VGA, Video Graphics Array。即视频图形阵列,具有分辨率高、显示速率快、颜色丰富等优点。VGA接口不但是CRT显示设备的标准接口,同样也是LCD液晶显示设备的标准接口,具有广泛的应用范围。在FGPA中,常广泛用于图像处理等领域。 VGA 显示器成像原理 在 VGA 标准刚兴…...
【VTKExamples::Points】第三期 ExtractClusters
很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ExtractClusters,并解析接口vtkEuclideanClusterExtraction,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我…...
迅速上手:CentOS 系统下 SSH 服务配置指南
前言 掌握 SSH 服务,就像拥有了一把解锁网络世界的钥匙。本文深入浅出地介绍了如何使用 SSH(Secure Shell)服务,从连接远程服务器到安全文件传输,让你轻松驾驭远程管理与数据传输,提高工作效率,…...
day38 动态规划part1
509. 斐波那契数 简单 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),…...
01背包问题 刷题笔记
思路 dp 用f[i][j]来表示当体积为j时 考虑前i件物品可以获得的 最大值 记住f[i][j]本身是个价“价值” 考虑两种状态 是否将第i件物品放入背包里面 将背包的体积从小到大递增来进行考虑 首先 考虑条件 如果当前增加的体积放不下下一件物品 则该体积 可以获得的最大值可以直接…...
docker安装包(Linux和windows)
Linux——docker-20.10.9.tgz 网盘地址:链接:https://pan.baidu.com/s/1T3qfVZ-uT-vMAo8w6heTMw 提取码:qu85 windows——docker19.03.1 链接:https://pan.baidu.com/s/1mK6hqhkGCBs6tdBHJxrdPw 提取码:4dkj...
RabbitMQ 安装使用
文章目录 RabbitMQ 安装使用安装下载 Erlang下载 RabbitMQ 的服务安装好后看是否有 RabbitMQ 的服务开启管理 UIRabbitMQ 端口使用一览图 使用输出最简单的 Hello World!生产者定义消费者消费消息小拓展 RabbitMQ 安装使用 安装 下载 Erlang RabbitMQ 是用这个语…...
echarts x轴名称过长tip显示全称
xAxis的axisLabel的内容如下: axisLabel: { rotate: -45, color: document.body.className.indexOf(custom-f4c46d) > -1 ? #fff : #343434, // 显示省略号操作(第一步) formatter: function (value) { var val if (value.length >…...
js和css阻塞问题
面试常见问题 css 加载会不会阻塞 js 的加载?(不会)css 加载会不会阻塞 js 的执行?(会)css 加载会不会阻塞 DOM 的解析?(不会)css 加载会不会阻塞 DOM 的渲染࿱…...
MySQL 的基础操作
数据库的基础操作 1. 库操作2. 表的操作3. 数据类型 数据库是现代应用程序中至关重要的组成部分,通过数据库管理系统(DBMS)存储和管理数据。 1. 库操作 创建数据库 创建数据库是开始使用数据库的第一步。下面是一些常见的创建数据库的示例&a…...
【python进阶篇】面向对象编程(1)
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。 在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定…...
力扣面试经典150 —— 6-10题
力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题,安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题,文中 “数组” 通常指 python 列表;文中 “指针” 通常指 python 列表索引 文章目录 6. [中等] 轮转…...
[密码学]入门篇——加密方式
一、概述 加密方法主要分为两大类: 单钥加密(private key cryptography):加密和解密过程都用同一套密码双钥加密(public key cryptography):加密和解密过程用的是两套密码 历史上,…...
构建前后端分离项目常用的代码
构建前后端分离项目常用的代码 1.代码生成器 import com.baomidou.mybatisplus.generator.FastAutoGenerator;import com.baomidou.mybatisplus.generator.config.OutputFile;import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;import java.util.…...
2575. 找出字符串的可整除数组(Go语言)
https://leetcode.cn/problems/find-the-divisibility-array-of-a-string/ 在看题解之前,我的代码是以下这样: package mainimport ("fmt" )func main() {fmt.Println(divisibilityArray("998244353", 3)) }func divisibilityArray…...
Redis与 Memcache区别
Redis与 Memcache区别 1 , Redis 和 Memcache 都是将数据存放在内存中,都是内存数据库。不过 Memcache 还可用于缓存 其他东西,例如图片、视频等等。 2 , Memcache 仅支持key-value结构的数据类型,Redis不仅仅支持简单的key-value类型的数据&…...
#QT(智能家居界面-界面切换)
1.IDE:QTCreator 2.实验 3.记录 (1)创建一个新界面(UI界面) (2)可以看到新加入一个ui文件,双击打开,设置窗口大小与登录界面一致 (3)加入几个PUS…...
js拓展-内置对象
目录 1. 数组对象 1.1 数组的四种方式 1.2 JS中数组的特点 1.3 常用方法 2. 日期对象 2.1 日期对象的创建 2.2 日期对象的方法 2.3 案例:输出现在的时间 3. 全局对象 3.1 字符串转换成数字类型 3.2 编码解码函数 1. 数组对象 注:数组在JS中是一…...
【李沐精读系列】GPT、GPT-2和GPT-3论文精读
论文: GPT:Improving Language Understanding by Generative Pre-Training GTP-2:Language Models are Unsupervised Multitask Learners GPT-3:Language Models are Few-Shot Learners 参考:GPT、GPT-2、GPT-3论文精读…...
Libevent的使用及reactor模型
Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读…...
基于LCU API的事件驱动自动化框架:League-Toolkit技术架构深度解析
基于LCU API的事件驱动自动化框架:League-Toolkit技术架构深度解析 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit…...
Qwen3.5-9B-GGUF开源大模型部署:Apache 2.0协议下商用微调全流程解析
Qwen3.5-9B-GGUF开源大模型部署:Apache 2.0协议下商用微调全流程解析 1. 项目概述 Qwen3.5-9B-GGUF是基于阿里云通义千问3.5系列的开源大语言模型,经过GGUF格式量化后,可以在消费级硬件上高效运行。这个90亿参数的稠密模型采用了创新的Gate…...
GD32E230C8T6开发板保姆级开箱指南:从Type-C烧录到Keil工程搭建(附模板下载)
GD32E230C8T6开发板零基础实战指南:从拆箱到完整工程部署 刚拿到GD32E230C8T6开发板时,面对一堆配件和资料,新手常会感到无从下手。本文将带你一步步完成从硬件连接到软件配置的全过程,避开那些容易踩的坑。不同于简单的步骤罗列&…...
终极Boss-Key老板键:如何一键隐藏窗口保护你的数字隐私?
终极Boss-Key老板键:如何一键隐藏窗口保护你的数字隐私? 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 在现代数字…...
logo抠图背景去不掉?PS 4种方法一键搞定
抠图是设计师必备的基础技能,但很多新手在处理logo抠图时,总会遇到各种问题:复杂背景的logo抠半天,边缘留灰边、丢失细节;面对PS众多工具,无从下手、反复试错。今天就给大家分享3种PS logo抠图去背景的实用…...
VINS-Fusion跑通KITTI/Euroc/TUM数据集后,用EVO评估结果总不准?可能是这个时间戳细节没处理好
VINS-Fusion评估结果异常?时间戳精度可能是罪魁祸首 当你终于跑通了VINS-Fusion在KITTI、Euroc或TUM数据集上的流程,满怀期待地使用EVO工具评估结果时,却发现APE、RPE等指标与预期相差甚远——这种挫败感我深有体会。经过多次调试和对比实验&…...
Boss-Key智能窗口管理解决方案:一键隐藏保护你的隐私与效率
Boss-Key智能窗口管理解决方案:一键隐藏保护你的隐私与效率 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 你是否曾因突然的检…...
暗黑破坏神2存档编辑器:5分钟快速上手终极指南
暗黑破坏神2存档编辑器:5分钟快速上手终极指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor d2s-editor是一款功能强大的暗黑破坏神2存档编辑器,专为D2和D2R玩家设计。这款基于Web的开源工具让你能够轻…...
RT-Thread Studio网络驱动实战:用CubeMX可视化配置STM32F407的LAN8720 RMII引脚,告别手动查手册
RT-Thread Studio网络驱动实战:可视化配置STM32F407的LAN8720 RMII接口 在嵌入式开发中,网络驱动的配置往往是最令人头疼的环节之一。特别是当面对STM32系列芯片与PHY芯片(如LAN8720)的RMII接口连接时,开发者需要查阅大…...
【实战】Windows平台LVGL模拟器快速上手:从CodeBlocks配置到首个GUI组件创建
1. Windows平台LVGL模拟器入门指南 第一次接触LVGL的朋友可能会被嵌入式开发吓到,但其实在Windows上就能轻松体验。我刚开始学LVGL时也以为必须买开发板,后来发现用CodeBlocks配合官方模拟器,完全可以在PC上跑起来。这种方式特别适合想快速验…...
