VGA模块使用说明

一. 硬件资源

1. VGA模块

2. Spirit V2开发板

3. VGA接口显示器

二. VGA相关知识

1. 知识背景

VGA (Video Graphics Array,视频图形阵列):是 IBM 于1987年提出的一个使用类比讯号的电脑显示标准。这个标准已对于现今的个人电脑市场已经十分过时。即使如此, VGA 仍然是最多制造商所共同支援的一个低标准,个人电脑在加载自己的独特驱动程式之前,都必须支援 VGA 的标准。VGA 支持在640X480的较高分辨率下同时显示16种色彩或256种灰度,同时在320X240分辨率下可以同时显示256种颜色。
XGA (Extended Graphics Array,扩展图形阵列):是 IBM 于1990年发明的,XGA 较新的版本 XGA-2以真彩色提供800×600象素的分辨率或以65536种色彩提供1024×768象素的分辨率,这两种图像分辨水平可能是个人和小企业当今最常用的。(在此实验中使用800*600)
显示器扫描方式分为逐行扫描和隔行扫描;逐行扫描是扫描从屏幕左上角一点开始,从左向右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。隔行扫描是指电子束扫描时每隔一行扫一线,完成一屏后再返回来扫描剩下的线,隔行扫描的显示器闪烁的厉害,会让使用者的眼睛疲劳。
完成一行扫描的时间称为水平扫描时间,其倒数称为行频;完成一帧(整屏)扫描的时间称为垂直扫描时间,其倒数称为场频,即刷新频率,常见的有30HZ,60HZ等等。
行场消隐信号:是针对老式显像管的成像扫描电路而言的。电子枪所发出的电子束从屏幕的左上角开始向右扫描,一行扫完需将电子束从右边移回到左边以便扫描第二行。在移动期间就必须有一个信号加到电路上,使电子束不能发出。不然这个回扫线会破坏屏幕图像。这个阻止回扫线产生的信号就叫作消隐信号,场信号的消隐也是同一个原理。
显示带宽:带宽指的显示器可以处理的频率范围。如果是60HZ刷新率的VGA,其带宽为:640x480x60=18.4Mhz,70HZ刷新率1024X768分辨率的SVGA,其带宽为:1024X768X70=55.1Mhz。
时钟频率:以800X600/59.858HZ(60HZ)为例,每场对应622(1+3+18+600)个行周期,其中600为显示行,每场有场同步信号,该脉冲宽度为3个时钟点。每显示行包括1024个时钟点,其中有800个有效像素点,每一行有一个行同步信号,该脉冲宽度为80个时钟点。由此可知:行频为:622X59.858=37.231Khz。需要的时钟为:1024x622x59.858=38.125Mhz
VGA是模拟信号,通过VGA接口可以看出VGA其实就是将我们平常的3基色数据放到了三根模拟信号线中传输,不同的电压组合就形成了不同的颜色。原理图如下:
VGA模块使用说明_第1张图片
VGA模块使用说明_第2张图片

三. VGA时序图

行同步时序

VGA模块使用说明_第3张图片

列同步时序

VGA模块使用说明_第4张图片
VGA 中定义行时序和列时序都需要同步脉冲( a 段),显示后沿( b 段)、显示时序段( c 段)和显示前沿( d 段)四部分。 VGA 工业标准显示模式要求:行同步、列同步都为负极性,即同步脉冲要求是负脉冲。由 VGA 行时序可知:每一行都有一个负极性行同步脉冲( a 段),是数据行的结束标志,同时也是下一行的开始标志。在同步脉冲之后为显示后沿( b段),在显示时序段( c 段)显示器为亮的过程, RGB 数据驱动一行上的每一个像素点,从而显示一行。在一行的最后为显示前沿( d 段)。在显示时间段之外没有图像投射到屏幕是插入消隐信号。同步脉冲、显示后沿和显示前沿都是在行消隐间隔内,当消隐有效时, RGB 信号无效,屏幕不显示数据。VGA 的列时序与行时序分析基本一样。
参考《VGA分辨率手册大全.PDF》
VGA模块使用说明_第5张图片
VGA模块使用说明_第6张图片
对应代码的参数如下:
VGA模块使用说明_第7张图片

