首先:
VGA驱动显示器用的是扫描的方式,逐行扫描the HS (Horizontal Synchronization)
逐行扫描是扫描从屏幕的左上角一点开始,由左向右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,
在这期间CRT(阴极射线显像管)对电子束进行消隐,每行结束时,用行同步信号进行同步;
当扫描完所有行之后形成一帧,用场同步信号进行同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。
VGA一直在扫描,每一场的扫描包括了若干行扫描,依次循环;
一个标准的VGA接口应该有以下端口:
红绿蓝三色信号(R\G\B)
行场同步信号(HS\VS)
以及很多的地屏蔽;
三色信号都是模拟信号,行场同步信号都是数字信号;
颜色信号端口的驱动方式:1、直接用数字信号驱动;2、用数字信号输出和VGA接口之间加入一段简单的DA电路;
行场同步信号的驱动:
标准VGA显示的场频是60Hz,行频是31.5KHz
行场消隐信号:是针对老式显像管的成像扫描电路而言的。电子枪所发出的电子束从屏幕的左上角开始向右扫描,一行扫完需将电子束从右边移回到左边以便扫描第二行。在移动期间就必须有一个信号加到电路上,使得电子束不能发出。不然这个回扫线会破坏屏幕图像的。这个阻止回扫线产生的信号就叫作消隐信号,场信号的消隐也是一个道理。
时钟频率:以[email protected](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