vivado实现VGA

vivado实现VGA

VGA原理

VGA 的英文全称是Video Graphic Array,即显示绘图阵列。 VGA 支持在640X480 的较高分辨率下同时显示16种色彩或256 种灰度,同时在320X240 分辨率下可以同时显示256 种颜色。肉眼对颜色的敏感远大于分辨率,所以即使分辨率较低图像依然生动鲜明。 VGA 由于良好的性能迅速开始流行,厂商们纷纷在VGA 基础上加以扩充,如将显存提高至1M 并使其支持更高分辨率如800X600或1024X768,这些扩充的模式就称之为VESA(Video Electronics Standards Association,视频电子标准协会) 的Super VGA 模式,简称SVGA,现在的显卡和显示器都支持SVGA 模式。不管是VGA 还是SVGA,使用的连线都是15针的梯形插头,传输模拟信号。

VGA接口信号
目前大多数计算机与外部显示设备之间都是通过模拟VGA 接口连接,计算机内部以数字方式生成的显示图像信息,被显卡中的数字/模拟转换器转变为R、G、 B三原色信号和行、场同步信号,信号通过电缆传输到显示设备中。本例中,VGA 接口是标准的15 针接口,有五个接口信号。

行同步(水平同步)与场同步(垂直同步)
为了实现发送端与接受端图像各点一一正确对应,发送端与接收端的扫描必须同步。同步脉冲是周期稳定,边沿陡峭的脉冲。按我国电视标准,行同步脉冲的频率等于行频为15.625KHZ,行周期为64us。在电视技术中常以64us 作为时间单位,并以H 表示,即1H=64us。场同步脉冲频率等于场频为50HZ,场周期为20ms,312.5H。行同步脉冲宽度为4.7us 左右,场同步脉冲宽度为2.5~3H。

Verilog代码实现VGA

输入信号分别为: clk、 switch。 clk 是时钟信号, switch 是选择模式信号,分别对应横彩条、竖彩条及两种棋盘格。

module vga( clock, switch, disp_RGB, hsync, vsync );
input clock; //系统输入时钟 100MHz
input [1:0]switch;
output [2:0]disp_RGB; //VGA 数据输出
output hsync; //VGA 行同步信号output
vsync; //VGA 场同步信号
reg [9:0] hcount; //VGA 行扫描计数器
reg [9:0] vcount; //VGA 场扫描计数器
reg [2:0] data;
reg [2:0] h_dat;
reg [2:0] v_dat;
reg flag;
reg [1:0]cnt;
wire hcount_ov;
wire vcount_ov;
wire dat_act;
wire hsync;
wire vsync;
reg vga_clk;
//VGA 行、场扫描时序参数表
parameter hsync_end = 10'd95,
hdat_begin = 10'd143,
hdat_end = 10'd783,
hpixel_end = 10'd799,
vsync_end = 10'd1,
vdat_begin = 10'd34,
vdat_end = 10'd514,
vline_end = 10'd524;
always @(posedge clock)
begin
	if(cnt==3)
	cnt <= 0;
	else
	cnt <= cnt + 1;
	end
	
always @(posedge clock)
begin
	if(cnt < 2)
	vga_clk <= 1;
	else
	vga_clk <= 0;
	end
//************************VGA 驱动部分*******************************//行扫描
always @(posedge vga_clk)
	begin
	if (hcount_ov)
	hcount <= 10'd0;
	else
	hcount <= hcount + 10'd1;
	end
assign hcount_ov = (hcount == hpixel_end);
//场扫描
always @(posedge vga_clk)
	begin
	if (hcount_ov)
		begin
		if (vcount_ov)
		vcount <= 10'd0;
		else
		vcount <= vcount + 10'd1;
	end
	end
assign vcount_ov = (vcount == vline_end);
//数据、同步信号输
assign dat_act = ((hcount >= hdat_begin) && (hcount < hdat_end))
&& ((vcount >= vdat_begin) && (vcount < vdat_end));
assign hsync = (hcount > hsync_end);
assign vsync = (vcount > vsync_end); assign
disp_RGB = (dat_act) ? data : 3'h00;
//************************显示数据处理部分*******************************//
always @(posedge vga_clk)
	begin
	case(switch[1:0])
		2'd0: data <= h_dat; //选择横彩条
		2'd1: data <= v_dat; //选择竖彩条
		2'd2: data <= (v_dat ^ h_dat); //产生棋盘格
		2'd3: data <= (v_dat ~^ h_dat); //产生棋盘格
		endcase
	end
always @(posedge vga_clk) //产生竖彩条
begin
	if(hcount < 223)
		v_dat <= 3'h7; //白
	else if(hcount < 303)
		v_dat <= 3'h6; //黄
	else if(hcount < 383)
		v_dat <= 3'h5; //青
	else if(hcount < 463)
		v_dat <= 3'h4; //绿
	else if(hcount < 543)
		v_dat <= 3'h3; //紫
	else if(hcount < 623)
		v_dat <= 3'h2; //红
	else if(hcount < 703)
		v_dat <= 3'h1; //蓝
	else
		v_dat <= 3'h0; //黑
	end
always @(posedge vga_clk) //产生横彩条
begin
	if(vcount < 94)
		h_dat <= 3'h7; //白
	else if(vcount < 154)
		h_dat <= 3'h6; //黄
	else if(vcount < 214)
		h_dat <= 3'h5; //青
	else if(vcount < 274)
		h_dat <= 3'h4; //绿
	else if(vcount < 334)
		h_dat <= 3'h3; //紫
	else if(vcount < 394)
		h_dat <= 3'h2; //红
	else if(vcount < 454)
		h_dat <= 3'h1; //蓝
	else
		h_dat <= 3'h0; //黑
	end
endmodule
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值