VGA编程接口讲解

1VGA接口和管脚定义的介绍

VGA是一种常见的显示器接口,接口大概是下面这样

想必大家之前都见过。上面有15个针脚,通过给这15个针脚发送信号脉冲就可以控制显示屏显示我们需要的图像。

下面仅仅提一下简单的几个本文需要用到的针脚定义

1 VGA-R 表示红色的亮度

2 VGA-G 表示绿色的亮度

3 VGA-B 表示蓝色的亮度

RGB三个亮度电平组合起来就是我们最终看到的颜色,每个电平的取值范围为0~7

13行同步信号

14行同步信号  两个同步信号的功能在后面会讲到

VGA共有15个针脚,其它针脚小伙伴们可自行查阅

2像素的概念

我们平常见到的显示屏都是由一个一个的像素构成的,其实就是在屏幕上整齐排列的小色块,每个色块在同一时刻只有一个颜色

例如像素是1024*768的屏幕,就是指横向有1024个像素,纵向有768个像素,远远地看这些色块就组成了一幅平滑的图像

3VGA的扫描路径

为了讲解描述,这里选取一块像素为8*8的屏幕,它的像素公布是下面这样

显示屏内部是一个电子枪,电子打在屏幕上的一个位置,对应的位置就会点亮,当电子枪瞄准下一个像素块的时候,之前点亮的像素又会熄灭。嗯,没错,屏幕上的每一个像素的点亮只是一瞬间。之所以能看到屏幕一直是亮着的是因为电子枪的移动速度很快,大部分每秒钟可以把整个屏幕扫描60次,有的是72次。人眼视觉上的留影效果会让人觉得它一直是亮着的。

但电子枪也不是在屏幕里面胡乱扫射,而是按照一定的路径,具体的路径是像下面这样

扫描是按照从左到右,从上到下的顺序,扫描完整个一个屏幕后回到屏幕的左上角重新开始

下面来放慢动作,观察一下像素扫描的时候的一些细节

选取一个不太特殊的点来开始电子枪的扫描过程

在这短短的一个瞬间(一个时钟周期)内,电子枪从VGA接口中的1~3管脚的输入中获取颜色电平,把对应的颜色打在当前瞄准的这个像素内。

等下一个时钟脉冲到来时,电子枪瞄准下一个像素的位置,把VGA的当前颜色打在当前的位置上。所以如果要正确地显示图像,VGA接口上的颜色输入就要跟随内部时钟而改变然而外部是无法获得显示器内部工作时钟有工作状态的,因此才会涉及到同步的问题,至于如何保证内外的同步一会再说

现在电子枪一个像素一个像素地扫描,来到了这一行的最后一个像素

这个时候,按照电子枪的习惯,它就应该返回到下一行的开始了

但是你不觉得这个时候会有什么问题吗,电子枪可没有我们想象得那么智能呀。电子枪在两行之间转换的时候并不会停止工作!!!!!!!这个时候如果VGA的颜色输入上依然还有输入的话,会在屏幕上留下痕迹。所以这个时候要把颜色输入关掉,但不是让你把VGA接口拔掉,而是把颜色的三个输入都调整为0,这样电子枪在回程的时候才不会留下痕迹,不然视觉上会有严重的干扰。

那程序员可能会说,那我在扫描到一行的尽头的时候把输入变一下就好了呗。然而,VGA接口才不会告诉你它什么时候扫描到了尽头,你需要自己去猜,自己去拿捏,自己去感悟!是不是突然玄学了起来?这是VGA令人感到不适的地方之一。

那我们来说说编程的时候我们知道的是什么,你可以知道屏幕内部的扫描频率,就是那个【控制电子枪一个像素一个像素移动】的那个时钟,我们在外部要搞一个尽量和它频率一样的时钟,然后开始算内部的扫描什么时候扫描到了尽头。控制VGA接口的外部程序的心态可能是这样的。。拟人化。。疯狂暗示。。下面是那个程序的心声

好,下面内部的电子枪应该扫描到了屏幕的中央,还是正常工作的状态,给它一个红色高亮。

