利用VGA协议完成文字、条纹、图片显示


前言

本次实验使用的开发板是Cyclone IV E:EP4CE6F17C8

一、VGA协议是什么

VGA(Video Graphics Array)是IBM在1987年随PS/2机一起推出的一种视频传输标准,具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用。不支持热插拔,不支持音频传输。对于一些嵌入式VGA显示系统,可以在不使用VGA显示卡和计算机的情况下,实现VGA图像的显示和控制。VGA显示器具有成本低、结构简单、应用灵活的优点。对于一名FPGA工程师,尤其是视频图像的方向的学习者,VGA协议是必须要掌握的。

二、VGA时序图

在这里插入图片描述
在这里插入图片描述
SYNC是“信号同步”,Back proch和Left border常常加在一起称为“显示后沿”,Addressable video为“显示区域”,Right porder和Front porch常常加在一起称为“显示前沿”,一个时序其实就是先拉高一段较短的“信号同步”时间,然后拉低一段很长的时间,这就是一个回合。同时需要注意,其实也可以完全相反。即先拉低一段时间“信号同步”时间,然后拉高一段很长的时间。

三、VGA规格参数

在这里插入图片描述

三、关于实现本实验的一些小知识

1.VGA的时钟

我们板子上所固有的时钟是50M的,但VGA协议所使用的是25M的,所以我们要调用IP核——PLL来实现时钟分频
1.找到PLL核,点击ALTPLL
在这里插入图片描述
2.自定义保存路径,点击OK
在这里插入图片描述
在这里插入图片描述
3.基础时钟设置为50M
在这里插入图片描述
4.取消输出使能
在这里插入图片描述
5.一直保持默认,下一步,直到出现配置C0
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
6.选择2分频,即可完成25M时钟
在这里插入图片描述
7.之后一直next,直到最后一步勾选这个文件就行。之后,我们就可以直接复制文件里面的实例化代码来进行调用。
在这里插入图片描述
pll_inst.v文件
在这里插入图片描述
文件中areset_sig表示复位信号,因为板子是低电平复位,而pll是高电平复位,所以在填入信号时需要取反;inclk0_sig表示系统时钟,即板子的默认50M的时钟;c0_sig是分频的时钟。

使用示例如下
在这里插入图片描述

2.分辨率的设置

不同的分辨率有不同的前后沿等的大小,可自行查阅网络得知

3.显示图片时需要使用ROM

1.首先需要把显示的图片转化为HEX类型
可自行在网上转化(转化时选择565)
2.如下图所示,选择需要使用的ROM核
在这里插入图片描述
2.设置位宽为16,大小为图片的大小(分辨率)
在这里插入图片描述
在这里插入图片描述
3.取消勾选
在这里插入图片描述
4.添加进入刚刚转化的HEX文件
在这里插入图片描述
5.点击next直到最后一步,勾选生成实例化文件
在这里插入图片描述

四、代码实现

1.分辨率参数代码

`define 	vga_640_480

`ifdef	vga_640_480
	`define	H_Right_Border 8
	`define	H_Front_Porch  8
	`define	H_Sync_Time    96
	`define	H_Back_Porch	40
	`define	H_Left_Border	8
	`define	H_Data_Time		640
	`define	H_Total_Time	800
	`define	V_Bottom_Border	8
	`define	V_Front_Porch	2
	`define	V_Sync_Time		2
	`define	V_Back_Porch	25
	`define	V_Top_Border	8
	`define	V_Data_Time		480
	`define	V_Total_Time	525

`elsif	vga_1920_1080
	`define	H_Right_Border 0
	`define	H_Front_Porch  88
	`define	H_Sync_Time    44
	`define	H_Back_Porch	148
	`define	H_Left_Border	0
	`define	H_Data_Time		1920
	`define	H_Total_Time	2200
	`define	V_Bottom_Borde	0
	`define	V_Front_Porch	4
	`define	V_Sync_Time		5
	`define	V_Back_Porch	36
	`define	v_Top_Border	2
	`define	v_Data_Time		1080
	`define	v_Total_Time	1125

	
`endif

2.vga驱动代码

//`define 	vga_1920_1080L
`include "vga_para.v"

module vga_drive(

	input						clk			, //640*480--25.2M
	input						rst_n			,
	input	 		[15:0]	data_display,
	
	output reg	[11:0] 	h_addr		,//数据有效显示区域行地址
	output reg	[11:0]	v_addr		,//数据有效显示区域场地址
	
	output reg				vsync			,
	output reg				hsync			,
	output reg 	[4:0]		vga_r			,
	output reg 	[5:0]		vga_g			,
	output reg 	[4:0]		vga_b			,
	output reg				vga_blk		,//消隐信号
	output					vga_clk		,
	output 					sync			
	
);

wire				clk_25M;	
wire				locked;

pll	pll_inst (
	.areset 		( ~rst_n ),
	.inclk0     ( clk ),
	.c0 		   ( clk_25M ),
	.locked     ( locked )
	);
	


assign	vga_clk = clk_25M;

assign	sync = hsync && vsync;

parameter	H_SYNC_STA = 1;
parameter   H_SYNC_STO = `H_Sync_Time;
parameter   H_Data_STA = `H_Right_Border + `H_Front_Porch + `H_Sync_Time;
parameter   H_Data_STO = `H_Right_Border + `H_Front_Porch + `H_Sync_Time + `H_Data_Time;

parameter   V_SYNC_STA = 1;
parameter   V_SYNC_STO = `V_Sync_Time;
parameter   V_Dat
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值