第一章 VGA简介 一、 VGA简介
显卡所处理的信息最终都要输出到显示器上,显卡的输出接口就是电脑与显示器之间的桥梁,它负责向显示器输出相应的图像信号。CRT显示器因为设计制造上的原因,只能接受模拟信号输入,这就需要显卡能输入模拟信号。VGA接口就是显卡上输出模拟信号的接口,VGA接口,也叫D-Sub接口。VGA的英文全称是Video Graphic Array,也叫显示绘图阵列。 虽然液晶显示器可以直接接收数字信号,但为了兼容性,大多数液晶显示器也配备了VGA接口。
VGA是IBM在1987年随PS/2机一起推出的一个使用模拟信号的电脑显示标准 ,具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用。目前VGA技术的应用还主要基于VGA显示卡的计算机、笔记本等设备。 根据分辨率不同,VGA分为VGA(0x480)、SVGA(800x600)、XGA(1024x768)、SXGA(1280x1024)等。
VGA最早指的是显示器0X480这种显示模式,VGA支持在0X480的较高分辨率下同时显示16种色彩或256种灰度,同时在320X240分辨率下可以同时显示256种颜色。   在VGA基础上加以扩充,使其支持更高分辨率如800X600或1024X768,这些扩充的 模式就称之为VESA(Video Electronics Standards Association,视频电子标准协会)的Super VGA模式,简称SVGA,现在的显卡和显示器都支持SVGA模式VGA接口就是显卡上输出模拟信号的接口,也叫D-Sub接口,传输红、绿、蓝模拟信号 以及同步信号(水平和垂直信号)。
虽然说VGA的标准对于现在的个人计算机市场十分过时,但是VGA仍然是所有制造商所支持的最低标准,个人电脑在加载自己的独特驱动程式之前,都必须支持VGA的标准。例如不管所有厂商的显卡,在不安装自己驱动的情况下,都是支持 VGA 标准显示的。 微软Windows系列产品的开机画面仍然使用VGA显示模式,这也说明其分辨率和载色数的不足。
VGA
二、 VGA接口
VGA接口是一种D型接口(D-SUB),上面共有15针空,分成三排,每排五个。而与之配套的底座则为孔型接口。  底座:
1
三、VGA电气特性
VGA引脚名称
描述
引脚
名称
描述
定义如表1所示。 表1: 引脚  1  RED  RED Video  9  KEY
Key (No pin)
2  GREEN  Green 10  SGND  Sync
Video
Ground
3  BLUE  Blue Video  11  ID0  Monitor ID
bit 0
4  ID2  Monitor ID 12  ID1  Monitor ID
bit 2  bit 1
5  GND  Ground  13  HSYNC  Horizontal
Sync
6  RGND  Red
14  VSYNC  Vertical
Ground  Sync
7  GGND
Green 15
ID3  Monitor ID
Ground  bit 3
8  BGND  Blue Ground
引脚1、2、3分别为红绿蓝三基色模拟电压,为0~0.714V peak-peak(峰-峰值),代表无色,0.714V代表满色。一些非标准显示器使用的是 1Vpp的满色电平。
第二章 时序实现
0V
一、 时序介绍
VGA的时序如图 2-1、图2-2 所示。它分为行数据时序和帧数据时序。
行数据时序,顾名思义,也就是显示一行数据的时序。从图2-1可以看出,显示一行数据需要处理两件事情。第一:产生行同步 HSYNC。不难看出,HSYNC是一个脉冲信号,此信号的周期为: e=a+b+c+d,低电平时间为 a。其中 a、b、c、d均为时间信号,这些信号根据需要显示的分辨率不同而不同。第二:产生显示的数据(DATA)信号, 此信号为模拟信号,当在显示有效数据(Active video)内,DATA信号为0~0.714Vpp的模拟电压(R、G、B),根据分辨率的不同,DATA的采样率、点数也皆不相同。
帧数据时序不行时序类似,也就是显示一屏数据的时序。只是这里的基本单位
为每行数据,而行数据里面的最基本单位为每个点。
上面提过,不同的分辨率,时序上的时间是不一样的。表2、表3 列出常用分辨率及时间参数。
表2 常见刷新率时序表:
时钟
显示模式
(MHz)
行时序(像素数)
a
b
c
d
0x480@60  25.175  96  48  0  16  0x480@75  31.5    120  0  16  800x600@60  40.0  128  88  800  40  800x600@75
49.5
80
160
800
16
1024x768@60
65
136  160  1024
24 1024x768@75
78.8
176
176
1024
16
1280x1024@60  108.0  112  248  1280  48  1280x800@60  83.46  136  200  1280    1440x900@60  106.47  152  232  1440  80
表3常见刷新率时序表(时间): 显
时钟
行时序时间(μs)  示模式
(MHz)
a
b
c
d
0x480@60  25.175  3.81  1.9  25.4  0.635  0x480@75  31.5  2.03  3.8  20.3  0.507  800x600@60  40.0  3.2  2.2  20  1  800x600@75
49.5
1.62
3.2
16.16
0.323
1024x768@60
65
2.09
2.46
15.7
0.37 1024x768@75
65
1.22
2.23
12.99
0.203
1280x1024@60  108  1.04  2.3  11.85  0.444  e
o
800  2  840  3  1056  4  1056
3
1344
6
1312
3
1688  3  1680  3  1904  3  e
o
31.7  .006 26.7  0.08 26.4  0.1  21.3
0.06 20.6  0.12 16.6
0.05 15.6  0.05 帧时序(行数)
p
q
r
s
33  480  10  525  16  480  1  500  23  600  1  628  21
600
1
625
29  768
3
806
28
768
1
800
38  1024  1  1066
24  800  1  828
28  900  1  932
帧时序时间(ms)
p
q
r
s
1.048  15.25  0.317  16.6 0.426  12.8  0.026  13.3 0.6  15.84  0.026  16.6 0.45
12.8
0.021
13.3 0.599  15.87  0.062  16.6 0.466
12.78
0.016
13.3 0.6  16.0  0.015  16.6
1280x800@60  83.46  1.63  2.4  15.3  0.76  20.1  0.06  0.48  16.1  0.02  16.6
1440x900@60  106.47  1.43  2.18  13.52  0.75  17.9  0.05  0.5  16.1  0.017  16.6
二、 时序实现
VGA时序的实现有很多方式,可以用专用芯片,可以用快速的CPU,也可用可编程器件来实现。这里采用廉价的可编程器件,来产生VGA所需的时序。
下面我们以1024x768在60Hz的刷新率下为例,解说VGA时序的产生。
从表2我们可以看出,1024x768@60需要65MHz的驱动时钟。经过计算可知,HSYNC信号频率为kHz,低电平脉冲时间为μs。详细代码如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL; ENTITY vga IS  PORT(
rst:IN STD_LOGIC;     clk:IN STD_LOGIC;     HSYNC:OUT STD_LOGIC;     VSYNC:OUT STD_LOGIC           ); END vga;
ARCHITECTURE one OF vga IS  SIGNAL H_cnt:integer range 0 to 1343;  SIGNAL V_cnt:integer range 0 to 805; BEGIN   PROCESS(rst,clk)  BEGIN   IF rst='0' THEN     HSYNC<='1';   ELSIF clk'EVENT AND clk='1'     IF H_cnt<136 THEN     HSYNC<='0';     ELSE     HSYNC<='1';    END IF;     END IF;   END PROCESS;   PROCESS(rst,clk)  BEGIN   IF rst='0' THEN     H_cnt<=0;    V_cnt<=0;   ELSIF clk'EVENT AND clk='1'     IF H_cnt<1343 THEN     H_cnt<=H_cnt+1;     ELSE     H_cnt<=0;     V_cnt<=V_cnt+1;    END IF;     END IF;  END PROCESS;    PROCESS(rst,clk)     BEGIN
IF rst='0' THEN     VSYNC<='1';   ELSIF clk'EVENT AND clk='1'            IF V_cnt<6 THEN                VSYNC<='0';             ELSE
VSYNC<='1';           END IF;        END IF;     END PROCESS;
END one;
THEN THEN THEN