CrazyBingo

Avalon-MM____LCD1602 IP Design

0
阅读(30317) 评论(0)

(1)verilog代码

/********************************************************************
*    Module Name           :   Crazy_LCD1602
*    Author                :   Crazy Bingo
*    Device                :    EP2C8Q208C8 
*    Version               :   Quartus II 10.1
*    Date                  :   2011-3-3
*    Description           :  
*********************************************************************/
module Crazy_LCD1602
(    //According to the Avalon-MM Memory-Mapped interface
    //Clok Input
    input                csi_clk,
    input                csi_rst_n,
    //Avalon-MM Slave
    input                avs_chipselect,
    input        [1:0]    avs_address,
    input                avs_write,
    input        [31:0]    avs_writedata,
//    input                avs_read,
//    input        [31:0]    avs_readdata,

    //Conduit End   
    output    reg            coe_lcd1602_rs,
    output    reg            coe_lcd1602_rw,
    output    reg            coe_lcd1602_en,
    output    reg    [7:0]    coe_lcd1602_data
);

//--------------------------------
//    wiite data
always@(posedge csi_clk or negedge csi_rst_n)
begin
    if(!csi_rst_n)
        begin
        coe_lcd1602_rs         <=    1'b0;
        coe_lcd1602_rw         <=    1'b0;
        coe_lcd1602_en         <=    1'b0;
        coe_lcd1602_data     <=    8'b0;
        end
    else if(avs_chipselect & avs_write)
        begin
        case(avs_address)
        0:    coe_lcd1602_rs        <=    avs_writedata[0];
        1:    coe_lcd1602_rw        <=    avs_writedata[0];
        2:    coe_lcd1602_en        <=    avs_writedata[0];
        3:    coe_lcd1602_data    <=    avs_writedata[7:0];
        endcase
        end
end

endmodule

 

 

(2)SOPC导入ip



(3)建立Quartus 工程

/********************************************************************
*    Module Name       :   sopc_ip_test
*    Author            :   Crazy Bingo
*    Device            :   EP2C8Q208C8
*    Version           :   Quartus II 10.1
*    Date              :   2011-3-3
*    Description       :   Top moudle of the program
*********************************************************************/
module sram_test
(
    //global clk
    input            clk,
    input            rst_n,
    //sram interface
    inout    [15:0]    sram_data,
    output    [18:0]    sram_addr,
    output            sram_ce_n,
    output            sram_we_n,
    output            sram_oe_n,
    output            sram_ub_n,
    output            sram_lb_n,
    //user interface
    input    [1:0]    key_data,
    output    [1:0]    led_data,
    //lcd1602 interface
    output            lcd_en,
    output            lcd_rs,
    output            lcd_rw,
    output    [7:0]    lcd_data
);   

sram_test_core sram_test_core_inst
(
    .clk                            (clk),
    .reset_n                          (rst_n),
    .coe_SRAM_ADDR_from_the_sram      (sram_addr),
    .coe_SRAM_CE_N_from_the_sram      (sram_ce_n),
    .coe_SRAM_DQ_to_and_from_the_sram (sram_data),
    .coe_SRAM_LB_N_from_the_sram      (sram_lb_n),
    .coe_SRAM_OE_N_from_the_sram      (sram_oe_n),
    .coe_SRAM_UB_N_from_the_sram      (sram_ub_n),
    .coe_SRAM_WE_N_from_the_sram      (sram_we_n),
    .coe_lcd1602_rs_from_the_lcd1602    (lcd_rs),
    .coe_lcd1602_rw_from_the_lcd1602    (lcd_rw),
    .coe_lcd1602_en_from_the_lcd1602    (lcd_en),
    .coe_lcd1602_data_from_the_lcd1602  (lcd_data),

    .coe_key_data_to_the_key_led_data   (key_data),
    .coe_led_data_from_the_key_led_data (led_data)
);

endmodule


(4)建立nios2 工程

//----------------------------------------------------------

#ifndef MY_SOPC_H_
#define MY_SOPC_H_

#include "system.h"

#define    CRAZY_LCD1602

 

//---------------------------------------------------------
#ifdef    CRAZY_LCD1602
    #define    LCD1602_ADDR    (LCD1602_BASE | (1<<31))
    #define    LCD_RS        (*(volatile unsigned int*)(LCD1602_ADDR + 0x00))
    #define    LCD_RW        (*(volatile unsigned int*)(LCD1602_ADDR + 0x04))
    #define    LCD_EN        (*(volatile unsigned int*)(LCD1602_ADDR + 0x08))
    #define    LCD_DATA    (*(volatile unsigned int*)(LCD1602_ADDR + 0x0C))
#endif

 

 

//----------------------------------------------------------

文件 “lccd1602.h”

#ifndef CRAZY_LCD1602_H_
#define CRAZY_LCD1602_H_

#include "alt_types.h"
#include "my_sopc.h"

void Write_Com(alt_u8 com);
void Write_Data(alt_u8 data);
void LCD_Init(void);
void LCD_Display(alt_u8 row, alt_u8 col, alt_u8 *pCN);

#endif /* CRAZY_LCD1602_H_ */

 

 

//----------------------------------------------------------

文件“lcd1602.c”

/*
* Crazy_LCD1602.c
*
*  Created on: 2011-2-24
*      Author: Administrator
*/

#include <string.h>
#include "unistd.h"
#include "LCD1602.h"

/*Write Command*/
void Write_Com(alt_u8 com)
{
    LCD_RS = 0;
    usleep(5000);
    LCD_DATA = com;
    usleep(5000);
    LCD_EN = 1;
    usleep(5000);
    LCD_EN = 0;
    usleep(5000);
}
/*Write Data*/
void Write_Data(alt_u8 data)
{
    LCD_RS = 1;
    usleep(5000);
    LCD_DATA = data;
    usleep(5000);
    LCD_EN = 1;
    usleep(5000);
    LCD_EN = 0;
    usleep(5000);
}
/*LCD 1602 Initialization*/
void LCD_Init(void)
{
    LCD_EN = 0;
    LCD_RW = 0;
    usleep(5000);
    Write_Com(0x38);
    Write_Com(0x0C);
    Write_Com(0x06);
    Write_Com(0x01);
    Write_Com(0x80);
}
void LCD_Display(alt_u8 row, alt_u8 col, alt_u8 *pCN)
{
    alt_u8    i, addr;
    if(row == 0)
        addr = 0x80 + col;
    else
        addr = 0xC0 + col;
    Write_Com(addr);
    //while(*(pCN) != '\0')
    for(i=0; i<strlen(pCN); i++)
    {
        Write_Data(*(pCN+i));
    }
}

 

//----------------------------------------------------------

文件 "nios2_main.v"

#include <stdio.h>
#include "system.h"
#include "unistd.h"
#include "io.h"

#include "my_sopc.h"
#include "LCD1602.h"

alt_u8 key_scan(void);

int main()
{
    printf("Hello from Nios II!\n");

    LCD_Init();
    LCD_Display(0,2,(alt_u8*)"Avalon-MM IP");
    LCD_Display(1,2,(alt_u8*)"Made By Bingo");

    retrurn 0;

 

run  handware OK

注意:地址分配的一一对应