发一个利用FPGA驱动VGA显示屏的思路,附带伪代码
废话少说首先,我们先来了解一下VGA屏幕的工作原理,我现在手头上有的是640X480的显示屏。显示屏现在的现实原理是利用像素点在三基色的不同搭配而形成现实各种颜色的效果。
详细顶来说就是首先像素点的概念,每一个像素点都有可以接受三个信号即RGB信号。R代表红色,G代表GREEN,B代表BLUE。这三中颜色被称为三基色。利用这三种颜色的不同组合可以拼接成所有的颜色。而我们所需要控制的就是这三种颜色的比例。按照惯例,这三种颜色的信号位宽分别为5,6,5即两位8BIT的数据来描述。一共需要16BIT数据来描述一个像素点。所以,对于一个640X480的显示屏来说,就有640X480X16位数据在一帧里面被现实出来。
对于显示屏来说,显示屏也不过是利用行扫描和场扫描来不断刷新显示屏。具体来说有两种方式。分别是逐行扫描和隔行扫描。逐行扫描就是电子束从左向右逐点扫描。每扫描完一行。电子束会回到下一行的起始位置准备下一行扫描。但是与此同时,CRT会进行消影操作,每行结束后用行信号开始行同步。扫描完所有的行以后就是一帧,这时候用场信号进行场同步。并且电子束回到起始位置,同时进行场消影。
下面我们开始VGA的时序分析。VGA时序很简单。
对于图1来说首先将行信号拉低a事件段以后再拉高,持续b时间段之后下面就是有效时间c。结束之后还有时间d这些都是可以通过数据手册查到的。
对于图2,我们之前先把VSYNC信号拉低,低电平持续时间为o在o时间段以后再拉高,在保持p时间以后就是数据有效段。时间段为q之后位时间段r。
对于这个我们可以设置一个计数变量,比如v_cnt和h_cnt。对于这两个常量可以让它们从一开始即开始计时,
还有来自内存的数据操作
伪代码:时序代码
if(h_cnt<h_a)
HSYNC = 0
else if
HSYNC = 1
if (v_cnt<v_o)
VSYNC = 0
else if
VSYNC = 1
然后我们利用内部资源虚拟一个RAM然后把RAM初始化数据再从中读出数据,这个RAM的大小为19200X16所以只能存取19200个像素点的信号,大概也就是120X160个数据
然后对于现实时序来说,应该是这样的。
伪代码
if (h_cnt > h_a+h_b+h_c+h_d-1)
h_cnt = 0;
else if
h_cnt ++;
if(h_cht == 0)
if (v_cnt >h_o+h_p+h_q+h_f-1)
v_cnt =0
else if
v_cnt++
然后就是现实模块。首先,
if (v_cnt >=v_o+v_p && v_cnt <=v_o+v_p+120)
if(h_cnt >= h_a+h_b && h_cnt <= h_a+h_b+160)
RGB = black
else if
RGB = black
else
RGB = rdata;
接着是内存读取部分
if (v_cnt >=v_o+v_p && v_cnt <=v_o+v_p+120)
if(h_cnt >= h_a+h_b && h_cnt <= h_a+h_b+160)
if (address > 19200)
address =0;
else
address ++;
自己随手写的。很多地方不严谨,希望各路大神不要喷我 先顶一个 数据的来源哪里? 本帖最后由 cxhy 于 2014-3-29 18:35 编辑
MamBa_24 发表于 2014-3-28 17:22
数据的来源哪里?
请问你问的是伪代码还是时序图?
伪代码参考 论坛里面别人的代码自己补上的,时序图和资料来自于网上。 cxhy 发表于 2014-3-29 18:33
请问你问的是伪代码还是时序图?
伪代码参考 论坛里面别人的代码自己补上的,时序图和资料来自于网上。 ...
我是说,你图片的数据从何提取? 图片的时序,是我画的 MamBa_24 发表于 2014-3-30 00:17
我是说,你图片的数据从何提取?
自己生成的,然后放到RAM里面。直接读出来 aureole 发表于 2014-3-30 00:20
图片的时序,是我画的
你是说你09年发的那个帖子吧?那个文档我看了。写的真棒。 前面描述写的还行,再具体点就好了 mark!PPT...
页:
[1]