VGA系列文章目录:
(1)VGA成像原理与简单实现
(2)VGA显示板级验证
(3)VGA显示-多分辨率输入
(4)串口发送+RAM+VGA传图
前言
本篇文章是基于上篇《VGA成像原理与简单实现》更改,实现多分辨率输入。
提示:以下是本篇文章正文内容,下面案例可供参考
一、参数化定义
//`define Resolution_480x272 1 //刷新率为60Hz时像素时钟为9MHz
`define Resolution_640x480 1 //刷新率为60Hz时像素时钟为25.175MHz
//`define Resolution_800x480 1 //刷新率为60Hz时像素时钟为33MHz
//`define Resolution_800x600 1 //刷新率为60Hz时像素时钟为40MHz
//`define Resolution_1024x768 1 //刷新率为60Hz时像素时钟为65MHz
//`define Resolution_1280x720 1 //刷新率为60Hz时像素时钟为74.25MHz
//`define Resolution_1920x1080 1 //刷新率为60Hz时像素时钟为148.5MHz
`ifdef Resolution_480x272
`define H_Right_Border 0
`define H_Front_Porch 2
`define H_Sync_Time 41
`define H_Back_Porch 2
`define H_Left_Border 0
`define H_Data_Time 480
`define H_Total_Time 525
`define V_Bottom_Border 0
`define V_Front_Porch 2
`define V_Sync_Time 10
`define V_Back_Porch 2
`define V_Top_Border 0
`define V_Data_Time 272
`define V_Total_Time 286
`elsif Resolution_640x480
`define H_Total_Time 12'd800
`define H_Right_Border 12'd8
`define H_Front_Porch 12'd8
`define H_Sync_Time 12'd96
`define H_Data_Time 12'd640
`define H_Back_Porch 12'd40
`define H_Left_Border 12'd8
`define V_Total_Time 12'd525
`define V_Bottom_Border 12'd8
`define V_Front_Porch 12'd2
`define V_Sync_Time 12'd2
`define V_Data_Time 12'd480
`define V_Back_Porch 12'd25
`define V_Top_Border 12'd8
`elsif Resolution_800x480
`define H_Total_Time 12'd1056
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd40
`define H_Sync_Time 12'd128
`define H_Data_Time 12'd800
`define H_Back_Porch 12'd88
`define H_Left_Border 12'd0
`define V_Total_Time 12'd525
`define V_Bottom_Border 12'd8
`define V_Front_Porch 12'd2
`define V_Sync_Time 12'd2
`define V_Data_Time 12'd480
`define V_Back_Porch 12'd25
`define V_Top_Border 12'd8
`elsif Resolution_800x600
`define H_Total_Time 12'd1056
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd40
`define H_Sync_Time 12'd128
`define H_Data_Time 12'd800
`define H_Back_Porch 12'd88
`define H_Left_Border 12'd0
`define V_Total_Time 12'd628
`define V_Bottom_Border 12'd0
`define V_Front_Porch 12'd1
`define V_Sync_Time 12'd4
`define V_Data_Time 12'd600
`define V_Back_Porch 12'd23
`define V_Top_Border 12'd0
`elsif Resolution_1024x768
`define H_Total_Time 12'd1344
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd24
`define H_Sync_Time 12'd136
`define H_Data_Time 12'd1024
`define H_Back_Porch 12'd160
`define H_Left_Border 12'd0
`define V_Total_Time 12'd806
`define V_Bottom_Border 12'd0
`define V_Front_Porch 12'd3
`define V_Sync_Time 12'd6
`define V_Data_Time 12'd768
`define V_Back_Porch 12'd29
`define V_Top_Border 12'd0
`elsif Resolution_1280x720
`define H_Total_Time 12'd1650
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd110
`define H_Sync_Time 12'd40
`define H_Data_Time 12'd1280
`define H_Back_Porch 12'd220
`define H_Left_Border 12'd0
`define V_Total_Time 12'd750
`define V_Bottom_Border 12'd0
`define V_Front_Porch 12'd5
`define V_Sync_Time 12'd5
`define V_Data_Time 12'd720
`define V_Back_Porch 12'd20
`define V_Top_Border 12'd0
`elsif Resolution_1920x1080
`define H_Total_Time 12'd2200
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd88
`define H_Sync_Time 12'd44
`define H_Data_Time 12'd1920
`define H_Back_Porch 12'd148
`define H_Left_Border 12'd0
`define V_Total_Time 12'd1125
`define V_Bottom_Border 12'd0
`define V_Front_Porch 12'd4
`define V_Sync_Time 12'd5
`define V_Data_Time 12'd1080
`define V_Back_Porch 12'd36
`define V_Top_Border 12'd0
`endif
二、引用参数
`include "vga_parameter.v"
parameter [11:0]Hsync_end = `H_Total_Time;
parameter [11:0]HS_END = `H_Sync_Time;
parameter [11:0]Vsync_end = `V_Total_Time;
parameter [11:0]VS_END = `V_Sync_Time;
parameter [11:0]Hdata_begin = `H_Sync_Time + `H_Back_Porch + `H_Left_Border;
parameter [11:0]Hdata_end = `H_Sync_Time + `H_Left_Border + `H_Back_Porch + `H_Data_Time;
parameter [11:0]Vdata_begin = `V_Sync_Time + `V_Back_Porch + `V_Top_Border;
parameter [11:0]Vdata_end = `V_Sync_Time + `V_Back_Porch + `V_Top_Border + `V_Data_Time;
三、完整代码展示
VGA_CTRL_640x480.v
`timescale 1ns / 1ps
//
// Create Date: 2022/11/30 15:18:34
// Module Name: VGA_CTRL_640x480
// Project Name: 640x480图像输出
// Revision: VIVADO 2018.3
// Name:小王在努力...
//
module VGA_CTRL_640x480(
clk,
reset,
Data,
Data_request,
HS_YS,
VS_YS,
VGA_BLK,
RGB_output
);
input clk;
input reset;
input [23:0]Data; //输入数据
output reg Data_request; //数据请求脉冲信号
output reg HS_YS; //行同步脉冲信号
output reg VS_YS; //场同步脉冲信号
output reg VGA_BLK; //VGA有效数据显示脉冲信号
output reg [23:0]RGB_output; //RGB输出值
`include "vga_parameter.v"
parameter [9:0]Hsync_end = `H_Total_Time;
parameter [6:0]HS_END = `H_Sync_Time;
parameter [9:0]Vsync_end = `V_Total_Time;
parameter [1:0]VS_END = `V_Sync_Time;
parameter [7:0]Hdata_begin = `H_Sync_Time + `H_Back_Porch + `H_Left_Border;
parameter [9:0]Hdata_end = `H_Sync_Time + `H_Left_Border + `H_Back_Porch + `H_Data_Time;
parameter [5:0]Vdata_begin = `V_Sync_Time + `V_Back_Porch + `V_Top_Border;
parameter [9:0]Vdata_end = `V_Sync_Time + `V_Back_Porch + `V_Top_Border + `V_Data_Time;
reg [11:0]H_cnt;
always @ (posedge clk or negedge reset)
if(!reset)
H_cnt <= 0;
else if(H_cnt >= Hsync_end -1 )
H_cnt <= 0;
else
H_cnt <= H_cnt + 1'b1;
// 行同步脉冲信号
always @ (posedge clk)
HS_YS <= (H_cnt <= HS_END-1 )?0:1;
reg [11:0]V_cnt;
always @ (posedge clk or negedge reset)
if(!reset)
V_cnt <= 0;
else if( H_cnt == Hsync_end -1)begin
if(V_cnt >= Vsync_end-1)
V_cnt <= 0;
else
V_cnt <= V_cnt + 1;
end
else
V_cnt <= V_cnt ;
//场同步脉冲信号
always @ (posedge clk)
VS_YS <= (V_cnt <= VS_END-1 )?0:1;
always @ (posedge clk)
Data_request <= (H_cnt >= Hdata_begin - 1 )&&(H_cnt <= Hdata_end - 2)&&(V_cnt >= Vdata_begin)&&(V_cnt <= Vdata_end -1);
always @ (posedge clk)
VGA_BLK <= Data_request;
always @ (posedge clk)
RGB_output <= (Data_request) ?Data:0;
endmodule
vga_parameter.v
//`define Resolution_480x272 1 //刷新率为60Hz时像素时钟为9MHz
`define Resolution_640x480 1 //刷新率为60Hz时像素时钟为25.175MHz
//`define Resolution_800x480 1 //刷新率为60Hz时像素时钟为33MHz
//`define Resolution_800x600 1 //刷新率为60Hz时像素时钟为40MHz
//`define Resolution_1024x768 1 //刷新率为60Hz时像素时钟为65MHz
//`define Resolution_1280x720 1 //刷新率为60Hz时像素时钟为74.25MHz
//`define Resolution_1920x1080 1 //刷新率为60Hz时像素时钟为148.5MHz
`ifdef Resolution_480x272
`define H_Right_Border 0
`define H_Front_Porch 2
`define H_Sync_Time 41
`define H_Back_Porch 2
`define H_Left_Border 0
`define H_Data_Time 480
`define H_Total_Time 525
`define V_Bottom_Border 0
`define V_Front_Porch 2
`define V_Sync_Time 10
`define V_Back_Porch 2
`define V_Top_Border 0
`define V_Data_Time 272
`define V_Total_Time 286
`elsif Resolution_640x480
`define H_Total_Time 12'd800
`define H_Right_Border 12'd8
`define H_Front_Porch 12'd8
`define H_Sync_Time 12'd96
`define H_Data_Time 12'd640
`define H_Back_Porch 12'd40
`define H_Left_Border 12'd8
`define V_Total_Time 12'd525
`define V_Bottom_Border 12'd8
`define V_Front_Porch 12'd2
`define V_Sync_Time 12'd2
`define V_Data_Time 12'd480
`define V_Back_Porch 12'd25
`define V_Top_Border 12'd8
`elsif Resolution_800x480
`define H_Total_Time 12'd1056
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd40
`define H_Sync_Time 12'd128
`define H_Data_Time 12'd800
`define H_Back_Porch 12'd88
`define H_Left_Border 12'd0
`define V_Total_Time 12'd525
`define V_Bottom_Border 12'd8
`define V_Front_Porch 12'd2
`define V_Sync_Time 12'd2
`define V_Data_Time 12'd480
`define V_Back_Porch 12'd25
`define V_Top_Border 12'd8
`elsif Resolution_800x600
`define H_Total_Time 12'd1056
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd40
`define H_Sync_Time 12'd128
`define H_Data_Time 12'd800
`define H_Back_Porch 12'd88
`define H_Left_Border 12'd0
`define V_Total_Time 12'd628
`define V_Bottom_Border 12'd0
`define V_Front_Porch 12'd1
`define V_Sync_Time 12'd4
`define V_Data_Time 12'd600
`define V_Back_Porch 12'd23
`define V_Top_Border 12'd0
`elsif Resolution_1024x768
`define H_Total_Time 12'd1344
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd24
`define H_Sync_Time 12'd136
`define H_Data_Time 12'd1024
`define H_Back_Porch 12'd160
`define H_Left_Border 12'd0
`define V_Total_Time 12'd806
`define V_Bottom_Border 12'd0
`define V_Front_Porch 12'd3
`define V_Sync_Time 12'd6
`define V_Data_Time 12'd768
`define V_Back_Porch 12'd29
`define V_Top_Border 12'd0
`elsif Resolution_1280x720
`define H_Total_Time 12'd1650
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd110
`define H_Sync_Time 12'd40
`define H_Data_Time 12'd1280
`define H_Back_Porch 12'd220
`define H_Left_Border 12'd0
`define V_Total_Time 12'd750
`define V_Bottom_Border 12'd0
`define V_Front_Porch 12'd5
`define V_Sync_Time 12'd5
`define V_Data_Time 12'd720
`define V_Back_Porch 12'd20
`define V_Top_Border 12'd0
`elsif Resolution_1920x1080
`define H_Total_Time 12'd2200
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd88
`define H_Sync_Time 12'd44
`define H_Data_Time 12'd1920
`define H_Back_Porch 12'd148
`define H_Left_Border 12'd0
`define V_Total_Time 12'd1125
`define V_Bottom_Border 12'd0
`define V_Front_Porch 12'd4
`define V_Sync_Time 12'd5
`define V_Data_Time 12'd1080
`define V_Back_Porch 12'd36
`define V_Top_Border 12'd0
`endif
四、仿真结果展示
以640X480为例展示仿真波形数据:
根据640x480数据发送要求,每次应该有480行数据如上图时间间隔为(两个蓝线之间)15.36ms,经计算为480Line。而RGB_output接收也为480Line个数据,没有丢失,至此场数据节点验证完成。
【附件:】链接:https://pan.baidu.com/s/1QAj2uy31XYPyE80VdfKa_Q?pwd=k9vd
提取码:k9vd