VGA成像原理与简单实现

  • 前言
  • 一、VGA成像原理
  • 二、VGA成像时序详解
  • 三、VGA成像设计
  • 四、VGA控制器Verilog设计实现
  • 五、TB文件展示
  • 六、仿真结果分析

前言

本篇文章简单记录VGA成像原理与时序解析,使用Verilog初步实现。如有错误,还请批评指正,谢谢。


提示:以下是本篇文章正文内容,下面案例可供参考

一、VGA成像原理

在 VGA 标准兴起的时候,常见的彩色显示器一般由 CRT(阴极射线管)构成,色彩是由 RGB 三基色组成。显示是用逐行扫描的方式解决。阴极射线枪发出的电子束打在涂有荧光粉的荧光屏上,产生 RGB 三基色,合成一个彩色像素,扫描从屏幕的左上方开始,从左到右,从上到下进行扫描,每扫完一行,电子束都回到屏幕的下一行左边的起始位置。

在这期间,CRT 对电子束进行消隐。每行结束时,用行同步信号进行行同步;扫描完所有行,用场同步信号进行场同步,并使扫描回到屏幕的左上方。同时进行场消隐,预备下一场的扫描。

二、VGA成像时序详解

1.下图为VGA成像的综合时序:下图中,黑底的JAMES人物图像就是我们希望显示的图像内容。我们的目的就是要让该图像恰好完全显示在显示器上。而 CRT 显示器是基于电子枪的,通过电子轰击荧光粉来产生明暗不同的亮度,从而实现图像线索。所以这一幅图像,可以理解为横向的很多行图像向下依次平铺构成的,而每一行图像,又可以理解为由多个像素点从左向右依次平铺构成的。电子枪每次只能点亮一个点上的荧光粉,所以需要像我们人眼看文章一样,从左向右一个字一个字的看,看完一行内容后,再把视线回到左侧,另起一行开始看,这也就是 CRT 的成像方式。

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

当电子枪扫描一行图像到达荧光屏的最右端后,其并不会自动回到最左边准备下一行,而是需要有一个通知信号,通知其回去,这个通知信号就是行同步信号脉冲( horizontal sync pulse )。行同步信号是一个脉冲,当该脉冲出现后,电子枪的指向会在一定时间内从最右侧回到显示屏的最左侧。而这个回去的过程需要耗费一定的时间,这个时间就称为 (horizontal back porch) 。这也是这个名词中 back 的意义所在,即出现行同步信号后,电子尬从显示屏最石侧回到最左侧的时间。当电子枪扫描过了右侧没有荧光粉的区城后还没有收到回到最左侧的命令(行同步信号脉冲)之前,电子枪需要关闭以实现消隐,这个消隐的时间段就称为 (horizontal front porch),直观一点理解就是完成了一行图像的扫描,但还没收到回到最左侧命令之前的一段时间。

3.场扫描:场扫描与行扫描原理类似。

三、VGA成像设计

设计VGA成像需要找到几个关键时间节点:
行扫描时间节点:(以640*480为例)
1.行脉冲的开始位置HS_Begin(HS_YC下降沿) =0
2.行脉冲的结束位置HS_End (HS_YC上升沿)=96(Pclk)
3.行数据开始输出位置Hdata_Begin=96+40+8
4.行数据停止输出位置Hdata_End=96+40+8+640
5.行同步信号的结束位置Hsync_end=96+40+8+640+8+8 = 800
场扫描时间节点:
1.场脉冲的开始位置VS_Begin(VS_YC下降沿)=0
2.场脉冲的结束位置VS_End (VS_YC上升沿)=2(Line)
3.场数据开始输出位置Vdata_Begin=2+25+8
4.场数据停止输出位置Vdata_End=2+25+8+480
5.场同步信号的结束位置Vsync_end=2+25+8+480+8+2 = 525
相关参数如下表表所示:

四、VGA控制器Verilog设计实现

