当前位置: 首页 > news >正文

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 服务&#xff0c;就像拥有了一把解锁网络世界的钥匙。本文深入浅出地介绍了如何使用 SSH&#xff08;Secure Shell&#xff09;服务&#xff0c;从连接远程服务器到安全文件传输&#xff0c;让你轻松驾驭远程管理与数据传输&#xff0c;提高工作效率&#xff0c…...

day38 动态规划part1

509. 斐波那契数 简单 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;…...

01背包问题 刷题笔记

思路 dp 用f[i][j]来表示当体积为j时 考虑前i件物品可以获得的 最大值 记住f[i][j]本身是个价“价值” 考虑两种状态 是否将第i件物品放入背包里面 将背包的体积从小到大递增来进行考虑 首先 考虑条件 如果当前增加的体积放不下下一件物品 则该体积 可以获得的最大值可以直接…...

docker安装包(Linux和windows)

Linux——docker-20.10.9.tgz 网盘地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1T3qfVZ-uT-vMAo8w6heTMw 提取码&#xff1a;qu85 windows——docker19.03.1 链接&#xff1a;https://pan.baidu.com/s/1mK6hqhkGCBs6tdBHJxrdPw 提取码&#xff1a;4dkj...

RabbitMQ 安装使用

文章目录 RabbitMQ 安装使用安装下载 Erlang下载 RabbitMQ 的服务安装好后看是否有 RabbitMQ 的服务开启管理 UIRabbitMQ 端口使用一览图 使用输出最简单的 Hello World&#xff01;生产者定义消费者消费消息小拓展 RabbitMQ 安装使用 安装 下载 Erlang RabbitMQ 是用这个语…...

echarts x轴名称过长tip显示全称

xAxis的axisLabel的内容如下&#xff1a; axisLabel: { rotate: -45, color: document.body.className.indexOf(custom-f4c46d) > -1 ? #fff : #343434, // 显示省略号操作&#xff08;第一步&#xff09; formatter: function (value) { var val if (value.length >…...

js和css阻塞问题

面试常见问题 css 加载会不会阻塞 js 的加载&#xff1f;&#xff08;不会&#xff09;css 加载会不会阻塞 js 的执行&#xff1f;&#xff08;会&#xff09;css 加载会不会阻塞 DOM 的解析&#xff1f;&#xff08;不会&#xff09;css 加载会不会阻塞 DOM 的渲染&#xff1…...

MySQL 的基础操作

数据库的基础操作 1. 库操作2. 表的操作3. 数据类型 数据库是现代应用程序中至关重要的组成部分&#xff0c;通过数据库管理系统&#xff08;DBMS&#xff09;存储和管理数据。 1. 库操作 创建数据库 创建数据库是开始使用数据库的第一步。下面是一些常见的创建数据库的示例&a…...

【python进阶篇】面向对象编程(1)

面向对象编程——Object Oriented Programming&#xff0c;简称OOP&#xff0c;是一种程序设计思想。OOP把对象作为程序的基本单元&#xff0c;一个对象包含了数据和操作数据的函数。 在Python中&#xff0c;所有数据类型都可以视为对象&#xff0c;当然也可以自定义对象。自定…...

力扣面试经典150 —— 6-10题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题&#xff0c;安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题&#xff0c;文中 “数组” 通常指 python 列表&#xff1b;文中 “指针” 通常指 python 列表索引 文章目录 6. [中等] 轮转…...

[密码学]入门篇——加密方式

一、概述 加密方法主要分为两大类&#xff1a; 单钥加密&#xff08;private key cryptography&#xff09;&#xff1a;加密和解密过程都用同一套密码双钥加密&#xff08;public key cryptography&#xff09;&#xff1a;加密和解密过程用的是两套密码 历史上&#xff0c…...

构建前后端分离项目常用的代码

构建前后端分离项目常用的代码 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/ 在看题解之前&#xff0c;我的代码是以下这样&#xff1a; package mainimport ("fmt" )func main() {fmt.Println(divisibilityArray("998244353", 3)) }func divisibilityArray…...

Redis与 Memcache区别

Redis与 Memcache区别 1 , Redis 和 Memcache 都是将数据存放在内存中&#xff0c;都是内存数据库。不过 Memcache 还可用于缓存 其他东西&#xff0c;例如图片、视频等等。 2 , Memcache 仅支持key-value结构的数据类型&#xff0c;Redis不仅仅支持简单的key-value类型的数据&…...

#QT(智能家居界面-界面切换)

1.IDE&#xff1a;QTCreator 2.实验 3.记录 &#xff08;1&#xff09;创建一个新界面&#xff08;UI界面&#xff09; &#xff08;2&#xff09;可以看到新加入一个ui文件&#xff0c;双击打开&#xff0c;设置窗口大小与登录界面一致 &#xff08;3&#xff09;加入几个PUS…...

js拓展-内置对象

目录 1. 数组对象 1.1 数组的四种方式 1.2 JS中数组的特点 1.3 常用方法 2. 日期对象 2.1 日期对象的创建 2.2 日期对象的方法 2.3 案例&#xff1a;输出现在的时间 3. 全局对象 3.1 字符串转换成数字类型 3.2 编码解码函数 1. 数组对象 注&#xff1a;数组在JS中是一…...

【李沐精读系列】GPT、GPT-2和GPT-3论文精读

论文&#xff1a; GPT&#xff1a;Improving Language Understanding by Generative Pre-Training GTP-2&#xff1a;Language Models are Unsupervised Multitask Learners GPT-3&#xff1a;Language Models are Few-Shot Learners 参考&#xff1a;GPT、GPT-2、GPT-3论文精读…...

Libevent的使用及reactor模型

Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库&#xff0c;主要有以下几个亮点&#xff1a;事件驱动&#xff08; event-driven&#xff09;&#xff0c;高性能;轻量级&#xff0c;专注于网络&#xff0c;不如 ACE 那么臃肿庞大&#xff1b;源代码相当精炼、易读…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...