基于FPGA的VGA接口使用

时间:2023-03-09 01:42:00
基于FPGA的VGA接口使用

前言

什么是VGA?

VGA(视频图形阵列)是IBM公司制定的一种视频数据传输标准。

接口信号主要有5个:R(Red),G(Green),B(Blue),HS(Horizontal synchronization水平同步),VS(Vertical synchronization垂直同步)。水平同步也叫行(line)同步,垂直同步也叫帧(frame)同步。信号都是模拟信号。

基于FPGA的VGA接口使用

基于FPGA的VGA接口使用

基于FPGA的VGA接口使用

用途:连接CRT显示器或者带VGA接口的LCD液晶显示器。

VGA的接口原理是什么?行消隐,场消隐?

逐行扫描的方式,电子束从屏幕左上角一点开始,从左向右逐行扫描。每扫描完一行,电子束回到屏幕的左边下一行的起始位置。当所有行扫描完毕后,电子束回到屏幕的左上角起始位置,开始下一次扫描。水平方向电子束从右侧回到左侧所需的时间叫行消隐;电子束从右下角回到左上角起始位置所需的时间叫场消隐。

听大佬说缩短消隐区,但太短测试我未通过,还是按标准来吧。

基于FPGA的VGA接口使用

VGA时序参数?

可以从网站上查询到你所需要的参数:http://tinyvga.com/vga-timing

本次进行1024*768分辨率下的VGA三道杠条纹显示开发:

基于FPGA的VGA接口使用

VGA接口的工作时序?

图像的显示是以像素为单位的,行同步信号hs的负脉冲到来时要由RGB送出在当前行显示的像素,下一个负向脉冲用来显示下一行。当整个屏幕显示一遍后,由帧同步信号vs送出一个负向脉冲,又从左上角显示。

基于FPGA的VGA接口使用

基于FPGA的VGA接口使用

功能划分:(懒到不想画图了)

基于FPGA的VGA接口使用

编码实现:

系统时钟确定:T=刷新hz*总像素点

总像素点=水平计数*垂直计数=1344*806

推得:T=60*1344*806=65mhz(约等于)

坐标与hs、vs信号产生。

 //************************************************
// Filename : coo_out.v
// Author : kingstacker
// Company : School
// Email : kingstacker_work@163.com
// Device : Altera cyclone4 ep4ce6f17c8
// Description : product the coodinate and hs vs;
//************************************************
module coo_out #(parameter WIDTH = )(
//input;
input wire clk, //65mhz;
input wire rst_n,
//output;
output wire hs, //horizontal synchronization;
output wire vs, //vertical syn;
output reg [WIDTH-:] line_coo, //line coodinate;
output reg [WIDTH-:] ver_coo //vertical coodinate;
); //1024*768;
localparam HTA = 'd136, //sync pulse;
HTB = 'd160, //back porch;
HTC = 'd1024, //visible area;
HTD = 'd24, //front porch;
VTA = 'd6, //sync pulse;
VTB = 'd29, //back porch;
VTC = 'd768, //visible area;
VTD = 'd3, //front porch;
LINE_CNTMAX = HTA+HTB+HTC+HTD-'b1, //max line count;
VER_CNTMAX = VTA+VTB+VTC+VTD-'b1, //max ver count;
HSTART = HTA+HTB,
VSTART = VTA+VTB;
reg [WIDTH+:] line_cnt;
reg [WIDTH+:] ver_cnt;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
line_cnt <= 'd0;
end //if
else begin
if (line_cnt == LINE_CNTMAX) begin
line_cnt <= 'd0;
end //if
else begin
line_cnt <= line_cnt + 'b1;
end //else
end //else
end //always
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
ver_cnt <= 'd0;
end //if
else begin
if ((ver_cnt == VER_CNTMAX)&&(line_cnt == LINE_CNTMAX)) begin
ver_cnt <= 'd0;
end //if
else begin
ver_cnt <= (line_cnt == LINE_CNTMAX)? (ver_cnt + 'b1) : ver_cnt;
end //else
end //else
end //always
assign hs = (line_cnt < HTA) ? 'b0 : 1'b1;
assign vs = (ver_cnt < VTA) ? 'b0 : 1'b1;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
line_coo <= ;
ver_coo <= ;
end //if
else begin
if((line_cnt >= HSTART)&&(line_cnt < HSTART + HTC)&&(ver_cnt >=VSTART)&&(ver_cnt < VSTART + VTC)) begin
line_coo <= line_cnt - HSTART;
ver_coo <= ver_cnt - VSTART;
end
end //else
end //always endmodule

三道杠产生:

 //************************************************
// Filename : color_out.v
// Author : kingstacker
// Company : School
// Email : kingstacker_work@163.com
// Device : Altera cyclone4 ep4ce6f17c8
// Description :
//************************************************
module color_out #(parameter WIDTH = )(
//input;
input wire clk,
input wire rst_n,
input wire [WIDTH-:] line_coo,
input wire [WIDTH-:] ver_coo,
//output;
output reg [:] rgb_o
);
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
rgb_o <= 'd0;
end //if
else begin
if(ver_coo < 'd255) begin
rgb_o <= {'b11111,6'd0,'d0};
end
else begin
if (ver_coo < 'd511) begin
rgb_o <= {'d0,6'b111111,'d0};
end
else begin
rgb_o <= {'d0,6'd0,'b11111};
end
end
end //else
end //always endmodule

综合资源使用:

基于FPGA的VGA接口使用

抓波:

基于FPGA的VGA接口使用

基于FPGA的VGA接口使用

接显示器看看:三道杠少年

基于FPGA的VGA接口使用

修改color_out:九宫格(很无聊的东西hhhhhh)

基于FPGA的VGA接口使用

图片放rom显示:100*100

mif文件可由matalb生成,也可以用下面两个软件生成(更方便):

基于FPGA的VGA接口使用

用lmage2Lcd生成bin文件:

基于FPGA的VGA接口使用

bin文件转换为mif文件:

基于FPGA的VGA接口使用

再把mif文件放rom即可。

显示器显示图片:

基于FPGA的VGA接口使用

以上。