EDA万年历报告.docx

上传人:b****7 文档编号:9623695 上传时间:2023-02-05 格式:DOCX 页数:15 大小:1.87MB
下载 相关 举报
EDA万年历报告.docx_第1页
第1页 / 共15页
EDA万年历报告.docx_第2页
第2页 / 共15页
EDA万年历报告.docx_第3页
第3页 / 共15页
EDA万年历报告.docx_第4页
第4页 / 共15页
EDA万年历报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

EDA万年历报告.docx

《EDA万年历报告.docx》由会员分享,可在线阅读,更多相关《EDA万年历报告.docx(15页珍藏版)》请在冰豆网上搜索。

EDA万年历报告.docx

EDA万年历报告

FPGA-CPLD原理及应用课程设计报告

题目:

基于SOPC设计万年历

 

学院:

信息与电子工程学院

专业:

电子信息工程

学号:

姓名:

指导老师:

时间:

2013.7.15--2013.7.20

一、摘要

设计从系统硬件出发,由CPU、总线、RAM、外接设备等构成SOPCBuilder的硬件系统,通过NiosIIDE2开发的嵌入式软件编写并嵌入SOPCBuilder的硬件中实现万年历的整体开发。

通过应用SoPCBuilder开发工具,设计者可以摆脱传统的、易于出错的软硬件设计细节,从而达到加快项目开发、缩短开发周期、节约开发成本的目的并具有高集成度、设计灵活和可移植性较好。

关键词:

万年历SOPCSOPCBuilderNiosIIDE2

二、设计要求

用NiosIIDE2开发板的LCD显示电子钟的日期和时间。

LCD分两行显示,第1行显示年、月、日;第2行显示时、分、秒。

用输入BUTTON[0]来控制LCD行的修改,同时让NiosIIDE2开发板上的绿色发光二极管亮灭来表示这个选择。

当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:

显示“时”、“分”、“秒”

2、SOPCBuilder硬件建立

SOPCBuilder是在QuartusII里的SOPCBuilder进行的,先建立工程,在SOPCBuilder里添加硬件,包括CPU,jtag_uart,RAM,LCD,PIO,按键,LED,以及LCD_ON。

3、QuartusII硬件处理

硬件会自动建立一个顶层模块,通过建一个原理图来对对应的硬件进行输入输出的添加,再锁定引脚,编译工程,硬件下载。

4、NiosIIDE2嵌入软件编写

在NiosII里建立工程,选择相应的模块,编写需要嵌入的软件,添加缺少的头文件对应的宏定义,编译工程,进行软件下载,在观察结果。

四、设计步骤

1、打开QuartusII新建工程

2、打开SOPCBuilder生成相应的硬件如图所示

图1.SoPC配置

建立好后点击Generate运行,看是否出错,然后点击exit退出。

3、调用刚才生成的硬件系统,在QuartusII中建立图形文件,然后进行引脚锁定。

引脚锁定引脚文件如下:

Clk

Y2

Led[3]

E24

Led[2]

E25

Led[1]

E22

Led[0]

E21

KEY[3]

R24

KEY[2]

N21

KEY[1]

M21

KEY[0]

M23

LCD_RW

M1

LCD_EN

L4

LCD_RS

M2

LCD_DATA[0]

L3

LCD_DATA[1]

L1

LCD_DATA[2]

L2

LCD_DATA[3]

K7

LCD_DATA[4]

K1

LCD_DATA[5]

K2

LCD_DATA[6]

M3

LCD_DATA[7]

M5

然后进行编译,在QuartusI下生成文件如下图:

图2.顶层电路

4、NiosII运行

打开NiosIIIDE2,建立工程,选择count_binary模块,添加一个LCD.h的顶层文件。

在此写出C语言程序代码。

LCD.h的顶层文件为:

#ifndef_LCD_H_

#define_LCD_H_

//LCDModule16*2

#definelcd_write_cmd(base,data)IOWR(base,0,data)

#definelcd_read_cmd(base)IORD(base,1)

#definelcd_write_data(base,data)IOWR(base,2,data)

#definelcd_read_data(base)IORD(base,3)

//==========================

voidLCD_Init();

voidLCD_Show_Text(char*Text);

voidLCD_Line2();

voidLCD_Test();

//=========================

#endif//_LCD_H_

然后建立hello_world的C文件。

#include

#include"altera_avalon_pio_regs.h"

#include"alt_types.h"

#include"system.h"

#ifndef_LCD_H_

#define_LCD_H_

//LCDModule16*2

#definelcd_write_cmd(base,data)IOWR(base,0,data)

#definelcd_read_cmd(base)IORD(base,1)

#definelcd_write_data(base,data)IOWR(base,2,data)

#definelcd_read_data(base)IORD(base,3)

//==========================

voidLCD_Init();

voidLCD_Show_Text(char*Text);

voidLCD_Line2();

voidLCD_Test();

//=========================

#endif//_LCD_H_

intyear=2013;

intmonth=7;

intday=15;

inthour=20;

intminute=25;

intsecond=30;

intselectkey=1;

intselectkeylr=1;

intms=0;

intKEY=0;

intshift=0,con=0,step=0;

//#include"basic_io.h"

volatileintedge_capture;

voidLCD_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);

}

voidLCD_Show_Text(char*Text)

