基于FPGA的VGA控制器实现(3)

最常用的VGA控制器

  • VGA时序代码
  • VGA模块端口解释
  • 总结

VGA时序代码

已经写了两篇关于VGA控制器的文章,这里我们给出一个通用的VGA控制器,代码如下:

`timescale 1ns / 1ps
// *********************************************************************************
// Project Name : OSXXXX
// Author       : zhangningning
// Email        : [email protected]
// 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
经过前两篇的文章和与现在的端口解释,相信大家可以很方便的将该控制器应用到工程中去。

总结

创作不易,认为文章有帮助的同学们可以收藏点赞支持。(工程也都在群中)对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群:
在这里插入图片描述

你可能感兴趣的:(FPGA)