`timescale 1ns / 1ps
//// Create Date: 2022/11/30 15:18:34
// Module Name: VGA_CTRL_640x480
// Project Name: 640x480图像输出
// Revision: VIVADO 2018.3
// Name:小王在努力...
//module VGA_CTRL_640x480(clk,reset,Data,Data_request,HS_YS,VS_YS,VGA_BLK,RGB_output);input clk;input reset;input [23:0]Data;             //输入数据output  reg Data_request;     //数据请求脉冲信号output reg HS_YS;           //行同步脉冲信号output reg VS_YS;           //场同步脉冲信号output reg VGA_BLK;         //VGA有效数据显示脉冲信号output reg [23:0]RGB_output;      //RGB输出值 parameter [9:0]Hsync_end = 10'd800; parameter [6:0]HS_END = 7'd96;parameter [9:0]Vsync_end = 10'd525;parameter [1:0]VS_END = 2'd2;parameter [7:0]Hdata_begin = 8'd144;parameter [9:0]Hdata_end = 10'd784;parameter [5:0]Vdata_begin = 6'd35;parameter [9:0]Vdata_end = 10'd515; reg [9:0]H_cnt;always @ (posedge clk or negedge reset)if(!reset)H_cnt <= 0;else if(H_cnt >= Hsync_end -1 )H_cnt <= 0;else H_cnt <= H_cnt + 1'b1;//  行同步脉冲信号      always @ (posedge clk)HS_YS <= (H_cnt <= HS_END-1 )?0:1;reg [9:0]V_cnt;always @ (posedge clk or negedge reset)if(!reset)V_cnt <= 0;else if( H_cnt == Hsync_end -1)beginif(V_cnt >= Vsync_end-1)V_cnt <= 0;else V_cnt <= V_cnt + 1;endelse V_cnt <= V_cnt ;//场同步脉冲信号         always @ (posedge clk)VS_YS <= (V_cnt <= VS_END-1 )?0:1; // Data_request 数据请求脉冲    always @ (posedge clk) Data_request <= (H_cnt >= Hdata_begin - 1 )&&(H_cnt <= Hdata_end - 2)&&(V_cnt >= Vdata_begin)&&(V_cnt <= Vdata_end -1);//VGA_BLK数据开始发送脉冲 always @ (posedge clk) VGA_BLK <= Data_request;//RGB_output 数据接收      always @ (posedge clk)RGB_output <= (Data_request) ?Data:0;endmodule

五、TB文件展示

`timescale 1ns / 1ps
//
// Create Date: 2022/11/30 16:07:54
// Design Name: VGA_CTRL
// Module Name: VGA_CTRL_TB
// Project Name: VGA_CTRL
// Revision:2018.3
// Revision 0.01 - File Created
// Name:小王在努力...
//module VGA_CTRL_TB();reg clk;reg reset;reg   [23:0]Data;             //输入数据wire  Data_request;     //数据请求信号wire  HS_YS;           //行同步脉冲信号wire  VS_YS;           //场同步脉冲信号wire  VGA_BLK;         //VGA有效数据显示脉冲信号wire  [23:0]RGB_output;      //RGB输出值 VGA_CTRL_640x480 VGA_CTRL_640x480_TB(clk,reset,Data,Data_request,HS_YS,VS_YS,VGA_BLK,RGB_output);initial clk = 1;always #20 clk = ~clk;initial beginreset = 0;#201;reset = 1;#20000000;$stop;endalways @ (posedge clk or negedge reset)if(!reset)Data <= 0;else if(Data_request)Data <= Data + 1;elseData <= Data;
endmodule

六、仿真结果分析

1.验证行扫描时间节点

验证HS_End 根据上图HS_YS(白线与黄线间隔)低点平时间为3.84us。此处采用的clk时钟频率为25MHZ,于是根据计算(3.84*1000/40)=96,此处与第三节行脉冲的结束位置HS_End (HS_YC上升沿)=96(Pclk)吻合,故此处验证成功。

验证·Hdata_Begin 根据上图HS_YS与VGA_BLK之间时间(白线与蓝线)为5.76us,经计算为144个clk时间,于是行数据开始输出位置Hdata_Begin=96+40+8验证成立。

验证Hdata_End 根据上图HS_YS与VGA_BLK之间时间(白线与蓝线)为31.36us,经计算为784个clk时间,于是行数据停止输出位置Hdata_End=96+40+8+640验证成立。

验证Hsync_end 根据上图HS_YS(白线与蓝线间隔)时间为32us,经计算为800个clk时间。此处与第三节行同步信号的结束位置Hsync_end = 800吻合,故此处验证成功。

根据640x480数据发送要求,每行应该有640个数据如上图发送Data为0-639而RGB_output接收也为640个数据,没有丢失,至此行数据节点验证完成。

1.验证场扫描时间节点
验证VS_End 根据上图VS_YS(白线与黄线间隔)低点平时间为64us。此处采用的clk时钟频率为25MHZ,于是根据计算(64*1000/40/800)=2,此处与第三节场脉冲的结束位置VS_End (VS_YC上升沿)=2(Line)吻合,故此处验证成功。

验证·Vdata_Begin 根据上图VS_YS与VGA_BLK之间时间(白线与蓝线)为1120us,经计算为35个Line时间,于是场数据开始输出位置Vdata_Begin=35验证成立。

验证Hdata_End 根据上图HS_YS与VS_YS之间时间(蓝线与黄线)为16.48us,经计算为515个Line时间,于是场数据停止输出位置Vdata_End=515验证成立。

验证Vsync_end 根据上图VS_YS(白线与蓝线间隔)时间为18.8ms,经计算为525个clk时间。此处与第三节场同步信号的结束位置Vsync_end = 525吻合,故此处验证成功。

