VGA接口电路设计

1.VGA介绍

VGAVideo 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 模拟信号)



2.VGA显示原理

2.1 色彩显示原理

RGB三基色可以组成不同的颜色,如下图所示:

但是按照这个理解三基色(如上图所示)只能组成7种颜色,实际上还有黑色(0,0,0)
三基色颜色编码:
颜色绿
R00110011
G00001111
B01010101

实际上,对于显示器来说,RGB三个信号其实是模拟信号,其电平的高低可以表示颜色的深浅。
利用这个原理,我们就可以产生丰富的色彩。为了控制电压的高低,我们就必须用到DA芯片。
例如下图中,FPGA产生RGB三种信号,这时RGB都是多位的数字信号。DA芯片根据信号数字的值,
产生不同电压的模拟信号RGB。

2.2 扫描原理
2.2.1光栅扫描过程如下:

显示器采用光栅扫描方式,即轰击荧光屏的电子束在CRT(Cathode Ray Tube  阴极射线显像管)屏幕上从左到右(受水平同步信号HSYNC控制)、从上到下(受垂直同步信号VSYNC控制)做有规律的运动。电子束采用光栅扫描方式,从屏幕做上角一点开始,向右逐点进行扫描,形成一条水平线;到达最右端后,又回到下一条水平线的左端,重复上面的过程;当电子束完成右下角一点的扫描后完成一帧。此后电子束又回到左上方起点,
开始下一帧的扫描。这种方法也就是常说的逐行扫描显示。

2.2.2 扫描频率
完成一行扫描时间称为水平扫描时间,其倒数称之为行频率,完成一帧的扫描时间称为垂直扫描时间,其倒数称之为场频率,即刷新一屏的频率,
常见的有60hz、75hz等。

2.2.3 扫描时序
                       


     行时序


  
                                                                                             场时序


HSYNC Signal是用来控制“列填充”, 而一个HSYNC Signal可以分为4个段,也就是a (同步段)b(后廊段),c(激活段),d(前廊段)。 

VSYNC Signal是用来控制“行扫描”。而一个VSYNC Signal同样可以分为4个段,也是o (同步段)p(后廊段),q(激活段),r(前廊段)。 

2.2.4 VGA支持的规格

以640*480@60为例,一帧所需要的时间:1s/60=0.017s。 1行所需要的时间:0.017s/525=32.39us  单位‘’元素‘’    所需要时间:32.39us/800=40.5ns 
因此在这个显示模式下CRT所需要的时钟频率为:1s/40.5ns=24.69MHZ   四舍五入取 25MHZ可以满足要求。

3. 电路设计

本验证平台为黑金开发板。

电路实现框图如下:
1. my_pll:uut0 为时钟模块  利用altera提供的IP核实现,产生的时钟频率为25MHZ。

2. vga_sync_module:uut1为同步模块,行同步lcd_hs、场同步lcd_vs在此模块产生。ready_sig为电子束打在CRT上面的指示信号,row_addr_sig、column_addr_sig为现在扫描第几行、第几列的指示信号。


3. vga_control_module:uut2 为控制显示什么图形的模块,黑金开发板用16位来控制RGB的混合。R-lcd_data[11:15]、G-lcd_data[5:10]、B-lcd_data[0:4]

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 

小结:该电路设计思路是正确的,但是调好久没有调处来最主要原因在于 vga_control_module模块中 ,当不符合条件的时候没有给lcd_data赋值0。根据vga驱动协议,实际情况应该是这样的,当符合条件的时候输入数据,当不符合条件的时候输入为0.严格按照协议来。
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 
该电路的显示效果为,上面大部分屏颜色为淡蓝色。

完毕——————————————————————————————————————————————————————————————————



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值