{

inti;

for(i=0;i

{

lcd_write_data(LCD_BASE,Text[i]);

usleep(2000);

}

}

voidLCD_Line1()

{

lcd_write_cmd(LCD_BASE,0x80);

usleep(2000);

}

voidLCD_Line2()

{

lcd_write_cmd(LCD_BASE,0xC0);

usleep(2000);

}

//==========判断按键=================

intpush_button(void){

if(IORD(KEY_PIO_BASE,0)==14)

{while

(1){if(IORD(KEY_PIO_BASE,0)==15)break;}return1;}

if(IORD(KEY_PIO_BASE,0)==13)

{while

(1){if(IORD(KEY_PIO_BASE,0)==15)break;}return2;}

if(IORD(KEY_PIO_BASE,0)==11)

{while

(1){if(IORD(KEY_PIO_BASE,0)==15)break;}return3;}

if(IORD(KEY_PIO_BASE,0)==7)

{while

(1){if(IORD(KEY_PIO_BASE,0)==15)break;}return4;}

elsereturn0;

}

//==========判断按键=================

//==========修改时间=================

voidmodify(void)

{

if(shift==2){//修改时间

if(con==0)hour+=step;

elseif(con==1)minute+=step;

elseif(con==2)second+=step;

}

if(shift==1){//修改date

if(con==0)year+=step;

elseif(con==1)month+=step;

elseif(con==2)day+=step;

}

step=0;

}

//==========修改时间=================

intmain()

{

/*printf("%d-%2d-%d\n",year,month,day);

lcd_write_cmd(LCD_BASE,0x0f);

usleep(1000000);

lcd_write_cmd(LCD_BASE,0x10);

usleep(1000000);

lcd_write_cmd(LCD_BASE,0x10);

usleep(1000000);

lcd_write_cmd(LCD_BASE,0x03);

usleep(1000000);

lcd_write_data(LCD_BASE,'c');

*/

while

(1){

if(ms%10==0){

if(ms/10==1){//显示

if(shift==1){//date

if(con==0)//year

printf("year-%2d-%d\n",month,day);

if(con==1)//month

printf("%d-mo-%d\n",year,day);

if(con==2)//day

printf("%d-%2d-da\n",year,month);

printf("%d:

%d:

%2d\n",hour,minute,second);//time

}

if(shift==2){

printf("%d-%2d-%d\n",year,month,day);

if(con==0)//hour

printf("ho:

%d:

%2d\n",hour,minute,second);

if(con==1)//minute

printf("%d:

mi:

%2d\n",hour,second);

if(con==2)//second

printf("%d:

%d:

se\n",hour,minute);

}

}

else{

printf("%d-%2d-%d\n",year,month,day);

printf("%d:

%d:

%2d\n",hour,minute,second);

}

}

usleep(50000);

ms++;

if(ms==20){

ms=0;

second++;

}

if(second==60){

minute++;

second=0;

if(minute==60){

minute=0;

hour++;

if(hour==24){

hour=0;

day++;

if(day==31){

day=1;

month++;

if(month==12){

month=1;

year++;

}

}

}

}

}

//=============检测按键

KEY=push_button();

switch(KEY){

case1:

shift++;if(shift>=3)shift=0;break;

case2:

step=1;break;

case3:

step=-1;break;

case4:

con++;if(con>=3)con=0;break;

default:

break;

}

modify();

//=============检测按键

}

return0;

}

5、连接开发板,将文件下载到开发板,运行文件检验是否正确。

6、检查错误并修改,知道结果正确。

7、运行情况

图3.实验板运行中

图4.实验板运行中

图5.实验板运行中

五、运行情况与问题分析

1、建立工程时,注意不能出现中文或者空格,且工程名需与文件名一致,选定芯片;

2、在生成CPU硬件系统时,定义端口时,需注意设定端口输入与输出的位宽,需与程序定义的数值一致,否则运行溢出报错,须修改;

3、建立图形文件后,需进行编译,出现错误得返回原理图核对,找到错误修改后重新编译;

4、进行引脚锁定时,注意引脚文件的编写,否则选择引脚文件点击Run后会不成功,从而影响后面程序的调试;

5、当日数为31时,调节月份日期不会随机改变,就会出现4月31日等错误,加入程序段但是还是没有完成跳变;

6、程序中闪烁程序段、跳变程序段不执行,程序还需后续修改。

六、结论

采用NIOSⅡ集成开发环境提供的快捷开发手段,在Cyclone1C6Q240C8芯片上创建了一个用户定制CPU和外设的片上系统,同时完成对液晶显示器和LED的编程控制。

整个系统充分体现了SOPC设计方法的灵活性,设计时只定制系统需要的外设器件接口,避免过多的外围电路和器件造成体积、功耗的增多和可靠性的下降。

由于采用软核结构,方便系统的升级和扩展,而不必硬件改版,节约了成本,加快开发进度,缩短了产品的开发周期。

七、心得体会

经过本次SOPC课程设计实验,使我更加熟悉了QuartusⅡ与NiosⅡDE2以及开发板的使用,熟练掌握了从理论设计到硬件开发的流程,了解了万年历通过编程实现的整个过程。

本次用C语言编写的万年历系统主要实现了年历、月历、日历的显示,并且可通过键盘来变换相应的年月日,最终的设计结果达到的这些要求,是一次成功的课程设计。

从整个实验实现的过程中,碰到一些以前未出现过的问题,第一天的时候实验简直没有任何思路,也没有任何实质的进展。

在自己的努力以及同学、张老师的帮助下,使自己的理论及操作水平有所提高,也就有了一些思路,慢慢地做出来了。

通过这次课程设计,使我对C语言了解不再停留在书面的了解,而是有了更深的理解,培养了自己的分析能力和设计能力,受益匪浅。

 

指导教师评语

 

课程设计成绩:

指导教师签字:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 动态背景

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1