四.仿真图

在这里插入图片描述

五.实验效果

VGA模块使用说明_第8张图片

六. VGA模块实物图

VGA模块使用说明_第9张图片

七.Verilog源码

///
//QQ:3181961725
//TEL:13540738439
//作者:Mr Wang
//模块介绍:VGA驱动模块,分辨率800X600
///
module vga_driver(
              input             clk,
              input             rst_n,
              output         	vga_hs,
              output         	vga_vs,
              output   [7:0]   	video_data
					);
//---------------------------------------------------------//
//水平扫描参数的设定800*600  VGA
//---------------------------------------------------------//
parameter LinePeriod =1024;             //行周期数
parameter h_front_porch=32;             //显示前沿d
parameter h_sync_width=80;				//同步脉冲a
parameter h_back_porch=112;				//显示后沿b
//---------------------------------------------------------//
//垂直扫描参数的设定800*600  VGA
//---------------------------------------------------------//
parameter Frameperiod=622;              //行周期数
parameter v_front_porch=1;              //显示前沿d
parameter v_sync_width=3;				//同步脉冲a
parameter v_back_porch=18;				//显示后沿b

 reg[10:0]  x_cnt;
 reg[9:0]   y_cnt;
 reg  hsync_r;
 reg  vsync_r;
 reg  hsync_de;
 reg  vsync_de;
assign vga_hs = hsync_r;
assign vga_vs = vsync_r;
assign video_data=y_cnt;
//----------------------------------------------------------------------------
//  水平扫描计数
//----------------------------------------------------------------------------
always @ (posedge clk)begin
    if(~rst_n)
		x_cnt <= 1;
	else if(x_cnt == LinePeriod)
        x_cnt <= 1;
	else
		x_cnt <= x_cnt+ 1;
end
//-----------------------------------------------------------------------------
//  水平扫描信号hsync,hsync_de产生
//-----------------------------------------------------------------------------
always @ (posedge clk)begin
	if(~rst_n) 
		hsync_r <= 1'b1;
	else if(x_cnt <= h_sync_width) 
        hsync_r <= 1'b0;
	else 
		hsync_r<=1'b1;
end
always @ (posedge clk)begin
    if(~rst_n)
        hsync_de <= 1'b0; 
	else if((x_cnt > h_sync_width+h_back_porch)&&(x_cnt <= LinePeriod-h_front_porch))
        hsync_de <= 1'b1;
    else 
        hsync_de <= 1'b0;        //产生hsync_de信号
end
//----------------------------------------------------------------------------
//  垂直扫描计数
//----------------------------------------------------------------------------
always @ (posedge clk)begin
    if(~rst_n)
		y_cnt <= 1;
    else if(y_cnt == Frameperiod&&x_cnt == LinePeriod)
        y_cnt <= 1;  
    else if(x_cnt == LinePeriod)  
        y_cnt <= y_cnt+1;
	else
		;
end

//----------------------------------------------------------------------------
//  垂直扫描信号vsync, vsync_de产生
//----------------------------------------------------------------------------
always @ (posedge clk)begin
    if(~rst_n)
        vsync_r <= 1'b1;
    else if(y_cnt <= v_sync_width)
        vsync_r <= 1'b0;       //产生vsync信号
    else
		vsync_r <= 1'b1; 
end
always @ (posedge clk)begin
    if(~rst_n)
		vsync_de <= 1'b0;
    else if(y_cnt >  v_sync_width+v_back_porch&&y_cnt <=  Frameperiod-v_front_porch)
        vsync_de <= 1'b1;     //产生vsync_de信号 
    else 
        vsync_de<= 1'b0; 
end
endmodule

你可能感兴趣的:(各种芯片使用归纳总结)