SOPC综合实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于SOPC的数字钟设计
学院:计控学院
班级:计本121
学号:**********
*名:***
指导老师:***
一、设计概述
用Nios II DE2开发板的LCD显示电子钟的日期和时间,LCD分两行显示,第一行显示年月日,第二行显示时分秒。用输入按钮BUTTON来控制LCD行修改,通过Nios II IDE进行软件设计。
二、设计要求
1.掌握Nios II系统的设计和使用方法;
2.学习通过Nios II IDE进行软件设计的方法;
3.实现在液晶屏上显示时间和日期,并可以对其进行设置。
三、实验环境
DE2 开发板
QuartusII 7.2
SOPC Builder 7.2
NiosII IDE 7.2
四、设计方案(总体设计、软件设计、硬件设计)
1. 总体设计要实现以下两个功能:
(1). 在液晶屏上显示时间,日期
(2). 对时间、日期能够进行设置
建立新工程clock
2. 硬件系统组成设计
根据系统要实现的功能和开发板配置,需要用到的DE2开发板上的外围器件有:LCD:电子钟显示屏幕
按钮:电子钟设置功能键
CFI Flash存储器:存储软、硬件程序
SDRAM存储器:程序运行时将其导入SDRAM
根据所用到的外设和器件特性,在SOPC Builder中建立系统要添加的模块包括:NiosII CPU定时器,按键PIO,LCD,外部存储器总线(Avalon三态桥),外部SDRAM控制器,外部Flash接口。
打开SOPC Buider,系统名称为sopc_clock 加入SDRAM组件
加入Flash Memory 组件
加入外部存储器总线(Avalon三态桥)加入按键PIO
加入LCD
加入NiosII CPU定时器,选择标准型的
元件添加完后,要为每个外设分配及地址和中断请求优先级(IRQ),在System中选择Auto-Assign Base Address和Auto-Assign IRQs命令,这两个命令可分别简单分配外设基地址和中断优先级。然后生成Nios II系统。
然后生成顶层文件,将Nios II系统模块加入到顶层文件中,如图所示原理图
进行引脚锁定,并编译,然后进行硬件下载
3.软件系统设计
要实现系统所需的功能,大量的工作应该集中在软件设计和优化上。电子钟的软件功能主要分为显示、设置和时间算法三大部分。
○1显示部分的功能包括:显示时间(小时:分钟:秒)和显示日期(年-月-日)○2设置部分的功能包括:设置小时,设置分钟,设置年份,设置月份,设置日期和退出设置。
设置部分的程序主要用在对按键的响应。在编写程序前要对DE2开发板上的四个按键BUTTON功能进行如下分配:
(1). 主菜单
BUTTON0:设置选择键,可依次选择设置时、分、秒和年、月、日
BUTTON1:显示日期键
BUTTON2:显示时间键
(2). 子菜单(即进入对某个选项设置后的按键功能):
BUTTON1:选项数字增加
BUTTON2:选项数字减少
BUTTON3:退出对选项的设置,返回主菜单
○3时间算法部分的功能包括:时间累加和确定每个月的最大天数,使年、月、日能正确累加
五、软件代码
1.count_binary.c的代码:
#include "count_binary.h"
//程序每秒钟检测一次按钮的状态,对日期和时间进行设置
#include "alt_types.h"
#include
#include
#include
#include "system.h"
#include "sys/alt_irq.h"
#include "altera_avalon_pio_regs.h"
#include "lcd.h"
volatile int edge_capture;
void LCD_Init()
{
//LCD初始化
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(char* Text)
{
//LCD输出格式
int i;
for(i=0;i { lcd_write_data(LCD_BASE,Text[i]); usleep(2000); } } void LCD_Line1() { //向LCD写命令 lcd_write_cmd(LCD_BASE,0x80); usleep(2000); } void LCD_Line2() { //向LCD写命令 lcd_write_cmd(LCD_BASE,0xC0); usleep(2000); } static void handle_button_interrupts(void* context,alt_u32 id) { volatile int* edge_capture_ptr=(volatile int*) context; /*存储按钮的值到边沿捕获寄存器*/ *edge_capture_ptr=IORD_ALTERA_A V ALON_PIO_EDGE_CAP(BUTTON_PIO_ BASE); /*复位边沿捕获寄存器*/