EDA万年历报告.docx
- 文档编号:9623695
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:15
- 大小:1.87MB
EDA万年历报告.docx
《EDA万年历报告.docx》由会员分享,可在线阅读,更多相关《EDA万年历报告.docx(15页珍藏版)》请在冰豆网上搜索。
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文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 万年历 报告