每天进步一点点------SOPC的Avalon-MM IP核(三) LCD1602 IP定制
注: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定制的更多相关文章
- 每天进步一点点------SOPC的Avalon-MM IP核(四) KEY_LED IP定制
/********************************************************************************* * Company : * Eng ...
- 每天进步一点点------SOPC PIO (一)
最近想使用Nios II里的并口PIO口进行双向操作,即需要输出的时候设置为输出方向,需要输入的时候设置为输入方向.在这期间,因为没认真仔细阅读参考文档,走了一点点的弯路.下面就简单的介绍下并行输入/ ...
- 每天进步一点点------SOPC的Avalon-MM IP核(二) AVALON总线的IP核定制
简介 NIOS II是一个建立在FPGA上的嵌入式软核处理器,除了可以根据需要任意添加已经提供的外设外,用户还可以通过定制用户逻辑外设和定制用户指令来实现各种应用要求.这节我们就来研究如何定制基于Av ...
- 每天进步一点点------SOPC的Avalon-MM IP核(一) avalon总线的信号时序
在SOPC中自定义外设时.可以设置avalon总线的信号时序,以满足外设的要求.一般情况下,可以设为: 其中setup为read和write信号之前,address和writedata信号提前建立的时 ...
- Avalon MM 总线
对于Avalon Master来讲,Address信号代表一个字节(8-bit)的地址.Address的值必须与字节的宽度对齐,如果要对某个word的byte写,需要首先使用byteenable信号: ...
- 每天进步一点点------SOPC的uC/OS-II应用(一)
uC/OS-II(又名Micro C/OS)是基于嵌入式系统的完整的,可移植.可固化.可裁剪的可剥夺型实时内核,其已经广泛应用在航空飞行器.医疗设备.工业控制等可靠性和稳定性要求较高的场合.该内核的代 ...
- 每天进步一点点------SOPC TIMER (一)
寄存器图 可以通过操作以下的寄存器来实现对timer(定时器)内核的操作(仅描述32位计数器) 状态寄存器: TO(timeout) :计数器计数到0时,该位置1,之后TO位的值会保持,直到手动清零, ...
- 每天进步一点点------创建Microblaze软核(三)
第七步 进入SDK开发环境编译完成后弹出如下对话框,选择SDK的工作目录.在MicroblazeTutor中创建一个Workspace文件夹,并选择该文件夹为SDK的工作目录.进入SDK主界面.第八步 ...
- 【小梅哥FPGA进阶教程】MC8051软核在FPGA上的使用
十.MC8051软核在FPGA上的使用 本教程内容力求以详细的步骤和讲解让读者以最快的方式学会 MC8051 IP core 的应用以及相关设计软件的使用,并激起读者对 SOPC 技术的兴趣.本实验重 ...
随机推荐
- JS高级---沙箱
沙箱 沙箱: 环境, 黑盒, 在一个虚拟的环境中模拟真实世界, 做实验, 实验结果和真实世界的结果是一样, 但是不会影响真实世界 全局变量 var num=10; console.log(nu ...
- 复选框与bitmap算法实践
bitmap(位图)算法 bitmap算法是利用数据二进制的每一位的值来表示数据的算法,可用来压缩保存数据集. 如何保存 如 5(int)的二进制表示为 101b,第一位和第三位的值是1就可以表示数据 ...
- 使用Vue创建一个新项目
1.环境 保证已经安装好了node\npm\vue等工具,将路径设置为想要建立新项目的文件夹路径 2.关于npm与cnpm npm包管理器,是集成在node中的,node环境安装完成,npm包管理器也 ...
- OpenGL 编程指南 (2)
1.OpenGL对共享的边有严格的规定:1)共享边上的像素因为同事被两者所覆盖,因此不可能不受到光照计算的影响: 2)共享边上的像素值,不可能受到多于一个三角形的光照计算的影响. 2.多边形存在正面与 ...
- NEKO's Maze Game
NEKO#ΦωΦ has just got a new maze game on her PC! The game's main puzzle is a maze, in the forms of a ...
- orcal时区
查询数据库时区 select dbtimezone from dual 修改时区 alter database set time_zone='+8:00';
- <<甄嬛传>>后感
2020年疫情和休假的时间里,刷了几部喜欢的电视剧,从<好先生>孙红雷和车晓的现代剧,到刷了至少6遍的<新三国>后,一直想了解司马懿和曹丕,接着就到了<大军师司马懿之军师 ...
- 关于spring boot集成MQTT
安装 说到mqtt,首先肯定要安装了,安装什么的地址:http://activemq.apache.org/ap...我本地是Windows的环境,所以装的是Windows版本,这里是第一个注意的地方 ...
- root xshell登陆Ubuntu
https://www.jianshu.com/p/c8ee39488d2a xshell测试非root用户,可以正常连接,但是root用户仍旧无法访问 解决方法:修改 /etc/ssh/sshd_c ...
- 三分钟快速上手TensorFlow 2.0 (中)——常用模块和模型的部署
本文学习笔记参照来源:https://tf.wiki/zh/basic/basic.html 前文:三分钟快速上手TensorFlow 2.0 (上)——前置基础.模型建立与可视化 tf.train. ...