基于FPGA的VGA简易显存设计&NIOS ii软核接入

项目简介

本项目基于Altera公司的Cyclone IV型芯片,利用NIOS II软核,2-port RAM与时序控制模块,实现64*48分辨率的显存(再大的显存板载资源m9k不够用)

实现效果如下:

这里写图片描述

VGA时序控制模块

VGA时序简介

网络上针对VGA时序的讲解已经非常多了,简单的理解,VGA主要有H_syncV_sync这两个坐标同步信号,与RGB这三个色彩信号。当H_syncV_sync达到特定的值的时候,对应一个特别的坐标(x,y)上的颜色为RGBVGA上的RGB信号是模拟信号,FPGA通常通过接入一个DA模块来实现数字信号到模拟信号的转换。我所用的板子上便是16位的RGB数模转换的解决方案。

HSYNC的时序如下

VSYNC的时序如下

针对图中的不同段的长度,可以参考以下常用的参数配置表:

在我的IP核中,通过参数定义以增加核心的通用性:

    //1024*758 60HZ
    parameter H_SyncPulse=136;                                  //HSYNC_A
    parameter H_BackPorch=160;                                  //HSYNC_B
    parameter H_ActivePix=1024;                                 //HSYNC_C
    parameter H_FrontPorch=24;                                  //HSYNC_D
    parameter LinePeriod =1344;                                 //HSYNC_E
    parameter Hde_start=H_SyncPulse+H_BackPorch;               
    //HSYNC_A+HSYNC_B
    parameter Hde_end=Hde_start+H_ActivePix;           
    //HSYNC_A+HSYNC_B+HSYNC_C
    //1024*758 60HZ
    parameter V_SyncPulse=6;              //VSYNC_O
    parameter V_BackPorch=29;             //VSYNC_P
    parameter V_ActivePix=768;            //VSYNC_Q
    parameter V_FrontPorch=3;             //VSYNC_R
    parameter FramePeriod =806;           //VSYNC_S
    parameter Vde_start=V_BackPorch+V_SyncPulse;
    parameter Vde_end=Vde_start+V_ActivePix+V_FrontPorch;

由于板载时钟信号是一个50MHZ,利用PLL超频至65MHZ,接入板子时钟:

    pllvga mypll(.inclk0(clk),.c0(vga_clk),.areset(~rstn),.locked());

根据上面所述VGA的基本时序,可以书写VGA的时序模块:

always @ (posedge vga_clk)
      if(~rstn)    
            x_cnt <= 1;
      else if(x_cnt == LinePeriod) 
            x_cnt <= 1;
      else 
            x_cnt <= x_cnt+ 1;

    always @ (posedge vga_clk)
    begin
        if(~rstn) 
            hsync_r <= 1'b1;
        else if(x_cnt == 1) 
            hsync_r <= 1'b0;
        else if(x_cnt == H_SyncPulse) 
            hsync_r <= 1'b1; 

        if(~rstn)
            hsync_de <= 1'b0;
        else if(x_cnt == Hde_start) 
            hsync_de <= 1'b1;
        else if(x_cnt == Hde_end) 
            hsync_de <= 1'b0;   
      end

    always @ (posedge vga_clk)
          if(~rstn)
                y_cnt <= 1;
          else if(y_cnt == FramePeriod) 
                y_cnt <= 1;
          else if(x_cnt == LinePeriod) 
                y_cnt <= y_cnt+1;

    always @ (posedge vga_clk)
    begin
        if(~rstn) 
                vsync_r <= 1'b1;
        else if(y_cnt == 1) 
                vsync_r <= 1'b0;
        else if(y_cnt == V_SyncPulse) 
                vsync_r <= 1'b1;

        if(~rstn) 
                vsync_de <= 1'b0;
        else if(y_cnt == Vde_start) 
                vsync_de <= 1'b1;
        else if(y_cnt == Vde_end) 
                vsync_de <= 1'b0;    
    end

并且可以从x_cnty_cnt中得知当前对应的xy的坐标的值:

    assign display_x = x_cnt>Hde_start?x_cnt-Hde_start:12'd0;
    assign display_y = y_cnt>Vde_start?y_cnt-Vde_start:12'd0;

利用iVerilogVGA基本时序进行仿真,并利用GTKwave查看仿真结果:

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值