微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > FPGA和CPLD > 使用FPGA控制VGA显示

使用FPGA控制VGA显示

时间:11-08 来源:互联网 点击:
VGA 时序设计

在 VGA 中,水平同步脉冲在光栅扫描 线需要回到水平开始位置也就是屏幕的左边的时候插入,垂直同步脉冲在光栅扫描线需要回到垂直开始位置也就是屏幕的上方的时候插入。复合同步脉冲是水平同步脉冲与垂直同步信号的组合。RGB 为像素数据,在没有图像投射到屏幕时插入消隐信号,当消隐有效时,RGB 信号无效。

水平时序

在水平时序中,包括以下几个时序参数:水平同步脉冲宽度;水平同步脉冲结束到水平门的开始之间的宽度;一个视频行可视区域的宽度;一个完整的视频行的宽度,从水平同步脉冲的开始到下一个水平同步脉冲的开始。

垂直时序

在垂直时序与水平时序类似,包括以下几个不同的时序参数:垂直同步脉冲宽度; 垂直同步结束到垂直门的开始之间的宽度; 一个视频帧可是区域的宽度;一个完整视频帧的宽度,从垂直同步脉冲到下一个垂直同步脉冲的开始。

组合视频帧时序

视频帧由 vlen 个视频行组成,每一行由 hlen 个像素,水平门与垂直门的“与”函数 即为可是区域,图像的其他区域为消隐区。 目前存在很多种不同VGA 模式,以下就常见的各种模式种参数进行说明,给出 VGA 模式中各种时序参数可以参考。
表 1 水平时序



说明:有效时间包括 6 列过扫描边界列,有些时序表将这几列加在后沿和前沿中      

表 2 垂直时序



说明:有效时间包括 4 行过扫描边界行,有些时序表中将这几行加在后沿和前沿中。

*当有效时间增加时,它超过了 vsync 信号的上升沿,因此前沿为-1

在实际设计中如何通过不同的系统频率确定适当的显示模式 ? 例如在 RhicSP2200 开发板中FPGA 的系统时钟频率为 50MHz。这个时钟频率可以用来设计 显示 800X600 模式,为了显示器显示效果好,采用场频(刷新频率)75Hz,那么帧长可以确定为 666,而行总长设计为 1000 像素。

根据以上所述,我们可以设计如Examples1类似HDL代码,使用这段代码在Valid 有效期间对RGB 中 Blue 两位赋值1,得到一个蓝色屏幕显示边界如图1 所示。


               
色彩原理

RGB 色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色 通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB 即是代表红、 绿、蓝三个通道的颜色,通过三种基本颜色亮度值从 0"255 不同产生出其他各种颜色,这种模式叫加色模式。为什么叫加色模式呢,举个例子,通常使用的电视屏幕和电脑 屏幕上的显示就是这样的模式,在没有图象时,屏幕是黑的,若R,G,B 三色亮度都为255 时混合叠加打在屏幕上时则显示成白色。就是加起来是白色的意思,叫加色模式。这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之 一。

而与我们电脑相关的地方,就是目前的显示器大都是采用了 RGB 颜色标准,这就是为什么它对我们来说这么重要了。

在显示器上,是通过电子枪打在屏幕的红、绿、蓝三色发光极上来产生色彩的,目前的电脑一般都能显示 32 位颜色,约有一百万种以上的颜色。如果说它所显示的颜色 还不能完全吻合自然界中的某种色彩的话,那已经几乎是我们肉眼所不能分辩出来的了。

而 RhicSP2200 开发板系统中每一个色 彩都是使 用 2bit 来 表示的,因 此可见 RhicSP2200 系统可以出现64 种不同的颜 色。其他色彩的使用请在实际工作中更多的加以体会。

显示

通过以上的讲述,已经可以在计算机显示器上显示一个有颜色的区域了,在这个小节中我们再举一个简单的例子,在显示器中显示两个镶嵌的正方形,字符等显示与其类似,可以参考瑞芯科技其他设计示例。 例如我们可以在 xpos 与 ypos 的某一区间给 RGB 信号赋不同的值将得到如图2 所示的显示效果。



例子 1:使用 50MHz 时钟频率产生的 VGA 同步脉冲以及视频有效信号

module sync_gen_50m(
rst_n,// synthesis attribute clock_buffer of rst_n is ibufg;
clk,

hsync,
vsync,
valid,
x_cnt,
y_cnt
);
input rst_n ;
input clk ;

output hsync ;
output vsync ;
output valid ;
output [9:0] x_cnt ;
output [9:0] y_cnt ;

reg hsync ;
reg vsync ;
reg valid ;
reg [9:0] x_cnt ;
reg [9:0] y_cnt ;

always @ ( posedge clkornegedge rst_n )
if ( !rst_n )
x_cnt <= 10'd0;
else if ( x_cnt == 10'd1000 )
x_cnt <= 10'd0;
else
x_cnt <= x_cnt + 1'b1;

always @ ( posedge clkornegedge rst_n )
if ( !rst_n )
y_cnt <= 10'd0;
else if ( y_cnt == 10'd665 )
y_cnt <= 10'd0;
else if ( x_cnt == 10'd1000 )
y_cnt <= y_cnt + 1'b1;

always @ ( posedge clkornegedge rst_n )
if ( !rst_n )
begin
hsync <= 1'b0;
vsync <= 1'b0;
end
else
begin
hsync <= x_cnt <= 10'd50;
vsync <= y_cnt <= 10'd6;
end

always @ ( posedge clkornegedge rst_n )
if ( !rst_n )
valid <= 1'b0;
else
valid <= ( ( x_cnt > 10'd180 ) && ( x_cnt < 10'd980) &&
( y_cnt > 10'd35) && ( y_cnt < 10'd635) );

endmodule

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top