关于VGA的显示原理和Verilog语言实现/学习笔记

来源:互联网 发布:旅游拼车 知乎 编辑:程序博客网 时间:2024/06/05 04:49

首先:

VGA驱动显示器用的是扫描的方式,逐行扫描the HS (Horizontal Synchronization)

逐行扫描是扫描从屏幕的左上角一点开始,由左向右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,

在这期间CRT(阴极射线显像管)对电子束进行消隐,每行结束时,用行同步信号进行同步;

当扫描完所有行之后形成一帧,用场同步信号进行同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。

VGA一直在扫描,每一场的扫描包括了若干行扫描,依次循环;

一个标准的VGA接口应该有以下端口:

红绿蓝三色信号(R\G\B)

行场同步信号(HS\VS)

以及很多的地屏蔽;

三色信号都是模拟信号,行场同步信号都是数字信号;

颜色信号端口的驱动方式:1、直接用数字信号驱动;2、用数字信号输出和VGA接口之间加入一段简单的DA电路;

行场同步信号的驱动:

标准VGA显示的场频是60Hz,行频是31.5KHz

行场消隐信号:是针对老式显像管的成像扫描电路而言的。电子枪所发出的电子束从屏幕的左上角开始向右扫描,一行扫完需将电子束从右边移回到左边以便扫描第二行。在移动期间就必须有一个信号加到电路上,使得电子束不能发出。不然这个回扫线会破坏屏幕图像的。这个阻止回扫线产生的信号就叫作消隐信号,场信号的消隐也是一个道理。

时钟频率:以640x480@59.94Hz(60Hz)为例,每场对应525个行周期(525=10+2+480+33),其中480为显示行。每场有场同步信号,该脉冲宽度为2个行周期的负脉冲,每显示行包括800点时钟,其中640点为有效显示区,每一行有一个行同步信号,该脉冲宽度为96个点时钟。由此可知:行频为525*59.94=31469Hz,需要点时钟频率:525*800*59.94约25MHz

Verilog代码:

输入定义:

module main(clk,VGA_HS,VGA_VS,VGA_R,VGA_G,VGA_B)

input clk;

output VGA_HS,VGA_VS,VGA_R,VGA_G,VGA_B;

reg [10:0] x_counter;

reg [10:0]y_counter;

reg [3:1] GRBX;

扫描代码:

always@(posedge clk)begin

if(x_counter==1055)//行扫描计数

begin

x_counter=0;//回到左边开始扫描

if(y_counter==627)//列扫描计数

y=counter=0;

else

y_counter=y_counter+1;

end

else

x_counter=x_counter+1;

end

颜色控制代码:

always@(x_counter or y_counter)

begin

if(x_counter<100)   GRBX<=3'b111;

else if(x_counter<200)   GRBX<=3'b110;

else if(x_counter<200)   GRBX<=3'b101;

else if(x_counter<200)   GRBX<=3'b100;

else if(x_counter<200)   GRBX<=3'b011;

else if(x_counter<200)   GRBX<=3'b010;

else if(x_counter<200)   GRBX<=3'b001;

else GRBX<=3'b000;

end

assign VGA_R= GRBX[2];

assign VGA_G= GRBX[3];

assign VGA_B= GRBX[1];


assign

VGA_DESIGN.V工程顶层文件,例化各个模块;

VGA_DISPLAY.V显示电路,根据时序,用于描述VGA的显示电路;

VGA_DRIVER.V驱动电路,对时序状态的约束;

sys_ctrl.v是PLL时钟分配电路;

分析链接:http://www.eepw.com.cn/article/275552_2.htm


基本框架:

1)输入输出端口定义;

2)根据显示屏对行列坐标进行计算和定义;

3)设置有效显示区标志范围;

4)产生同步信号;

5)根据要求进行显示要求设置;(分为形状和颜色两部分)

参考代码链接:http://blog.sina.com.cn/s/blog_5248460001017jab.html
























0 0
原创粉丝点击