利用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