1.VGA介绍
VGA(Video Graphics Array)即视频图形阵列,是IBM在1987年随PS/2(PS/2 原是“Personal System 2”的意思,“个人系统2”,
是IBM公司在1987年推出的一种个人电脑。PS/2电脑上使用的键盘鼠标接口就是现在的PS/2接口。因为标准不开放,PS/2电脑在市场中失败了。
只有PS/2接口一直沿用到今天)一起推出的使用模拟信号的一种视频传输标准,在当时具有分辨率高、显示速率快、颜色丰富等优点,
在彩色显示器领域得到了广泛的应用。这个标准对于现今的个人电脑市场已经十分过时。即使如此,VGA仍然是最多制造商所共同支持的一个标准,
个人电脑在加载自己的独特驱动程序之前,都必须支持VGA的标准。例如,微软Windows系列产品的开机画面仍然使用VGA显示模式,
这也说明其在显示标准中的重要性和兼容性。(来自百度百科)
VGA接口就是显卡上面输出模拟信号的接口。VGA接口是一种D型接口,上面共有15针孔,分成3排,每排5个,
VGA接口是目前中低端配置电脑的主流接口。
实物图如下图所示:
VGA显示中,FPGA需要产生5个信号分别是:行同步信号HS、场同步信号VS、R、G、B三基色信号。
接口中最主要的几根线:
信号 | 定义 |
HS | 行同步信号(3.3V) |
VS | 场 / 帧 同步信号(3.3V) |
R | 红基色 (0~0.714V 模拟信号) |
G | 绿基色 (0~0.714V 模拟信号) |
B | 蓝基色 (0~0.714V 模拟信号) |
颜色 | 黑 | 蓝 | 红 | 紫 | 绿 | 清 | 黄 | 白 |
R | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
G | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
B | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
module vga_port(
clk ,
rst_n ,
lcd_vs ,
lcd_hs ,
lcd_data
);
input clk ;
input rst_n ;
output lcd_vs ;
output lcd_hs ;
output[15:0] lcd_data ;
wire clk_25mhz ;
my_pll uut0(
.inclk0(clk) ,
.c0(clk_25mhz)
);
wire [9:0] row_addr_sig ;
wire [9:0] column_addr_sig ;
wire ready_sig;
vga_sync_module uut1(
.clk (clk_25mhz) ,
.rst_n (rst_n) ,
.lcd_vs (lcd_vs) ,
.lcd_hs (lcd_hs) ,
.row_addr_sig (row_addr_sig) ,
.column_addr_sig(column_addr_sig) ,
.ready_sig(ready_sig)
);
vga_control_module uut2(
.clk (clk_25mhz) ,
.rst_n (rst_n) ,
.lcd_data (lcd_data) ,
.row_addr_sig (row_addr_sig) ,
.column_addr_sig(column_addr_sig) ,
.ready_sig (ready_sig)
);
endmodule
module vga_sync_module(
clk ,
rst_n ,
lcd_vs ,
lcd_hs ,
row_addr_sig ,
column_addr_sig ,
ready_sig
);
input clk ;
input rst_n ;
output lcd_vs ;
output lcd_hs ;
output ready_sig ;
output [9:0] row_addr_sig ;
output [9:0] column_addr_sig ;
reg ready_sig ;
reg [9:0] HS ;
reg [9:0] VS ;
always @ (posedge clk or negedge rst_n)begin
if(rst_n==1'b0)
HS<=10'd0;
else if(HS==10'd799)
HS<=10'd0;
else
HS<=HS+1'b1;
end
always @ (posedge clk or negedge rst_n)begin
if(rst_n==1'b0)
VS<=10'd0;
else if(VS==10'd524&&HS==10'd799)
VS<=10'd0;
else if(HS==10'd799)
VS<=VS+1'b1;
end
always @ (posedge clk or negedge rst_n)begin
if(rst_n==1'b0)
ready_sig<=1'b0;
else if(HS>140&&HS<787&&VS>31&&VS<516)
ready_sig<=1'b1;
else
ready_sig<=1'b0;
end
assign row_addr_sig = ready_sig ? VS-10'd32 :10'd0 ;
assign column_addr_sig = ready_sig ? HS-10'd141 : 10'd0 ;
assign lcd_hs=(HS<96)?1'b0:1'b1;
assign lcd_vs=(VS<2) ?1'b0:1'b1;
endmodule
module vga_control_module(
clk ,
rst_n ,
lcd_data ,
row_addr_sig ,
column_addr_sig ,
ready_sig
);
input clk ;
input rst_n ;
input [9:0] row_addr_sig ;
input [9:0] column_addr_sig;
input ready_sig ;
output[15:0] lcd_data ;
reg [15:0] lcd_data ;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
lcd_data <=16'd0;
end
else if(ready_sig&&column_addr_sig>=1&&column_addr_sig<=640&&row_addr_sig>=1&&row_addr_sig<=400) begin
lcd_data <=16'h3;
end
else
lcd_data<=16'h0;
end
endmodule
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
lcd_data <=16'd0;
end
else if(ready_sig&&column_addr_sig>=1&&column_addr_sig<=640&&row_addr_sig>=1&&row_addr_sig<=400) begin
lcd_data <=16'h3;
end
else
lcd_data<=16'h0;
end
该电路的显示效果为,上面大部分屏颜色为淡蓝色。