注:Avalon信号类型命名参考图

  /*********************************************************************************
* Company :
* Engineer : 空气微凉
*
* Create Date : 00:00:00 22/03/2013
* Design Name :
* Module Name :
* Project Name :
* Target Devices :
* Tool versions :
* Description :
* http://www.cnblogs.com/kongqiweiliang/
* Dependencies :
* Avalon_MM_Slave_IP
* Revision :
* Revision : 0.01 - File Created
* Additional Comments :
********************************************************************************/
`timescale 1ns/1ps
`define UD #
/*******************************************************************************/
module Avalon_MM_Slave_LCD1602
(
//clock input
input icsi_clk ,//
input ireset_n ,//
//Avalon_MM_Slave interface
input iavs_chipselect ,//片选信号
input [ :] iavs_address ,//地址,译码后确定寄存器offset
input iavs_write ,//写使能信号
input [:] iavs_writedata ,//32位写数据值
//input iavs_read ,//读时能信号
//input [31:0] iavs_readdata ,//32位读数据值
//input iavs_byteenable //字节使能信号
//hardware interface(Conduit End)
output reg oLCD1602_RS ,//
output reg oLCD1602_RW ,//
output reg oLCD1602_EN ,//
output reg [ :] oLCD1602_DAT //
);
//-------------------------------------------------------------------------------
wire oLCD1602_RS_N ;//
wire oLCD1602_RW_N ;//
wire oLCD1602_EN_N ;//
wire [:] oLCD1602_DAT_N ;// //LCD1602_RS
always@(posedge icsi_clk or negedge ireset_n)begin
if(!ireset_n)
oLCD1602_RS <= 'h0;
else
oLCD1602_RS <= oLCD1602_RS_N ;//
end
assign oLCD1602_RS_N = ((iavs_write && iavs_chipselect) && (iavs_address == 'h0)) ? iavs_writedata[0] : oLCD1602_RS; //LCD1602_RW
always@(posedge icsi_clk or negedge ireset_n)begin
if(!ireset_n)
oLCD1602_RW <= 'h0;
else
oLCD1602_RW <= oLCD1602_RW_N ;//
end
assign oLCD1602_RW_N = ((iavs_write && iavs_chipselect) && (iavs_address == 'h1)) ? iavs_writedata[0] : oLCD1602_RW; //LCD1602_EN
always@(posedge icsi_clk or negedge ireset_n)begin
if(!ireset_n)
oLCD1602_EN <= 'h0;
else
oLCD1602_EN <= oLCD1602_EN_N ;//
end
assign oLCD1602_EN_N = ((iavs_write && iavs_chipselect) && (iavs_address == 'h2)) ? iavs_writedata[0] : oLCD1602_EN; //LCD1602_DAT
always@(posedge icsi_clk or negedge ireset_n)begin
if(!ireset_n)
oLCD1602_DAT <= 'h0;
else
oLCD1602_DAT <= oLCD1602_DAT_N ;//
end
assign oLCD1602_DAT_N = ((iavs_write && iavs_chipselect) && (iavs_address == 'h3)) ? iavs_writedata[7:0] : oLCD1602_DAT;
//-------------------------------------------------------------------------------
endmodule

 /*********************************************************************************
* Company :
* Engineer : 空气微凉
*
* Create Date : 00:00:00 22/03/2013
* Design Name :
* Module Name :
* Project Name :
* Target Devices :
* Tool versions :
* Description :
*
* Dependencies :
*
* Revision :
* Revision : 0.01 - File Created
* Additional Comments :
********************************************************************************/
#include <stdio.h>
#include <string.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "unistd.h" #define LCD_RS(data) IOWR(OLCD1602_BASE, 0, data)
#define LCD_RW(data) IOWR(OLCD1602_BASE, 1, data)
#define LCD_EN(data) IOWR(OLCD1602_BASE, 2, data)
#define LCD_DATA(data) IOWR(OLCD1602_BASE, 3, data) //#define LCD1602_ADDR (OLCD1602_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)) /*Write Command*/
void Write_Com(alt_u8 com)
{
LCD_RS();//LCD_RS = 0;
usleep();
LCD_DATA(com);//LCD_DATA = com;
usleep();
LCD_EN();//LCD_EN = 1;
usleep();
LCD_EN();//LCD_EN = 0;
usleep();
}
/*Write Data*/
void Write_Data(alt_u8 data)
{
LCD_RS();// LCD_RS = 1;
usleep();
LCD_DATA(data);//LCD_DATA = data;
usleep();
LCD_EN();//LCD_EN = 1;
usleep();
LCD_EN();//LCD_EN = 0;
usleep();
}
/*LCD 1602 Initialization*/
void LCD_Init(void)
{
LCD_EN();// LCD_EN = 0;
LCD_RW();//LCD_RW = 0;
usleep();
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 == )
addr = 0x80 + col;
else
addr = 0xC0 + col;
Write_Com(addr);
//while(*(pCN) != '\0')
for(i=; i<strlen(pCN); i++)
{
Write_Data(*(pCN+i));
}
} int main(void)
{
LCD_Init();
LCD_Display(,,(alt_u8*)"Avalon-MM IP2012");
LCD_Display(,,(alt_u8*)" Made By Na Xia");
while()
{ }
}

每天进步一点点------SOPC的Avalon-MM IP核(三) LCD1602 IP定制的更多相关文章

  1. 每天进步一点点------SOPC的Avalon-MM IP核(四) KEY_LED IP定制

    /********************************************************************************* * Company : * Eng ...

  2. 每天进步一点点------SOPC PIO (一)

    最近想使用Nios II里的并口PIO口进行双向操作,即需要输出的时候设置为输出方向,需要输入的时候设置为输入方向.在这期间,因为没认真仔细阅读参考文档,走了一点点的弯路.下面就简单的介绍下并行输入/ ...

  3. 每天进步一点点------SOPC的Avalon-MM IP核(二) AVALON总线的IP核定制

    简介 NIOS II是一个建立在FPGA上的嵌入式软核处理器,除了可以根据需要任意添加已经提供的外设外,用户还可以通过定制用户逻辑外设和定制用户指令来实现各种应用要求.这节我们就来研究如何定制基于Av ...

  4. 每天进步一点点------SOPC的Avalon-MM IP核(一) avalon总线的信号时序

    在SOPC中自定义外设时.可以设置avalon总线的信号时序,以满足外设的要求.一般情况下,可以设为: 其中setup为read和write信号之前,address和writedata信号提前建立的时 ...

  5. Avalon MM 总线

    对于Avalon Master来讲,Address信号代表一个字节(8-bit)的地址.Address的值必须与字节的宽度对齐,如果要对某个word的byte写,需要首先使用byteenable信号: ...

  6. 每天进步一点点------SOPC的uC/OS-II应用(一)

    uC/OS-II(又名Micro C/OS)是基于嵌入式系统的完整的,可移植.可固化.可裁剪的可剥夺型实时内核,其已经广泛应用在航空飞行器.医疗设备.工业控制等可靠性和稳定性要求较高的场合.该内核的代 ...

  7. 每天进步一点点------SOPC TIMER (一)

    寄存器图 可以通过操作以下的寄存器来实现对timer(定时器)内核的操作(仅描述32位计数器) 状态寄存器: TO(timeout) :计数器计数到0时,该位置1,之后TO位的值会保持,直到手动清零, ...

  8. 每天进步一点点------创建Microblaze软核(三)

    第七步 进入SDK开发环境编译完成后弹出如下对话框,选择SDK的工作目录.在MicroblazeTutor中创建一个Workspace文件夹,并选择该文件夹为SDK的工作目录.进入SDK主界面.第八步 ...

  9. 【小梅哥FPGA进阶教程】MC8051软核在FPGA上的使用

    十.MC8051软核在FPGA上的使用 本教程内容力求以详细的步骤和讲解让读者以最快的方式学会 MC8051 IP core 的应用以及相关设计软件的使用,并激起读者对 SOPC 技术的兴趣.本实验重 ...

随机推荐

  1. [TJOI2013] 拯救小矮人- 贪心,dp

    结论:矮的人比高的人先走一定不会使得答案变劣 于是我们排序后,像 0-1 背包那样依次考虑每个人走不走 #include <bits/stdc++.h> using namespace s ...

  2. numpy 生成数组

    可以看这个博客 https://www.cnblogs.com/td15980891505/p/6082858.html import numpy as np 建立数组并初始化数组 np.zeros( ...

  3. java中锁与@Transactional同时使用导致锁失效的问题

    示例代码 @Transactional public void update(int id) { boolean lock = redisLock.lock(id); if (!lock) { thr ...

  4. Codeforces Round #600 (Div. 2) B. Silly Mistake

    #include<iostream> #include<map> #include<set> #include<algorithm> using nam ...

  5. NotePad++中如何改变光标样式(转换横着和竖着)?

    在键盘上找 Insert ,按这个Insert就可以把横向闪烁光标( _ )修改成竖向闪烁光标样式( | )

  6. SP1716 GSS3 - Can you answer these queries III - 动态dp,线段树

    GSS3 Description 动态维护最大子段和,支持单点修改. Solution 设 \(f[i]\) 表示以 \(i\) 为结尾的最大子段和, \(g[i]\) 表示 \(1 \sim i\) ...

  7. 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)

    我没有实现时间复杂度为O(n)的算法. 思路:从第一数开始,onelist[0]:onelist[0]+onelist[1]:这样依次推算出每个子数组的sum值.和max进行比较.最后得到max值. ...

  8. 将图片中的一部分图片用ps进行旋转

    先用选择工具选择你要进行变动的那部分图像,至于选择的方法有多种而且得看你的图片来决定采取何种选择方法.然后在英文输入状态下按下“CTRL+T”出现变换框,你将鼠标移动对角点上,当鼠标变为一种旋转的图标 ...

  9. 根下var目录迁移

    问题 var目录挂载在根目录下,占用/分区的空间,如果/var/log日志空间过大,将导致/分区空间满,导致系统无法使用. 解决方案 在硬盘上划分单独的分区,挂载到/var目录,并迁移/var目录下的 ...

  10. Python爬取mc皮肤【爬虫项目】

    首先,找到一个皮肤网站,其中一个著名的皮肤网站就是 https://littleskin.cn .进入网站,我们就会见到一堆皮肤,这就是今天我们要爬的皮肤.给各位分享一下代码. PS:另外很多人在学习 ...