FPGA实现VGA显示(一)——————屏幕驱动及color_bar显示

VGA显示,就是屏幕应用VGA接口线点亮屏幕。同样需要遵守一定的条件。符合时序,才能点亮屏幕,控制屏幕的显示。

这里参考

http://dengkanwen.com/70.html

感谢,同时这里还有VGA协议标准

链接:https://pan.baidu.com/s/1cqJ8iOo9KRhTBnXuIkPe5w 提取码:igee

同样是来自邓堪文博客内容。里边干货挺多的,可以学习学习。

VGA这里先说说笔者自己的思路。很简单,两个计数器,场同步和行同步,到时间拉高或拉低,符合时序要求。文档里有很多,这里我写的是640*480@60Hz,因为我买的开发板是黑金的AX309,用的是565色。所以后面是16。具体可以看开发板配的指南。

FPGA实现VGA显示(一)——————屏幕驱动及color_bar显示_第1张图片

FPGA实现VGA显示(一)——————屏幕驱动及color_bar显示_第2张图片FPGA实现VGA显示(一)——————屏幕驱动及color_bar显示_第3张图片

所有的原理已经大概结束,基础的知识可以随便百度,扫描的方式的等等。

别人的总是好的,自己的总是差的!!!两种写法,这篇先贴我自己的。

module VGA(clk,rst_n,
	vga_hs,vga_vs,
	vga_r,vga_g,vga_b
    );
//---------------------------------
input 				clk 		;
input 				rst_n		;
//---------------------------------
output 				vga_hs		;	
output 				vga_vs		;
output 		[4:0]	vga_r		;
output 		[5:0]	vga_g		;
output 		[4:0]	vga_b		;
//---------------------------------
parameter Hor_Total_Time 		= 800	;		//行显示帧长
parameter Hor_Sync		 		= 96	;		//行同步脉冲
parameter Hor_Back_Porch 		= 48	;		//行显示后沿(同显示前沿,这里由两个时段合成)	
parameter Hor_Addr_Time 		= 640	;		//行显示区域
parameter Hor_Front_Porch		= 16	;		//行显示前沿
parameter Ver_Total_Time 		= 525	;		//列显示帧长
parameter Ver_Sync		 		= 2		;		//列同步脉冲
parameter Ver_Back_Porch 		= 33	;		//列显示后沿(同显示前沿,这里由两个时段合成)	
parameter Ver_Addr_Time 		= 480	;		//列显示区域
parameter Ver_Front_Porch		= 10	;		//列显示前沿
//---------------------------------
/*产生时钟,这里可以用pll直接生成,因为这里恰巧是25000000,所以把系统时钟打了一拍*/
reg vga_clk;
always@(posedge clk )
begin
	vga_clk <= ~vga_clk;
end
//两个计数器

//行计数器
reg [9:0] x_cnt;
always@(posedge vga_clk or negedge rst_n)
begin
	if(!rst_n)
		x_cnt <= 10'd1;
	else 
		if(x_cnt == Hor_Total_Time)
			x_cnt <= 10'd1;
		else 
			x_cnt <= x_cnt + 1'b1;
end
//列计数器
reg [9:0] y_cnt;
always@(posedge vga_clk or negedge rst_n)
begin
	if(!rst_n)
		y_cnt <= 10'd1;
	else 
		if(y_cnt == Ver_Total_Time && x_cnt == Hor_Total_Time)
			y_cnt <= 10'd1;
		else 
			if(x_cnt == Hor_Total_Time)
				y_cnt <= y_cnt + 1'b1;
end
assign vga_hs = (x_cnt < Hor_Sync) ? 1'b1 : 1'b0;
assign vga_vs = (y_cnt < Ver_Sync) ? 1'b1 : 1'b0;

reg vga_en;
always@(*)
begin
	vga_en <= (x_cnt >= (Hor_Sync + Hor_Back_Porch) && x_cnt <= (Hor_Sync + Hor_Back_Porch + Hor_Addr_Time) && y_cnt >= (Ver_Sync + Ver_Back_Porch) && y_cnt <= (Ver_Sync + Ver_Back_Porch + Ver_Addr_Time));
end

reg [15:0] rgb;
assign {vga_r,vga_g,vga_b} = rgb;
always@(*)
begin
	if(vga_en)
		begin
			if(x_cnt <= (Hor_Sync + Hor_Back_Porch + 160 - 1'b1))
				rgb <= 16'h0fff;
			else 
				if(x_cnt <= (Hor_Sync + Hor_Back_Porch + 320 - 1'b1))
					rgb <= 16'hf0ff;
				else 
					if(x_cnt <= (Hor_Sync + Hor_Back_Porch + 480 - 1'b1))
						rgb <= 16'hff0f;
					else 
						rgb <= 16'hfff0;
		end
	else 
		rgb <= 16'd0;
end

endmodule

 真正显示的,其实只有640*480这一段区域。下一篇介绍其他人的显示,我后面的字符图片显示,也都是在其基础上的。

你可能感兴趣的:(FPGA逻辑篇,VGA,FPGA,Verilog)