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语言了解不再停留在书面的了解,而是有了更深的理解,培养了自己的分析能力和设计能力,受益匪浅。
指导教师评语
课程设计成绩:
指导教师签字: