提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
对VGA的学习与实现,包含VGA的原理、FPGA的完整实现过程,使用FPGA开发板artix-7A35ftg256-1。
一、VGA的基本原理
VGA(Video Graphics Array)视频图形阵列是IBM于1987年随PS/2机一起推出的一种使用模拟信号的视频传输标准,具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用。不支持热插拔,不支持音频传输。
1.1 管脚
1~3:红绿蓝,为光的三原色
13:行同步,执行水平同步(Hsync)扫描
14:列同步,执行垂直同步(Vsync)扫描
其中1、2、3接口的任意一个都连有多个电阻。图示为4K、2K、1K、510四种电阻,进行线或后加载到端口上。这种设计的权重约为8421,因此可以用二进制数字表示颜色。每种颜色的数字范围0000~1111,一共有三种颜色,所以总共是12位色(4096色)
1.2 VGA扫描
要显示整个图像,一行扫描完成后要进行回扫,然后开始下一行的扫描。所有行扫描完成后,需要进行垂直回扫完成扫描过程。垂直扫描的周期长,完成整个屏幕的显示,也称为场或帧。回扫过程需要消隐。
行场消隐信号:是针对老式显像管的成像扫描电路而言的。电子枪所发出的电子束从屏幕的左上角开始向右扫描,一行扫完需将电子束从右边移回到左边以便扫描第二行。在移动期间就必须有一个信号加到电路上,使得电子束不能发出。不然这个回扫线会破坏屏幕图像的。这个阻止回扫线产生的信号就叫作消隐信号,场信号的消隐也是一个道理。
VESA中定义行时序和场时序都需要同步脉冲(Sync a)、显示后沿(Back porch b)、显示时序段(Display interval c)和显示前沿(Front porch d)四部分。由VGA的行时序可知:每一行都有一个负极性行同步脉冲(Sync a),是数据行的结束标志,同时也是下一行的开始标志。在显示时间段(Display interval c)之外没有图像投射到屏幕是插入消隐信号,当消隐有效时,RGB信号无效,屏幕不显示数据。
VGA显示器是由一个一个的像素点组成的,如果有x行y列,就有x*y个像素点。按照规则,要一行一行地显示直到所有行显示完。这种方式也称为扫描。行数据时序就是一行数据的显示时序。
逐行扫描,每一行的时间是垂直扫描的一部分。因此,要完成显示驱动,最重要的工作就是实现水平同步(扫描〉Hsync和垂直同步(扫描)Vsync信号的时序。
分辨率、频率参数,其中时钟是每个像素点的刷新频率
二、FPGA实现
1.IP核调用
假设采用800×600@75的模式:
75
∗
1056
∗
625
=
49.5
M
.
75*1056*625=49.5M.
75∗1056∗625=49.5M.因此需要49.5M的时钟。现在有50M的时钟,要想得到49.5M的时钟,最直接简单合理的方法就是使用VIVADO提供的IP核。
clockwizard的窗口弹出,可以看到有IP符号和5个页框。在第一个页框(时钟选项页)中修改输入时钟频率为50MHz,然后切换到第二个页框(输出时钟)。在第二个页框中,将第一个输出时钟选中,将频率修改为49.5MHz。然后不选下面的复位(reset)和锁住(locked)检查框。这时得到下图所示的窗口。
2.电路设计
代码如下(示例):
module v_vga(
input clk,
//input sw,
// output led,
output Vsync,
output Hsync,
output [3:0]vgaRed,
output [3:0]vgaGreen,
output [3:0]vgaBlue
);
parameter
ta=80,tb=160,tc=800,td=16,te=1056,to=3,tp=21,tq=600,tr=1,ts=625;
reg[10:0] x_counter=0;
reg[10:0] y_counter=0;
reg[2:0] colour;
wire clk_vga;
// assign led=sw;
//调用的ip核模块
clk_wiz_0 ddd
(
.clk_out1(clk_vga),
.clk_in1(clk)
);
//进行扫描
always @(posedge clk_vga) begin
if (x_counter==te-1) begin
x_counter = 0;
if(y_counter==ts-1) begin
y_counter=0;
end
else begin
y_counter = y_counter+1;
end
end
else begin
x_counter = x_counter+1;
end
end
//
always @(x_counter or y_counter) begin
if (x_counter<ta+tb) colour<=3'b000;
else if (x_counter<ta+tb+300) colour<=3'b100;
else if (x_counter<ta+tb+600) colour<=3'b010;
else if (x_counter<ta+tb+800) colour<=3'b001;
else colour<=3'b000;
end
assign vgaRed={4{colour[2]}};
assign vgaGreen={4{colour[1]}};
assign vgaBlue={4{colour[0]}};
assign Hsync=!(x_counter<ta);
assign Vsync=!(y_counter<to);
endmodule
3.仿真测试
module sim_vga;
reg clk;
// reg sw;
// wire led;
wire Vsync;
wire Hsync;
wire vgaRed;
wire vgaGreen;
wire vgaBlue;
v_vga tta( clk, Vsync, Hsync,vgaRed, vgaGreen,vgaBlue
);
initial begin
clk=1;
end
always #10 clk=~clk;
endmodule
仿真结果
4.引脚约束
## CLK
set_property PACKAGE_PIN D4 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
# HS
set_property PACKAGE_PIN R13 [get_ports Hsync]
set_property IOSTANDARD LVCMOS33 [get_ports Hsync]
# VS
set_property PACKAGE_PIN T13 [get_ports Vsync]
set_property IOSTANDARD LVCMOS33 [get_ports Vsync]
# RGB
set_property PACKAGE_PIN F5 [get_ports {vgaRed[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed[0]}]
set_property PACKAGE_PIN F4 [get_ports {vgaRed[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed[1]}]
set_property PACKAGE_PIN M16 [get_ports {vgaRed[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed[2]}]
set_property PACKAGE_PIN M15 [get_ports {vgaRed[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed[3]}]
set_property PACKAGE_PIN N16 [get_ports {vgaGreen[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen[0]}]
set_property PACKAGE_PIN P15 [get_ports {vgaGreen[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen[1]}]
set_property PACKAGE_PIN P16 [get_ports {vgaGreen[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen[2]}]
set_property PACKAGE_PIN R15 [get_ports {vgaGreen[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen[3]}]
set_property PACKAGE_PIN R16 [get_ports {vgaBlue[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue[0]}]
set_property PACKAGE_PIN T15 [get_ports {vgaBlue[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue[1]}]
set_property PACKAGE_PIN P14 [get_ports {vgaBlue[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue[2]}]
set_property PACKAGE_PIN T14 [get_ports {vgaBlue[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue[3]}]