SOPC综合实验报告_第1页
SOPC综合实验报告_第2页
SOPC综合实验报告_第3页
SOPC综合实验报告_第4页
SOPC综合实验报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于SOPC的数字钟设计学 院:计控学院 班 级:计本121学 号:2012021001 姓 名:钟济强指导老师:张浩鹏一、 设计概述用Nios II DE2开发板的LCD显示电子钟的日期和时间,LCD分两行显示,第一行显示年月日,第二行显示时分秒。用输入按钮BUTTON来控制LCD行修改,通过Nios II IDE进行软件设计。二、 设计要求 1掌握Nios II系统的设计和使用方法; 2学习通过Nios II IDE进行软件设计的方法; 3实现在液晶屏上显示时间和日期,并可以对其进行设置。三、 实验环境DE2 开发板QuartusII 7.2SOPC Builder 7.2NiosII I

2、DE 7.2四、 设计方案(总体设计、软件设计、硬件设计)1. 总体设计要实现以下两个功能:(1). 在液晶屏上显示时间,日期(2). 对时间、日期能够进行设置建立新工程clock2. 硬件系统组成设计根据系统要实现的功能和开发板配置,需要用到的DE2开发板上的外围器件有:LCD:电子钟显示屏幕按钮:电子钟设置功能键CFI Flash存储器:存储软、硬件程序SDRAM存储器:程序运行时将其导入SDRAM根据所用到的外设和器件特性,在SOPC Builder中建立系统要添加的模块包括:NiosII CPU定时器,按键PIO,LCD, 外部存储器总线(Avalon三态桥),外部SDRAM控制器,外

3、部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软

4、件系统设计要实现系统所需的功能,大量的工作应该集中在软件设计和优化上。电子钟的软件功能主要分为显示、设置和时间算法三大部分。显示部分的功能包括:显示时间(小时:分钟:秒)和 显示日期(年-月-日)设置部分的功能包括:设置小时,设置分钟,设置年份,设置月份,设置日期和退出设置。 设置部分的程序主要用在对按键的响应。在编写程序前要对DE2开发板上的四个按键BUTTON功能进行如下分配:(1). 主菜单 BUTTON0:设置选择键,可依次选择设置时、分、秒和年、月、日BUTTON1:显示日期键BUTTON2:显示时间键(2). 子菜单(即进入对某个选项设置后的按键功能):BUTTON1:选项数字增加

5、BUTTON2:选项数字减少BUTTON3:退出对选项的设置,返回主菜单时间算法部分的功能包括:时间累加和确定每个月的最大天数,使年、月、日能正确累加五、 软件代码1count_binary.c的代码:#include "count_binary.h"/程序每秒钟检测一次按钮的状态,对日期和时间进行设置#include "alt_types.h"#include <stdio.h>#include <string.h>#include <unistd.h>#include "system.h"#in

6、clude "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

7、_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<strlen(Text);i+) lcd_write_data(LCD_BASE,Texti); usleep(2000); void LCD_Line1()/向LCD写命令 lcd_write_cmd(LCD_BASE,0x80); usleep(2000);void LCD_Line2()/向LCD写命令 lcd_write_cmd(L

8、CD_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_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE); /*复位边沿捕获寄存器*/ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0);/

9、*初始化button_pio*/static void init_button_pio() void* edge_capture_ptr=(void*)&edge_capture; /*开放全部4个按钮的中断*/ IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xf); /*复位边沿捕获寄存器*/ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0x0); /*登记中断源*/ alt_irq_register(BUTTON_PIO_IRQ,edge_capture_ptr,handle_b

10、utton_interrupts);void delay(unsigned int x) while(x-);int check_month(int month) /如果是1、3、5、7、8、10、12月,则每月31天,程序返回1 if(month=1)|(month=3)|(month=5)|(month=7)|(month=8)|(month=10)|(month=12) return 1; /如果是4、6、9、11月,则每月是30天,程序返回0 if(month=4)|(month=6)|(month=9)|(month=11) return 0; /如果是2月,程序返回2,具体多少天还

11、要根据年的判断来决定 if(month=2) return 2;/*闰年的计算方法:公元纪年的年数可以被四整数,即为闰年被100整除而不能被400整除为平年;被100整除也可被400整除的为闰年如2000年时闰年,而1900年不是 */int check_year(int year) if(year%400)=0)|(year%4)=0)&&(year%100)!=0) return 1; /是闰年,返回1 else return 0; /不是闰年,返回0int main(void) int screen=0;/共有两行,一行显示年月日,一行显示时间 int pos=0;/每行