根据640x480数据发送要求,每次应该有480行数据如上图发送Data时间间隔为(两个蓝线之间)15.36ms,经计算为480Line。而RGB_output接收也为480Line个数据,没有丢失,至此场数据节点验证完成。

【附件:】链接:https://pan.baidu.com/s/1uz4Npx6kqVGRXeGbd_HtnQ?pwd=cldn
提取码:cldn

VGA成像原理与简单实现相关推荐

  1. 线性插值改变图像尺寸_数码相机的成像原理、显示屏尺寸、像素的介绍

    阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以继续免费收到文章了.每天都会有分享,都是免费订阅,请您放心关注. 注:本文转载自网络,不代 ...

  2. 边拆边聊——简单了解DLP投影结构与成像原理

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 我的宏碁H6510BD投影在使用中突然出现"风扇故障,灯泡即将关闭"的错误提示.就 ...

  3. CCD/CMOS的成像原理(内含rgb元件如何分布)

    原网址为:http://tucsen.net/Html/NewsView.asp?ID=40 上面这张是常见CCD相机成像过程的简单描述,现说明一下: 1.用相机拍摄景物时,景物反射的光线通过相机的镜 ...

  4. ORB-SLAM2从理论到代码实现(四):相机成像原理、基本矩阵、本质矩阵、单应矩阵、三角测量详解

    由于ORBmatcher.cc中有三角化和重投影等内容,所有我先写相机成像等多视图几何内容. 1. 相机的成像原理 假设空间中有一点P,它在世界坐标系中的坐标为,在相机坐标系中的坐标为,在图片中的像素 ...

  5. camera ---(6)双摄成像原理

    1. 双camera 成像 为了下面的计算方便,首先在这里介绍一个凸透镜成像的简单性质. 内容 如图为摄像头成像的原理图,其中A为物点,O为光心,A'为像点,F,F'分别为物方和像方焦点. 该引理的内 ...

  6. 数学证明凸透镜成像原理

    更好的阅读体验 凸透镜成像原理 前言 凸透镜成像原理是初中二年级的简单物理知识,但是因为 (数学学的不好) 种种原因,初中的教学只能通过实验来找出规律. 因此,很多初中 牲 生在学习此方面知识的时候十 ...

  7. 【图像处理】相机成像原理

    这里对于相机成像原理做一个简单的介绍. 如下图所示,在最左端的顶点为相机,它的镜头正对着地面上的点O,横向视场角为a,纵向视场角为θ,它所看到的区域就是就是如下所示的四边形,存在一定的投影变换. 而地 ...

  8. Camera成像原理(raw图如何产生的)

    1.前言 本文主要介绍了camera的成像原理和raw图像的生成原理,当然在此之前,我们先介绍camera基础知识 2.Camera基础知识 镜头(lens) 镜头实际上就是一个凸透镜,将外部的光线折 ...

  9. 聊一聊:相机篇1基本成像原理

    写在前面:此为初稿,实际作品会根据各种错误发现而进行删改.如果您发现文章中拥有错误欢迎在评论区指正!我会在之后结合各位大大们的修改意见将终稿奉上-- 正文: 大家好,这里是聊一聊,今天的话题是基础的成 ...

最新文章

  1. poj 1695(三维dp)
  2. 期待!2019年春晚将成为科技盛宴:5G、4K都安排上了
  3. php sesssion,php sesssion原理
  4. 深圳职业技术学院计算机专业组代码,深圳职业技术学院代码是多少 有哪些优势专业...
  5. 开始我们的Snippets!
  6. 使用EasyRecovery来恢复丢失的视频
  7. 主机甲采用停等协议向主机乙_TCP/IP 协议——详解篇
  8. 解决Eclipse出现的Failure to transfer ... jar问题
  9. Android 分享到新浪微博
  10. winimage使用教程
  11. win32 012 数据结构
  12. python解一元二次方程虚根_怎么用python解一元二次方程
  13. python爬取歌曲的全部评论
  14. C++的反思(知乎精华)
  15. swing图形用户界面设计
  16. 我,28岁,测试员,10月无情被辞:想给还在学测试 的人提个醒......
  17. 水果药理、吃水果治病
  18. [YTU](3166)共享单车 ---bfs
  19. loki使用超详细说明
  20. SecureCRT个人常用命令

热门文章

  1. 《硅谷产品》读书笔记
  2. Thinkphp+layui数据表格实现表格分页
  3. 【算法图文动画详解系列】QuickSort 快速排序算法
  4. 2022Enscape官方配置推荐:WinMac
  5. java 适配器模式示例
  6. 骚年都2020年了你还在用EventBus吗?jetpack之liveData
  7. 一个 iPod touch 用户的魅族 M8 使用体验
  8. console连接h3c s5500_H3C交换机console口进入怎么设置密码
  9. 提取兴趣点作为特征(extracting points of interest as features)
  10. 用富斯i6遥控器控制船