VGA显示控制器

在这个设计中,你将被要求做一个VGA控制器在你的显示器上显示一些东西。实际上,VGA控制器是一个非常简单的设计,它只需要两个计数器和几个比较器。

先决条件

软件

硬件

过程

在这个设计挑战中,您被要求实现一个电路,产生VGA信号,在您的显示器上绘制一个分辨率为640×480的蓝屏。下面的材料提供了VGA信号如何运行的详细描述和一些提示如何设计VGA控制器。

VGA概述

VGA代表视频图形阵列。最初,它特指1987年IBM®PS/2计算机首次引入的显示硬件。随着广泛采用,它现在通常指模拟计算机显示标准(由VESA®定义)、DE-15连接器(通常称为VGA连接器)或640×480分辨率本身。

模拟计算机显示标准由VESA组织(www.vesa.org)指定、发布、拥有版权和销售。这个项目中使用的时序信息是一个示例,说明如何以640×480分辨率驱动VGA监视器。

DE-15连接器,通常称为VGA连接器,是一种三排15针d超小型连接器(以其d形金属屏蔽命名)。每个引脚的名称如下图1所示。在这个项目中,我们只关注15个引脚中的5个信号。这些信号是红色,Grn,蓝色,HS,和VS,红色,Grn,和蓝色是三个模拟信号,指定屏幕上的一个点的颜色,而HS和VS提供一个位置参考点应该显示在屏幕上的位置。通过根据VGA时序规范正确地驱动这五个信号,我们可以在任何显示器上显示我们想要的一切。为了理解这些信号是如何被驱动的,我们需要看看我们的监视器实际上是如何工作的。

我们的显示器是如何工作的?

基于crt的VGA显示器使用调幅移动电子束(或阴极射线)在磷涂层屏幕上显示信息。液晶显示器显示器使用一组开关,可以在少量的液晶上施加电压,从而在一个像素一个像素的基础上改变通过晶体的光介电常数。虽然下面的描述仅限于CRT显示器,液晶显示器显示器已经发展到使用与CRT显示器相同的信号计时(因此下面的“信号”讨论涉及CRT和lcd)。彩色CRT显示器使用三束电子束(一束红色,一束蓝色,一束绿色)来激发覆盖在阴极射线管显示端内侧的磷(见下图2)。

电子束从“电子枪”发出,“电子枪”是放置在被称为“栅极”的带正电荷的环形板附近的尖细的、加热的阴极。栅极施加的静电力将带电电子的射线从阴极拉出,而这些射线由流入阴极的电流提供。这些粒子射线最初被加速向栅极移动,但它们很快就会受到阴极射线管(CRT)整个磷化表面带电到20kV(或更高)所产生的更大的静电力的影响。光线在穿过网格中心时聚焦成一束,然后加速撞击磷涂层的显示表面。荧光粉表面在撞击点发出明亮的光,并且在光束被移除后,它还会持续发光几百微秒。注入阴极的电流越大,荧光粉发出的光就越亮。

在网格和显示表面之间,光束通过CRT的颈部,在那里两个线圈产生正交的电磁场。因为阴极射线是由带电粒子(电子)组成的,它们可以被这些磁场偏转。电流波形通过线圈产生磁场,磁场与阴极射线相互作用,使阴极射线以“光栅”模式横向显示表面,从左到右水平,从上到下垂直,如图3所示。当阴极射线在显示器表面移动时,发送到电子枪的电流可以增加或减少,以改变阴极射线撞击点处显示器的亮度。

信息只在光束“向前”移动时显示(从左到右和从上到下),而不是在光束被重置回显示的左或上边缘期间。因此,当光束重置和稳定以开始一个新的水平或垂直显示通道时,大部分潜在的显示时间在“消隐”周期中丢失。光束的大小、光束可以在显示器上被跟踪的频率以及电子束可以被调制的频率决定了显示器的分辨率。

VGA时序规范