12、都有三个位置,第一行是年月日,第二行是时分秒 int year,month,day,hour,minute,second; unsigned long sum;/sum要设置为长整型变量,不然会溢出 char date16; char time16; int year1=6; int year2=0; int year3=0; int year4=2; int month1=1; int month2=0; int day1=1; int day2=0; int hour4,hour3,hour2,hour1,minute2,minute1,second2,second1; unsigned

13、int screenflag; hour=0;minute=0;second=0;year=2006;month=1;day=1; /年月日时分秒初始化init_button_pio();LCD_Init();while(1) if(pos>=3) pos=0;/共有三个位置0、1、2,超过了2要马上清0 if(screen>=2) screen=0;/共有两行0、1,超过了1要马上清0 /na_LED8->np_piodata=1<<pos;/用一个LED指示当前调整的位置 if(screen=0) screenflag=8; else screenflag=0

14、; /IOWR_ALTERA_AVALON_PIO_DATA(LED_GREEN_BASE,(1<<pos)|screenflag); usleep(1000000);/等待1秒的定时时间 if(second<59) second+; else second=0; if(minute<59) minute+; else minute=0; if(hour<23) hour+; else hour=0; if(day<30) day+; else day=1; if(month<12) month+; else month=1; if(year<9

15、999) year+; else year=2005; switch(edge_capture)/检测按钮 case 0x08:pos=pos+1;break;/改变调整位置/* 对数据进行加减操作的CASE:case 0x02和case 0x04 根据当前调整位置,判断当前屏显示的是年、月、日还是时分、秒 然后决定是对年月日进行加减还是对分时秒进行加减*/case 0x02:/对当前位置上的数据执行减操作 if(pos=0) if(screen=0) if(day>1)day-; else if(check_month(month)=0)day=30; if(check_month(m

16、onth)=1)day=31; if(check_month(month)=2) if(check_year(year)day=29; else day=28; if(screen=1) if(second>0)second-; else second=59; if(pos=1) if(screen=0) if(month>1)month-; else month=12; if(screen=1) if(minute>0)minute-; else minute=59; if(pos=2) if(screen=0) if(year>0)year-; else year=

17、2005; if(screen=1) if(hour>0)hour-; else hour=23; break;case 0x04:/对当前位置上的数据执行加操作 if(pos=0) if(screen=0) if(check_month(month)=0)if(day<30)day+;else day=1; if(check_month(month)=1)if(day<31)day+;else day=1; if(check_month(month)=2) if(check_year(year)if(day<29)day+;else day=1; else if(da

18、y<28)day+;else day=1; if(screen=1) if(second<59)second+; else second=0; if(pos=1) if(screen=0) if(month<12)month+; else month=1; if(screen=1) if(minute<59)minute+; else minute=0; if(pos=2) if(screen=0) if(year<9999)year+; else year=2005; if(screen=1) if(hour<23)hour+; else hour=0;

19、break;case 0x01:screen+;break;/换屏edge_capture=0; year4=year/1000;year3=(year-year4*1000)/100; year2=(year-year4*1000-year3*100)/10;year1=year%10; month2=month/10;month1=month%10; day2=day/10;day1=day%10; LCD_Line1(); date0=year4+0x30;date1=year3+0x30; date2=year2+0x30;date3=year1+0x30; date4=' &

20、#39;date5=' ' date6=month2+0x30;date7=month1+0x30; date8=' 'date9=' ' date10=day2+0x30;date11=day1+0x30; date12=' 'date13=' ' date14=' 'date15=' ' LCD_Show_Text(date); hour4=0;hour3=0; hour2=hour/10;hour1=hour%10; minute2=minute/10;minute1=minu

21、te%10; second2=second/10;second1=second%10; time0=' 'time1=' ' time2=hour2+0x30;time3=hour1+0x30; time4=' 'time5=' ' time6=minute2+0x30;time7=minute1+0x30; time8=' 'time9=' ' time10=second2+0x30;time11=second1+0x30; time12=' 'time13=' '

22、 time14=' 'time15=' ' LCD_Line2(); LCD_Show_Text(time);2lcd.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(

23、base,3)/-void LCD_Init();void LCD_Show_Text(char* Text);void LCD_Line2();void LCD_Test();/-#endif六、 实验分析和实验结果用输入按钮BUTTON0可以控制LCD行修改,同时让NiosII DE2开发板上的绿色发光二极管LEDG3的亮灭来表示。用输入按钮BUTTON3可以控制日期和时间的修改,BUTTON1和BUTTON2输入按钮可以减少和增加显示的数字。实验中开始时SDRAM的BIDIR端口的命名错误导致引脚锁定未成功,此端口的名称应为DRAM_DQ15.0。此外,三态桥的设置被改变了,需要重新设置

24、,回到Quartus II中,在assignments中选择settings,Device->Device and Pin Options->Unused Pins,改为As input tri-stated。七、 总结通过这12周的SOPC技术综合设计实践的学习,我学会了Quartus II,SOPC Buider和Nios II DE2 的使用,并通过这些软件可以进行简单的实验操作,强化了我的动手能力,并通过这几次实验更加了解SOPC的设计与应用。在实验中,遇到了各种各样的问题,首先是自己进行检查,查不出来再由老师同学进行检查和讲解,提高了自己解决问题的能力,并且熟悉了整个实验

25、的流程及具体的操作。我觉得这门课程很有意思,实验中是把各个部分的操作整合在一起,形成一个系统,做实验时要有整体感,一旦出现问题整体的重新进行设置和编译,比如如果添加组建时出现错误,要重新添加,重新生成模块,重新倒入模块,重新编译顶层文件,是一个整体的过程。八、 附录参考SOPC技术与应用,编著:江国强,机械工业出版社。参考SOPC技术综合设计实践实验指南,编著:邱德惠。思考题:1 何谓SOC?SOC(System On a Chip)称为片上系统,它是指将一个完整产品的功能集成在一个芯片上或芯片组上。SOC中可以包括微处理器CPU、数字信号处理器DSP、存储器(ROM、RAM、Flash等)、

26、总线和总线控制器、外围设备接口等,还可以包括数模混合电路(放大器、比较器、A/D和D/A转换器、锁相环等),甚至传感器、微机电和微光电单元。2 何谓SOPC?SOPC(System On a Programmable Chip)称为可编程片上系统,它是基于可编程逻辑器件(FPGA或CPLD)可重构的SOC。SOPC集成了硬核或软核CPU、DSP、锁相环(PLL)、存储器、I/O接口及可编程逻辑,可以灵活高效地解决SOC方案,而且设计周期短,设计成本低,一般只需要一台配有SOPC开发软件的PC和一台SOPC实验开发系统(或开发板),就可以进行SOPC的设计与开发。3 何谓IP核?IP(Intel

27、lectual Property)是知识产权的简称。集成电路IP是指经过预先设计、预先验证、符合产业界普遍认同的设计规范和设计标准,并具有相对独立并可以重复利用的电路模块或子系统,如CPU、运算器、存储器、放大器等。集成电路IP模块具有知识含量高、占用芯片面积小、运行速度快、功耗低、工艺容差性大等特点,可重复用于SOC、SOPC或复杂ASIC设计中。4 何谓嵌入式系统,嵌入式系统的CPU核可以分为哪两种类型?嵌入式系统是指嵌入到对象体系中的专用计算机系统,包括硬件和软件两大部分。硬件包括处理器、存储器、输入输出接口和外部设备等,软件包括系统软件和应用软件。基于SOPC的嵌入式系统结构主要包括嵌

28、入式微处理器(CPU核)、定时器(Timer)、嵌入式锁相环(PLL)、嵌入式数字信号处理器(DSP)及其他IP模块等部分。嵌入式系统的CPU核可以分为硬核和软核。5 简述CPU软核的特点。软核通常以可综合的HDL提供,因此具有较高的灵活性,并与具体的实现工艺无关,其主要缺点是缺乏对时序、面积和功耗的预见性。由于软核是以源代码的形式提供,尽管源代码可以采用加密方法,但其知识产权保护问题不容忽视。6 简述HAL的用途及基于HAL的外围设备的编程方法。HAL作为支持Nios II处理器系统的软件包,为用户的嵌入式系统上的外围设备提供了与之相匹配的接口程序。用户不用自己建立或复制HAL文件,也不需要

29、编辑HAL中的任何源代码,使用时只需要在C/C+源程序中指明代表这些接口程序的库函数包含的头文件即可。在一个基于Nios II的SOPC系统上,外围设备包括通用异步串口UART、发光二极管LED、七段数码管、按钮、LCD、存储器、定时器、鼠标、VGA等。在应用软件的开发中,对于按钮、发光二极管LED、七段数码管等通用输入输出设备的编程比较简单,而对于通用异步串口UART、LCD、VGA等字符模式外围设备的编程就比较复杂。为了方便用户对字符模式外围设备的编程,HAL支持标准输入、标准输出和标准错误函数,允许在程序中调用stdio.h中的I/O函数来完成对这些设备的访问,也支持字符模式外围设备的通用访问。7 简述SOPC的设计流程。SOPC硬件开发流程a) 创建Quartus II工程b) 创建Nios II系统模块c) 配置Nios II系统d) 将Nios II系统模块、LPM和用户自定义模块连接起来e) 编译、引脚分配、编程下载SOPC软件开发流程Nios II

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论