VGA接口复习笔记(原理,时序)VGA接口FPGA实现
一、显示器工作原理
显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角一点开始,从左向右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。隔行扫描是指电子束扫描时每隔一行扫一行,完成一屏后再返回来扫描剩下的行,隔行扫描的显示器闪烁的厉害,会让使用者的眼睛疲劳。
完成一行扫描的时间称为水平扫描时间,其倒数称为行频率;完成一帧(整屏)扫描的时间称为垂直扫描时间,其倒数称为场频率,即刷新一屏的频率,常见的有60Hz,75Hz等等。标准的VGA显示的场频60Hz,行频31.5KHz。
行场消隐信号:是针对老式显像管的成像扫描电路而言的。电子枪所发出的电子束从屏幕的左上角开始向右扫描,一行扫完需将电子束从右边移回到左边以便扫描第二行。在移动期间就必须有一个信号加到电路上,使得电子束不能发出。不然这个回扫线会破坏屏幕图像的。这个阻止回扫线产生的信号就叫作消隐信号,场信号的消隐也是一个道理。
显示带宽:带宽指的显示器可以处理的频率范围。显示带宽代表显示器显示能力的一个综合指标,指每秒钟所扫描的图素个数。计算公式:B= r(x) × r(y) × V。如果是60Hz刷新频率的VGA,其带宽达640x480x60=18.4MHz,70Hz的刷新频率1024x768分辨率的SVGA,其带宽达1024x768x70=55.1MHz。
二、VGA时序
行数据时序

显示一行数据需要处理两件事:产生行同步信号HSYNC;产生显示的数据信号。
行同步是周期性脉冲信号,周期就是一行的时间e=a+b+c+d,因分辨率不同而有所差异; 而数据信号为模拟信号,当在显示有效数据(Active video)内,DATA信号为0-0.174Vpp的模拟电压(R、G、B)。
VGA需要的是模拟信号,而FPGA提供的是数字信号,因此还需要专用的DAC芯片进行数模转换。很多开发板为了节省成本,会选择用电阻网络R-2R作为视频DAC(黑金AX516开发板就是如此)。
AX516VGA电路图

帧时序

VESA中定义行时序和场时序都需要同步脉冲(Sync a)、显示后沿(Back porch b)、显示时序段(Display interval c)和显示前沿(Front porch d)四部分。VGA工业标准显示模式要求:行同步,场同步都为负极性,即同步脉冲要求是负脉冲。
由VGA的行时序可知:每一行都有一个负极性行同步脉冲(Sync a),是数据行的结束标志,同时也是下一行的开始标志。在同步脉冲之后为显示后沿(Back porch b),在显示时序段(Display interval c)显示器为亮的过程,RGB数据驱动一行上的每一个像素点,从而显示一行。在一行的最后为显示前沿(Front porch d)。在显示时间段(Display interval c)之外没有图像投射到屏幕是插入消隐信号。同步脉冲(Sync a)、显示后沿(Back porch b)和显示前沿(Front porch d)都是在行消隐间隔内(Horizontal Blanking Interval),当消隐有效时,RGB信号无效,屏幕不显示数据。
VGA的场时序与行时序基本一样,每一帧的负极性脉冲(Sync a)是一帧的结束标志,同时也是下一帧的开始标志。而显示数据是一帧的所有行数据。


三.其他显示器时钟分布情况

四FPGA时序实现
实现 VGA 输出显示,在 VGA 显示器里显示测试的彩条图像。程序由 2 个模块实现, 分别是时钟模块 vidio_pll, 彩条生成模块 color_bar。
逻辑框图

1. 顶层模块及VGA 时钟模块video_pll
video_pll 模块是倍频产生模块,通过输入的 clk 时钟产生 VGA 显示所需要的时钟信号, 模块中设置为 65MHz,用来满足 VGA 分辨率为 1024x768 的要求。
//////////////////////////////////////////////////////////////////////////////////
// BISTU //
// //
// Author: 田彦祖 202.6.4
// // //
//////////////////////////////////////////////////////////////////////////////////
//================================================================================
//================================================================================
// Revision History:
// Date By Revision Change Description
//--------------------------------------------------------------------------------
//2017/7/20 1.0 Original
//*******************************************************************************/
module top
(
input clk,
input rst_n,
//vga output
output vga_out_hs, //vga horizontal synchronization 行同步
output vga_out_vs, //vga vertical synchronization 场同步
output[4:0] vga_out_r, //vga red 红
output[5:0] vga_out_g, //vga green 绿
output[4:0] vga_out_b //vga blue 蓝
);
wire video_clk;
wire video_hs;
wire video_vs;
wire video_de;
wire[7:0] video_r;
wire[7:0] video_g;
wire[7:0] video_b;
wire osd_hs;
wire osd_vs;
wire osd_de;
wire[7:0] osd_r;
wire[7:0] osd_g;
wire[7:0] osd_b;
assign vga_out_hs = osd_hs;
assign vga_out_vs = osd_vs;
assign vga_out_r = osd_r[7:3]; //discard low bit data读取数据位
assign vga_out_g = osd_g[7:2]; //discard low bit data读取数据位
assign vga_out_b = osd_b[7:3]; //discard low bit data读取数据位
//generate video pixel clock
//生成视频像素时钟
IBUFG IBFG_INST
( .O(clk_bufg),
.I(clk)
);
video_pll video_pll_m0
(
.clk_in(clk_bufg),
.video_clk(video_clk),
.reset(~rst_n),
.locked(locked)
);
// 彩条产生模块
color_bar color_bar_m0
(
.clk(video_clk),
.rst(~rst_n),
.hs(video_hs),
.vs(video_vs),
.de(video_de),
.rgb_r(video_r),
.rgb_g(video_g),
.rgb_b(video_b)
);
//VGA显示窗口
osd_display osd_display_m0
(
.rst_n (rst_n ),//系统复位
.pclk (video_clk ),//时钟输入
.i_hs (video_hs ),//行同步
.i_vs (video_vs ),//场同步
.i_de (video_de ),//像素数据有效
.i_data ({
video_r,video_g,video_b} ),//rgb像素数据输出
.o_hs (osd_hs ),//输出行同步
.o_vs (osd_vs

本文详细介绍了VGA显示器的工作原理,包括逐行和隔行扫描方式,以及行扫描时间、场扫描时间和带宽等概念。接着讲解了VGA时序,包括行数据时序和帧时序,以及行同步、场同步信号的产生。在FPGA实现部分,展示了如何通过视频PLL模块生成所需时钟,并利用彩条生成模块产生8种颜色的彩条图像,最后通过VGA显示模块在显示器上显示。程序中预设了多种分辨率的时序参数,以适应不同的显示需求。
VGA接口FPGA实现&spm=1001.2101.3001.5002&articleId=117561702&d=1&t=3&u=e42c4eae01d04efea3adf59cb0d1ec07)
2638

被折叠的 条评论
为什么被折叠?



