FPGA万年历报告.docx

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

FPGA万年历报告.docx

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

FPGA万年历报告.docx

FPGA万年历报告

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

题目:

基于SOPC设计万年历

 

一、摘要

设计从系统硬件出发,由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中建立图形文件,然后进行引脚锁定。

引脚锁定引脚文件如下:

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

图2.顶层电路

4、NiosII运行

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

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

/*

*"HelloWorld"example.

*

*Thisexampleprints'HellofromNiosII'totheSTDOUTstream.Itrunson

*theNiosII'standard','full_featured','fast',and'low_cost'example

*designs.ItrunswithorwithouttheMicroC/OS-IIRTOSandrequiresaSTDOUT

*deviceinyoursystem'shardware.

*Thememoryfootprintofthishostedapplicationis~69kbytesbydefault

*usingthestandardreferencedesign.

*

*Forareducedfootprintversionofthistemplate,andanexplanationofhow

*toreducethememoryfootprintforagivenapplication,seethe

*"small_hello_world"template.

*

*/

//key0列选择key1-key2+key3选择某一行

#include

#include"altera_avalon_pio_regs.h"

#include"alt_types.h"

#include"system.h"

#include

#include

#include

#include"LCD.h"

intyear=2014;

intmonth=06;

intday=21;

inthour=8;

intminute=20;

intsecond=30;

intselectkey=1;

intselectkeylr=1;

intKEY=0;

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

intflag;

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)!

=15)

{

usleep(100);

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

{

printf("shiftrow");

usleep(100);

printf("\n\n");

while

(1)

{

if(IORD(KEY_PIO_BASE,0)==15)break;

flag=1;

}

return1;

}//没按下的时候退出

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

{

printf("+");

usleep(100);

printf("\n\n");

while

(1)

{

if(IORD(KEY_PIO_BASE,0)==15)break;

flag=1;

}

return2;

}//key2

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

{

printf("-");

usleep(100);

printf("\n\n");

while

(1)

{

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

flag=1;

break;

}

return3;

}//key1

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

{

printf("shiftlist");

usleep(100);

printf("\n\n");

while

(1)

{

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

flag=1;break;

}

return4;

}//key0

 

elsereturn0;

 

}

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

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

voidmodify(void)

{

if(shift==2)

{//修改时间

if(con==0)

{

hour+=step;

if(hour>24|hour<=0)

{

hour=0;

}

if(flag)

{

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

printf("_:

%d:

%2d",minute,second);

printf("h\n");

//

usleep(10000);

flag=0;

}

}

elseif(con==1)

{

minute+=step;

if(minute>60|minute<=0)

{

minute=0;

}

if(flag)

{

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

printf("%d:

_:

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

usleep(10000);

flag=0;

}

 

}

elseif(con==2)

{

second+=step;

if(second>60|second<=0)

{

second=0;

}

if(flag)

{

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

printf("%d:

%d:

_\n",hour,minute);

usleep(10000);

flag=0;

}

}

}

if(shift==1)

{//修改date

if(con==0)

{

year+=step;

if(flag)

{

printf("_-%2d-%d",month,day);

printf("year\n");

printf("%d:

%d:

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

usleep(10000);

flag=0;

}

}

elseif(con==1)

{

month+=step;

if(month>12|month<=0)

{

month=1;

}

if(flag)

{

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

printf("%d:

%d:

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

usleep(10000);

flag=0;

}

}

elseif(con==2)

{

day+=step;

if(day>31|day<=0)

{

day=1;

}

if(flag)

{

printf("%d-%2d-_",year,month);

printf("day\n");

printf("%d:

%d:

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

usleep(10000);

flag=0;

}

}

}

step=0;

}

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

intmain()

{

while

(1)

{

usleep(100000);

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++;

}

}

}

}

}

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

printf("%d:

%d:

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

 

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

KEY=push_button();

usleep(1000000);

switch(KEY)

{

case1:

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

case2:

step=1;break;

case3:

step=-1;break;

case4:

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

default:

break;

}

modify();

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

//printf("%d:

%d:

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

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

}

return0;

}

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

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

五、运行情况与问题分析

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

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

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

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

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

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

六、结论

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

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

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

七、心得体会

FPGA课程设计是很实用,很有意义的。

学习了FPGA的各种原理和应用软件,需要应用的实际操作中,学以致用。

这次的设计我们做的是基于SOPC设计万年历,首先在开始设计之前老师就给我们讲解了大概的万年历制作。

在设计之前,对万年历的设计有了基础认识。

设计从系统硬件除非,通过NIOSIIDE2开发的嵌入式软件编写并嵌入SOPCBUILDER的硬件中实现万年历的整体开发。

根据课程设计指导书,一步一步进行设计,由于之前对软件都较为熟练,设计较为熟练。

遇到的难题是在NIOS中修改程序时,请教了老师和同学,才得出结果,最后实现了万年历的整体设计,顺利完成。

通过这次的设计,收获还是很大的,懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,而且必须要耐心努力和虚心请教,这些对以后工作和学习都是很大的帮助。

 

指导教师评语

 

课程设计成绩:

指导教师签字:

 

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

当前位置:首页 > 人文社科 > 法律资料

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

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