VGA时序代码
已经写了两篇关于VGA控制器的文章,这里我们给出一个通用的VGA控制器,代码如下:
`timescale 1ns / 1ps
// *********************************************************************************
// Project Name : OSXXXX
// Author : zhangningning
// Email : nnzhang1996@foxmail.com
// Website :
// Module Name : vga_drive.v
// Create Time : 2020-02-03 20:08:42
// Editor : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date By Version Change Description
// -----------------------------------------------------------------------
// XXXX zhangningning 1.0 Original
//
// *********************************************************************************
module vga_drive(
input vga_clk ,
input rst_n ,
output reg hsync ,
output reg vsync ,
output reg [ 7:0] vga_data ,
output reg data_en ,
input [ 7:0] data
);
//========================================================================================\
//**************Define Parameter and Internal Signals**********************************
//========================================================================================/
localparam H_TOTAL_TIME = 800 ;
localparam H_ADDR_TIME = 640 ;
localparam H_SYNC_TIME = 96 ;
localparam H_BACK_PORCH = 40 ;
localparam H_LEFT_BORDER = 8 ;
localparam V_TOTAL_TIME = 525 ;
localparam V_ADDR_TIME = 480 ;
localparam V_SYNC_TIME = 2 ;
localparam V_BACK_PORCH = 25 ;
localparam V_LEFT_BORDER = 8 ;
reg [12:0] cnt_h ;
reg [12:0] cnt_v ;
//========================================================================================\
//************** Main Code **********************************
//========================================================================================/
always @(posedge vga_clk or negedge rst_n)
if(rst_n == 1'b0)
cnt_h <= 13'd0;
else if(cnt_h == (H_TOTAL_TIME-1'd1))
cnt_h <= 13'd0;
else
cnt_h <= cnt_h + 1'b1;
always @(posedge vga_clk or negedge rst_n)
if(rst_n == 1'b0)
cnt_v <= 13'd0;
else if(cnt_v == (V_TOTAL_TIME-1'b1) && cnt_h == (H_TOTAL_TIME-1'd1))
cnt_v <= 13'd0;
else if(cnt_h == (H_TOTAL_TIME-1'd1))
cnt_v <= cnt_v + 1'b1;
else
cnt_v <= cnt_v;
always @(posedge vga_clk or negedge rst_n)
if(rst_n == 1'b0)
hsync <= 1'b1;
else if(cnt_h >= (H_SYNC_TIME-1'b1))
hsync <= 1'b0;
else if(cnt_h == (H_TOTAL_TIME-1'd1))
hsync <= 1'b1;
else
hsync <= hsync;
always @(posedge vga_clk or negedge rst_n)
if(rst_n == 1'b0)
vsync <= 1'b1;
else if(cnt_v >= (V_SYNC_TIME-1'b1) && cnt_h == (H_TOTAL_TIME-1'd1))
vsync <= 1'b0;
else if(cnt_v == (V_TOTAL_TIME-1'b1) && cnt_h == (H_TOTAL_TIME-1'd1))
vsync <= 1'b1;
else
vsync <= vsync;
always @(posedge vga_clk or negedge rst_n)
if(rst_n == 1'b0)
data_en <= 1'b0;
else if(cnt_h >= (H_SYNC_TIME+H_BACK_PORCH+H_LEFT_BORDER-1'b1-1'b1) && cnt_h < (H_SYNC_TIME+H_BACK_PORCH+H_LEFT_BORDER+H_ADDR_TIME-1'b1-1'b1) &&
cnt_v >= (V_SYNC_TIME+V_BACK_PORCH+V_LEFT_BORDER) && cnt_v < (V_SYNC_TIME+V_BACK_PORCH+V_LEFT_BORDER+V_ADDR_TIME))
data_en <= 1'b1;
else
data_en <= 1'b0;
always @(posedge vga_clk or negedge rst_n)
if(rst_n == 1'b0)
vga_data <= 8'd0;
else if(data_en == 1'b1)
vga_data <= data;
else
vga_data <= 8'd0;
endmodule
VGA模块端口解释
现在我们对上面的VGA控制器的端口进行解释,方便该控制器的使用:
vga_clk : VGA模块的时钟,具体时钟查找技术手册
rst_n : VGA模块的复位信号
hsync :VGA时序的行同步信号
vsync :VGA时序的场同步信号
vga_data :VGA时序的数据接口
data_en :外部数据到来的使能端口
data :VGA的外部输入数据,本程序写的data_en与data的关系是同步的,即同时有效,外部一般使用FIFO
经过前两篇的文章和与现在的端口解释,相信大家可以很方便的将该控制器应用到工程中去。
总结
创作不易,认为文章有帮助的同学们可以收藏点赞支持。(工程也都在群中)对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群: