题目: 万年历设计
专业: 电子信息工程
学号: XXXXXXXX
姓名: XXXXXX
指导老师: XXXXXX
时间: 2015.12.20-2015.12.23
一、摘要
设计从系统硬件出发,由CPU、总线、RAM、外接设备等构成SOPC Builder的硬件系统,通过Nios II DE2开发的嵌入式软件编写并嵌入SOPC Builder的硬件中实现万年历的整体开发。通过应用SoPC Builder开发工具,设计者可以摆脱传统的、易于出错的软硬件设计细节,从而达到加快项目开发、缩短开发周期、节约开发成本的目的并具有高集成度、设计灵活和可移植性较好。 关键词:万年历 SOPC SOPC Builder Nios II DE2
二、设计要求
用Nios II DE2 开发板的LCD显示电子钟的日期和时间。LCD分两行显示,第1行显示年、月、日;第2行显示时、分、秒。用输入BUTTON[0]来控制LCD行的修改,同时让Nios II DE2开发板上的绿发光二极管亮灭来表示这个选择。当BUTTON[0]按一下后,LEDG3亮,可以修改年、月和日的数字;再按一下BUTTON[0]后,LEDG3灭,可以修改时、分和 秒的数字。
另外用输入按钮BUTTON[3]来控制日期和时间的修改,当处于日期修改方式时,每次按动一次BUTTON[3],依次更换“年”、“月”和“日”的修改。当处于时间修改方式时,每次按动一次BUTTON[3],依次更换“时”、“分”和“秒”的修改。修改对象被选中后,按动BUTTON[2]输入按钮可以增加显示的数字;按动BUTTON[1]输入按钮可以减少显示的数字。
三、设计内容
1、按键信息
BUTTON[3]:“年”、“月”、“日”或“时”、“分”、“秒”切换键
BUTTON[2]:+键
BUTTON[1]:-键
BUTTON[0]:“年”、“月”、“日”与“时”、“分”、“秒”切换键
显示信息
LCD_Line1:显示“年”、“月”、“日”
LCD_Line1:显示“时”、“分”、“秒”
SOPC Builder是在Quartus II里的SOPC Builder进行的,先建立工程,在SOPC Builder里添加硬件,包括CPU ,jtag_uart ,RAM,LCD,PIO,按键,LED,以及LCD_ON。
3、Quartus II硬件处理
硬件会自动建立一个顶层模块,通过建一个原理图来对对应的硬件进行输入输出的添加,再锁定引脚,编译工程,硬件下载。
4、Nios II DE2嵌入软件编写
在Nios II里建立工程,选择相应的模块,编写需要嵌入的软件,添加缺少的头文件对应的宏定义,编译工程,进行软件下载,在观察结果。
四、设计步骤
1、打开Quartus II新建工程
垃圾分类器2、打开SOPC Builder生成相应的硬件如图所示
图1.SoPC配置
建立好后点击Generate运行,看是否出错,然后点击exit退出。
3、在Quartus II中建立图形文件,调用刚才生成的硬件系统,然后进行引脚配置。
引脚配置图如下:
图2.引脚配置
然后进行编译,生成文件如下图:
图3.顶层电路
4、Nios II运行
打开Nios II IDE2,建立工程,选择count_binary模块,添加一个LCD.h的顶层文件。
LCD.h的顶层文件为:
#ifndef _LCD_H_
#define _LCD_H_
//LCD Module 16*2
#define lcd_write_cmd(base,data) IOWR(base, 0, data)
#define lcd_read_cmd(base) IORD(base, 1)
#define lcd_write_data(base,data) IOWR(base, 2, data)
#define lcd_read_data(base) IORD(base, 3)
//==========================
void LCD_Init();
void LCD_Show_Text(char*Text);
void LCD_Line2();
void LCD_Test();
//=========================
#endif //_LCD_H_
C语言程序代码为:
#include <stdio.h>
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "system.h"
#ifndef _LCD_H_
#define _LCD_H_
//LCD Module 16*2
#define lcd_write_cmd(base,data) IOWR(base, 0, data)
#define lcd_read_cmd(base) IORD(base, 1)
#define lcd_write_data(base,data) IOWR(base, 2, data)
#define lcd_read_data(base) IORD(base, 3)
//==========================
void LCD_Init();
void LCD_Show_Text(char*Text);
水培鱼缸
void LCD_Line2();
void LCD_Test();
//=========================
#endif //_LCD_H_
int year=2015;
int month=12;
int day=23;
int hour=11;
int minute=10;
int second=21;
int selectkey=1;
便携式设备
int selectkeylr=1;
int ms=0;
int KEY=0;
int shift=0,con=0,step=0;
//#include "basic_io.h"
volatile int edge_capture;
void LCD_Init()
{
lcd_write_cmd(LCD_BASE,0x38);
usleep(2000);
lcd_write_cmd(LCD_BASE,0x0C);
usleep(2000);
防跌倒手环 lcd_write_cmd(LCD_BASE,0x01);
usleep(2000);
lcd_write_cmd(LCD_BASE,0x06);
usleep(2000);
lcd_write_cmd(LCD_BASE,0x80);
usleep(2000);
}
void LCD_Show_Text(信号灯作5Gchar*Text)
{
int i;
for(i=0;i<strlen(Text);i++)
{
lcd_write_data(LCD_BASE,Text[i]);
usleep(2000);
}
}
void LCD_Line1()
{
lcd_write_cmd(LCD_BASE,0x80);
usleep(2000);
}
void LCD_Line2()
{
芯片怎么烧录程序 lcd_write_cmd(LCD_BASE,0xC0);
usleep(2000);
}
//==========判断按键=================
int push_button(void){
if(IORD(KEY_PIO_BASE, 0)==14) {while(1){if(IORD(KEY_PIO_BASE, 0)==15)break;}return 1;}
if(IORD(KEY_PIO_BASE, 0)==13) {while(1){if(IORD(KEY_PIO_BASE, 0)==15)break;}return 2;}
if(IORD(KEY_PIO_BASE, 0)==11) {while(1){if(IORD(KEY_PIO_BASE, 0)==15)break;}return 3;}
if(IORD(KEY_PIO_BASE, 0)==7) {while(1){if(IORD(KEY_PIO_BASE, 0)==15)break;}return 4;}