VGA显示,就是屏幕应用VGA接口线点亮屏幕。同样需要遵守一定的条件。符合时序,才能点亮屏幕,控制屏幕的显示。
这里参考
感谢,同时这里还有VGA协议标准
链接:https://pan.baidu.com/s/1cqJ8iOo9KRhTBnXuIkPe5w 提取码:igee
同样是来自邓堪文博客内容。里边干货挺多的,可以学习学习。
VGA这里先说说笔者自己的思路。很简单,两个计数器,场同步和行同步,到时间拉高或拉低,符合时序要求。文档里有很多,这里我写的是640*480@60Hz,因为我买的开发板是黑金的AX309,用的是565色。所以后面是16。具体可以看开发板配的指南。
所有的原理已经大概结束,基础的知识可以随便百度,扫描的方式的等等。
别人的总是好的,自己的总是差的!!!两种写法,这篇先贴我自己的。
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这一段区域。下一篇介绍其他人的显示,我后面的字符图片显示,也都是在其基础上的。