SOPC综合实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

/*复位边沿捕获寄存器*/

相关文档
最新文档