• 基于DE2的VGA显示


    好消息,DE2又出新的IP了,支持Quartus II 9.0、9.1、10.0和10.1

    大家可以Altera的官方网站下载,也可以和我联系,传给你一份QQ:287687752

    下面是IP里面的一个实例,在<Quartus II安装目录>\University_Program\IP_Core_Demos\DE2\DE2_Video_SOPC_Builder_Demos中的DE2_VGA_Both_Buffers文件中

    工程环境:Quartus II 10.1sp1 + NIOS II 10.1sp1 + DE2

    打开上述文件的工程,我们直接进入SOPC Builder配置如下:

    顶层工程文件更简单:

    module DE2_VGA_Both_Buffers (
     // Inputs
     CLOCK_50,
     KEY,

     // Bidirectionals
     //  Memory (SRAM)
     SRAM_DQ,
     
     // Outputs
     //  Memory (SRAM)
     SRAM_ADDR,

     SRAM_CE_N,
     SRAM_WE_N,
     SRAM_OE_N,
     SRAM_UB_N,
     SRAM_LB_N,
     
     //  VGA
     VGA_CLK,
     VGA_HS,
     VGA_VS,
     VGA_BLANK,
     VGA_SYNC,
     VGA_R,
     VGA_G,
     VGA_B
    );

    /*****************************************************************************
     *                           Parameter Declarations                          *
     *****************************************************************************/


    /*****************************************************************************
     *                             Port Declarations                             *
     *****************************************************************************/
    // Inputs
    input    CLOCK_50;
    input  [3:0] KEY;

    // Bidirectionals
    //  Memory (SRAM)
    inout  [15:0] SRAM_DQ;

    // Outputs
    //  Memory (SRAM)
    output  [17:0] SRAM_ADDR;

    output    SRAM_CE_N;
    output    SRAM_WE_N;
    output    SRAM_OE_N;
    output    SRAM_UB_N;
    output    SRAM_LB_N;

    //  VGA
    output    VGA_CLK;
    output    VGA_HS;
    output    VGA_VS;
    output    VGA_BLANK;
    output    VGA_SYNC;
    output  [ 9: 0] VGA_R;
    output  [ 9: 0] VGA_G;
    output  [ 9: 0] VGA_B;

    /*****************************************************************************
     *                 Internal Wires and Registers Declarations                 *
     *****************************************************************************/
    // Internal Wires

    // Internal Registers

    // State Machine Registers

    /*****************************************************************************
     *                         Finite State Machine(s)                           *
     *****************************************************************************/


    /*****************************************************************************
     *                             Sequential Logic                              *
     *****************************************************************************/


    /*****************************************************************************
     *                            Combinational Logic                            *
     *****************************************************************************/


    /*****************************************************************************
     *                              Internal Modules                             *
     *****************************************************************************/

    Video_System Char_Buffer_System (
     // 1) global signals:
     .clk_0         (CLOCK_50),
     .reset_n        (KEY[0]),
     .sys_clk        (),
     .vga_clk        (),

     // the_Pixel_Buffer
     .SRAM_DQ_to_and_from_the_Pixel_Buffer (SRAM_DQ),
     .SRAM_ADDR_from_the_Pixel_Buffer  (SRAM_ADDR),
     .SRAM_LB_N_from_the_Pixel_Buffer  (SRAM_LB_N),
     .SRAM_UB_N_from_the_Pixel_Buffer  (SRAM_UB_N),
     .SRAM_CE_N_from_the_Pixel_Buffer  (SRAM_CE_N),
     .SRAM_OE_N_from_the_Pixel_Buffer  (SRAM_OE_N),
     .SRAM_WE_N_from_the_Pixel_Buffer  (SRAM_WE_N),

     // the_vga_controller
     .VGA_CLK_from_the_VGA_Controller  (VGA_CLK),
     .VGA_HS_from_the_VGA_Controller   (VGA_HS),
     .VGA_VS_from_the_VGA_Controller   (VGA_VS),
     .VGA_BLANK_from_the_VGA_Controller  (VGA_BLANK),
     .VGA_SYNC_from_the_VGA_Controller  (VGA_SYNC),
     .VGA_R_from_the_VGA_Controller   (VGA_R),
     .VGA_G_from_the_VGA_Controller   (VGA_G),
     .VGA_B_from_the_VGA_Controller   (VGA_B)
    );

    endmodule

    看看RTL视图:

    把编译好的配置文件下载DE2中,进入NIOS II

    看看里面的给的C代码:

    #include"system.h"

    /* function prototypes */
    void VGA_text (int, int, char *);
    void VGA_box (int, int, int, int, short);

    /********************************************************************************
     * This program demonstrates use of the character and pixel buffers
     *
     * It performs the following:
     *  1. Draws a blue box on the VGA display, and places a text string inside
     *     the box. Also, moves the word ALTERA around the display, "bouncing" off
     *     the blue box and screen edges
    ********************************************************************************/
    int main(void)
    {
     /* Declare volatile pointer to pixel DMA controller (volatile means that IO load
        and store instructions will be used to access these pointer locations,
        instead of regular memory loads and stores) */
       volatile int * Pixel_DMA_controller = (int *) PIXEL_BUFFER_DMA_BASE; // DMA controller base address

     int delay = 0; // synchronize with the screen drawing

     /* these variables are used for a blue box and a "bouncing" ALTERA on the VGA screen */
     int ALT_x1; int ALT_x2; int ALT_y;
     int ALT_inc_x; int ALT_inc_y;
     int blue_x1; int blue_y1; int blue_x2; int blue_y2;
     int screen_x; int screen_y; int char_buffer_x; int char_buffer_y;
     short color;

     /* create messages to be displayed on the VGA display */
     char text_top_VGA[20] = "Altera DE2\0";
     char text_bottom_VGA[20] = "Video Buffers\0";
     char text_ALTERA[10] = "ALTERA\0";
     char text_erase[10] = "      \0";

     /* the following variables give the size of the pixel buffer */
     screen_x = 319; screen_y = 239;
     color = 0x1863;  // a dark grey color
     VGA_box (0, 0, screen_x, screen_y, color); // fill the screen with grey
     // draw a medium-blue box around the above text, based on the character buffer coordinates
     blue_x1 = 28; blue_x2 = 52; blue_y1 = 26; blue_y2 = 34;
     // character coords * 4 since characters are 4 x 4 pixel buffer coords (8 x 8 VGA coords)
     color = 0x187F;  // a medium blue color
     VGA_box (blue_x1 * 4, blue_y1 * 4, blue_x2 * 4, blue_y2 * 4, color);
     /* output text message in the middle of the VGA monitor */
     VGA_text (blue_x1 + 5, blue_y1 + 3, text_top_VGA);
     VGA_text (blue_x1 + 5, blue_y1 + 4, text_bottom_VGA);

     char_buffer_x = 79; char_buffer_y = 59;
     ALT_x1 = 0; ALT_x2 = 5/* ALTERA = 6 chars */; ALT_y = 0; ALT_inc_x = 1; ALT_inc_y = 1;
     VGA_text (ALT_x1, ALT_y, text_ALTERA);

     *(Pixel_DMA_controller) = 0; // dummy write to start buffer swap process
     while (1)
     {
      if ( (*(Pixel_DMA_controller+3) & 1) == 0) // wait for Status register bit S == 0
      {
       /* If the screen has been drawn completely then we can draw a new image. This
        * section of the code will only be entered each time the screen is redrawn */
       delay = delay + 1;

       if (delay == 2)
       {
        delay = 0;
        /* The delay is inserted to slow down the animation */

        /* move the ALTERA text around on the VGA screen */
        VGA_text (ALT_x1, ALT_y, text_erase);  // erase
        ALT_x1 += ALT_inc_x;
        ALT_x2 += ALT_inc_x;
        ALT_y += ALT_inc_y;

        if ( (ALT_y == char_buffer_y) || (ALT_y == 0) )
         ALT_inc_y = -(ALT_inc_y);
        if ( (ALT_x2 == char_buffer_x) || (ALT_x1 == 0) )
         ALT_inc_x = -(ALT_inc_x);

        if ( (ALT_y >= blue_y1 - 1) && (ALT_y <= blue_y2 + 1) )
        {
         if ( ((ALT_x1 >= blue_x1 - 1) && (ALT_x1 <= blue_x2 + 1)) ||
          ((ALT_x2 >= blue_x1 - 1) && (ALT_x2 <= blue_x2 + 1)) )
         {
          if ( (ALT_y == (blue_y1 - 1)) || (ALT_y == (blue_y2 + 1)) )
           ALT_inc_y = -(ALT_inc_y);
          else
           ALT_inc_x = -(ALT_inc_x);
         }
        }
        VGA_text (ALT_x1, ALT_y, text_ALTERA);
       }
       /* Execute a swap buffer command. This will allow us to check if the screen has
        * been redrawn before generating a new animation frame. */
       *(Pixel_DMA_controller) = 0;
      }
     }
    }

    /****************************************************************************************
     * Subroutine to send a string of text to the VGA monitor
    ****************************************************************************************/
    void VGA_text(int x, int y, char * text_ptr)
    {
     int offset;
       volatile char * character_buffer = (char *) CHAR_BUFFER_WITH_DMA_AVALON_CHAR_BUFFER_SLAVE_BASE; // VGA character buffer

     /* assume that the text string fits on one line */
     offset = (y << 7) + x;
     while ( *(text_ptr) )
     {
      *(character_buffer + offset) = *(text_ptr); // write to the character buffer
      ++text_ptr;
      ++offset;
     }
    }

    /****************************************************************************************
     * Draw a filled rectangle on the VGA monitor
    ****************************************************************************************/
    void VGA_box(int x1, int y1, int x2, int y2, short pixel_color)
    {
     int offset, row, col;
       volatile short * pixel_buffer = (short *) PIXEL_BUFFER_BASE; // VGA pixel buffer

     /* assume that the box coordinates are valid */
     for (row = y1; row <= y2; row++)
     {
      col = x1;
      while (col <= x2)
      {
       offset = (row << 9) + col;
       *(pixel_buffer + offset) = pixel_color; // compute halfword address, set pixel
       ++col;
      }
     }
    }

    接上显示器,我们就可以看到跳动的文字ALTERA了,还有蓝色的BOX,呵呵!

  • 相关阅读:
    visual studio 2012 知识笔记
    R语言初体验
    java_Thread
    LoadRunner JAVA Vuser协议手工写脚本Failed to find Classes.zip entry in Classpath问题
    如何判断某个数据表是否存在
    ftp://hxtech.com
    成本算法
    移动平均算法
    命令行解压缩文件
    互斥(mutex)
  • 原文地址:https://www.cnblogs.com/Neddy/p/1959218.html
Copyright © 2020-2023  润新知