……

嗯,我掐指一算,下面电子枪已经走到了尽头,到了回程的时间了,那我就等它一会儿,现在把颜色输入关了,等电子枪大概回到开关了再开始

……

嗯,好,现在差不多了,让我们重新开始,输入颜色走起

然而我们到底要等多久呢??凡是工程上的东西总是有一些手册可以参考,像VGA这种国际统一约定的接口标准更是不能例外。下面推荐一个网址,里面可以找到你需要的等待时间

http://tinyvga.com/vga-timing

然后拿出来其中的一套表格来说明一下

这是一个800*600的显示屏的VGA驱动参数,内部的时钟频率是50MHz,time那一列的数据可能比较直观一些,但是编程的时候我们主要用的还是pixels(像素)那一列的数据。。。这是什么东西??

咱们主要就是为了知道扫描完一行之后应该等待多少时间嘛,time(微秒)是一种表达方式,我们还可以用一种等效的方式来确定这个等待的时间。。上图

在编程的时候,编程的计数时钟扫描完一行之后,假装后面还有像素,假装继续向后扫描,只不过扫描这部分的时候不输入颜色。

那上面那个表格里的pixels是什么意思呢?它表示我们在扫描完一行,需要等待的时间是内部时钟周期的几倍。对于上面的800*600的情况,也就是每扫描完一行,继续向后再扫描64个像素,假装扫描的这个过程就是电子枪返回的过程

接下来就要说同步脉冲的问题了,先来留个空白松口气。。。。

我们上面提到的只是颜色信号,还有两个13和14号管脚一直没有用到呢。

电子枪在回到一行的开始后,并不会立刻开始

外部的程序和内部的时钟要达到同步,必须要约定一个开始的时间,否则你在外部推算的它什么时候扫描到尾部,什么时候回到开头,都会和真实的情况产生错位。并且两个时钟不可能完全一样,如果不及时矫正的话内外时钟误差会越来越大。就好像我们的手表每用一段时间就要校准一次一样。

怎样才是校准呢??这个时候就要用到13号管脚了,它叫做【行同步脉冲信号】

这个信号通常是1,当需要进行同步的时候把这个信号置0,过一会儿再把它改回1,就完成了一次“时钟校准”

把同步脉冲置0需要用多久呢,上面的表格给出了这个信息,就是这里↓

和刚才的等待回程时间的理解方式相同,它在这里表示的是同步脉冲时间为内部扫描时钟周期的120倍,同样地我们假装它在扫描开始的时候多了一些额外的扫描像素单元(图中蓝色的像素单元)

同步脉冲过后还要进行一段的“等待回程”时间,为什么还要继续等待呢?这里仅表达一下个人猜测

【同步脉冲实际上发生在电子枪回程的过程中,为了充分的利用时间,在电子枪回程的时候顺便就完成了时钟的同步过程……总之……按照手册上来使用就好了】

等待完这一段“回程时间”之后,下一行的扫描就重新开始了。这样,我们可以把VGA内部一屏的扫描过程理解成下面这样

嗯,这样在一行的周期里面分为四个时期,【同步脉冲时期】【消隐前肩时期】【像素显示时期】【消隐后肩时期】,每个时期的长度都可以通过查表得到

现在完整地扫描完了一个屏幕,到了回到屏幕最初起点的时候了。这个整个屏幕的回程和每一行的回程面临的问题是类似的

在上下加若干【假想的像素

当然,类似地还有一个【场同步脉冲】,由第14管脚来控制。同步地时候置0,平常正常工作的时候置1

场消隐时间和同步脉冲时间也可以从上面的表格里面获得

同样地也可以对应四个时期,只不过在这里每个时期的时间是用行来表示的。所以你脑海里的电子枪扫描路径就可以是这样

写到这里,想必你已经清楚VGA的编程接口如何使用了吧。

这里有一篇小小的例子可供参考

https://blog.csdn.net/qq_39148922/article/details/85010426

如果有问题和想法欢迎交流指正。

猜你喜欢

转载自blog.csdn.net/qq_39148922/article/details/85005271
VGA