VGA 时序与实现

1.  VGA 时序标准

小梅哥视频链接:23A VGA成像原理与时序详解_哔哩哔哩_bilibili

行扫描时序图

场扫描时序图
具体参数自己查表

2.  640*480 分辨率 VGA 控制器时序分析

2.1  行扫描区间构成

H Sync Time
H Bach PorchH Left BorderH Data TimeH Right BorderH Front Porch
96 vclk40 vclk8 vclk640 vclk8 vclk8 vclk

        行计数器: HS 脉冲信号结束 (VGA_HS_end

                           图像数据开始输出(hdat_begin)

                           图像结束 输出(hdat_end),

                           行扫描停止(hpixel_end

时间节点参数VGA_HS_endhdat_beginhdat_endhpixel_end
节点值clk95143783799

2.2  场扫描区间构成

V Sync Time
V Bach PorchV Left BorderV Data TimeV Right BorderV Front Porch
2 lines
25 lines8 lines480 lines8 lines2 lines

        场扫描 是以一次行扫描的时间为单位。

        场计数器: VS 脉冲信号结束 (VGA_VS_end

                           图像数据开始输出(vdat_begin)

                           图像结束 输出(vdat_end),

                           行扫描停止(vline_end)

时间节点参数VGA_VS_endvdat_beginvdat_end
vline_end
节点值line134514524

3.  Verilog  实现

3.1  design sources 

module vga(
            input clk , 
            input reset_n ,
            input [23:0]data ,
            output reg data_req ,
            output reg VGA_HS ,
            output reg VGA_VS , 
            output reg VGA_BLK ,
            output reg [23:0]VGA_RGB
             );
             
     parameter VGA_HS_end = 95 ;
     parameter Hdat_begin = 143 ;
     parameter Hdat_end = 783 ;
     parameter Hpixel_end = 799 ;
     parameter VGA_VS_end = 1 ;
     parameter Vdat_begin = 34 ;
     parameter Vdat_end = 514 ;
     parameter Vline_end = 524 ;
     
    //行计数器
    reg[9:0]H_cnt;
    always@(posedge clk or negedge reset_n)
    if(!reset_n)    H_cnt <= 0 ;
    else if(H_cnt == Hpixel_end)
        H_cnt <= 0 ;
    else 
        H_cnt <= H_cnt + 1'b1 ;
    
    // 场计数器
    reg[9:0]V_cnt;
    always@(posedge clk or negedge reset_n)
    if(!reset_n)    V_cnt <= 0 ;
    else if(H_cnt == Hpixel_end)
        if(V_cnt == Vline_end)
            V_cnt <= 0 ;
        else 
            V_cnt <= V_cnt + 1'b1 ;
    else 
        V_cnt <= V_cnt ;
        
      //     VGA_HS
    always@(posedge clk or negedge reset_n)
    if(!reset_n)  VGA_HS <= 1;
    else if(H_cnt == 0) VGA_HS <= 0;
    else if(H_cnt > VGA_HS_end) VGA_HS <= 1;
    
    //     VGA_VS
    always@(posedge clk or negedge reset_n)
    if(!reset_n)  VGA_VS <= 1;
    else if(V_cnt == 0) VGA_VS <= 0;
    else if(V_cnt > VGA_VS_end) VGA_VS <= 1;  
        
    //     data_req
    always@(posedge clk or negedge reset_n)
    if(!reset_n)    data_req <= 0 ;
    else data_req <= ((H_cnt >= Hdat_begin)&&(H_cnt < Hdat_end)&&(V_cnt >= Vdat_begin)&&(V_cnt <= Vdat_end)) ? 1 : 0;
    
     //     VGA_BLK
    always@(posedge clk or negedge reset_n)
    if(!reset_n)    VGA_BLK <= 0 ;
    else VGA_BLK <= data_req ;
    
    //     VGA_RGB
    always@(posedge clk )
    if(data_req) VGA_RGB <= data ;
    else VGA_RGB <= 0 ;
    
endmodule

3.2   vga_tb

`timescale 1ns / 1ns
module vga_tb(    );
        
        
        reg clk , reset_n;
        reg [23:0]data;
        wire data_req ,VGA_HS ,VGA_VS ,VGA_BLK;
        wire [23:0]VGA_RGB;
   vga     vga_(
              clk , 
              reset_n ,
              data ,
              data_req ,
              VGA_HS ,
              VGA_VS , 
              VGA_BLK ,
              VGA_RGB
             );
        
    initial clk = 1 ;
    always#20 clk = ~clk ;
    
    initial
        begin
            reset_n = 0 ;
            #201 ;
            reset_n = 1 ;
            #40000000;
            $stop;
        end    
      always@(posedge clk or negedge reset_n)
      if(!reset_n)    data <= 0 ;
      else if(data_req) data <= data + 1'b1 ;
      else data <= data ;
endmodule

3.3  测试结果

行扫描  周期32us
场扫描  周期16.8ms
调试data_req算了好久,下班班哩~
  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值