现代VGA显示器可以容纳不同的分辨率,VGA控制器电路通过产生时序信号来控制光栅模式来指示分辨率。控制器必须产生3.3V(或5V)的同步脉冲,以设置电流流过偏转线圈的频率,它必须确保视频数据在正确的时间应用到电子枪上。光栅视频显示器定义了一系列的“行”,这些“行”对应于阴极在显示区域的水平通过次数,以及一系列的“列”,这些“列”对应于每一行的一个区域,这个区域被分配给一个“图像元素”,或像素。典型的显示器使用240到1200行和320到1600列。显示器的总体大小以及行和列的数量决定了每个像素的大小。

视频数据通常来自视频刷新存储器;为每个像素位置分配一个或多个字节(Nexys4使用12位/像素,Nexys 2、Nexys 3和Basys2使用8位)。当电子束穿过显示器时,控制器必须索引到视频存储器中,并在电子束穿过给定像素时准确地检索和应用视频数据到显示器。

VGA控制器电路必须产生HS和VS时序信号,并基于像素时钟协调视频数据的传输。像素时钟定义了用于显示一个像素信息的可用时间。VS信号定义了显示器的“刷新”频率,或显示器上所有信息重绘的频率。最小刷新频率是显示器荧光粉和电子束强度的函数,实际刷新频率在50Hz到120Hz范围内。在给定的刷新频率下显示的行数定义了水平的“回溯”频率。

640x480@60Hz的定时规格

图4和下表提供了640×480分辨率在60Hz帧率下的定时规范:

描述 符号 时间 宽/频率
像素时钟 tclk 39.7 ns(±0.5%) 25.175兆赫
贺南洪同步时间 解说 3.813μs 96像素
贺南洪后门廊 thbp 1.907μs 48像素
贺南洪门廊 thfp 0.636μs 16个像素
Hor Addr视频时间 thaddr 25.422μs 640像素
贺南洪L / R边界 thbd 0μs 0像素
V同步时间 电视 0.064毫秒 两条线
V后门廊 tvbp 1.048毫秒 33行
V门廊 tvfp 0.318毫秒 10行
V Addr视频时间 tvaddr 15.253毫秒 480行
V T / B边界 tvbd 0女士 0行

提示

首先,您需要一个时钟分频器来生成像素时钟,它为HS和VS信号提供一个定时参考。规格中像素时钟频率为25.175MHz。然而,在±0.5%的精度下,25MHz也可以接受。而且很明显,使用之前项目中实现的时钟分频器,可以很容易地在FPGA板上生成25MHz。

其次,你需要两个计数器,一个计数器(水平计数器)用于计算每一行中的像素,另一个计数器(垂直计数器)用于计算帧中的行数。水平计数器需要重置本身当它到达结束线(799在这种情况下),当它重置,它需要提供一个终端计数信号允许输入的垂直柜台,以便垂直计数器加1,当一个新行开始。类似地,当垂直计数器到达帧的末尾时,它需要重新设置自己。因此,在此设计中需要将一些更改调整到您在以前项目中实现的计数器中。

根据计数器值,我们可以将其与规范中定义的常数进行比较,从而产生HS和VS信号。注意,你必须驾驶红色,Grn和蓝色接地显示区域外。图5显示了基于计数器值的HS和VS生成。

参考框图如下图6所示。

挑战

  1. 在显示器上画一个“十字准星”图案。十字头发图案是一个480像素高,1像素宽的垂直列在显示器的中心,640像素长,1像素高的横线穿过显示器的中间。
  2. 在你的十字线模式中,屏幕上的垂直线是否在晃动?为什么会这样?你怎么能修好它呢?
  3. 你能在屏幕上画一个5像素乘5像素的正方形吗?
  4. 你能让5乘5的正方形在屏幕上以每秒60像素的速度飞行吗?
  5. 你能让显示器上的十字线图案慢慢旋转吗?