嵌入式系统课程设计-基于SOPC的彩灯控制器设计.doc
《嵌入式系统课程设计-基于SOPC的彩灯控制器设计.doc》由会员分享,可在线阅读,更多相关《嵌入式系统课程设计-基于SOPC的彩灯控制器设计.doc(61页珍藏版)》请在冰豆网上搜索。
各专业全套优秀毕业设计图纸
等级:
湖南工程学院
课程设计
课程名称嵌入式系统课程设计
课题名称基于SOPC的彩灯控制器设计
专业电子科学与技术
班级1102班
学号2011010402
姓名德
指导教师李延平
2014年12月08日
湖南工程学院
课程设计任务书
课程名称:
嵌入式系统课程设计
题目:
基于SOPC的彩灯控制器设计
专业班级:
电科1102班
学生姓名:
学号:
指导老师:
李延平
审批:
任务书下达日期2014年11月24日
设计完成日期2014年12月08日
设计内容与设计要求
一.设计内容:
采用SOPC技术设计一个彩灯控制器;
1、功能要求
1)配置NIOSII软核系统;
2)在基于Eclipse的NiosⅡ集成开发环境(IDE)上开发彩灯控制器
3)至少实现8个LED,3种以上的花色。
2、功能扩展
自拟
二.设计要求:
1.设计思路清晰,给出整体设计框图
2.NIOSII处理器选择配置合理;
3.仿真、调试、验证电路模块;
4.撰写设计报告。
目录
1设计思路 1
2系统框图 1
3NiosII软核配置 1
4原理图设计 3
5软件设计 3
5.1工程创建 3
5.2程序设计 4
5.3控制流程图 4
5.4软件调试 5
6实物演示 5
7结束语 6
8参考文献 6
9附录 8
1设计思路
完整的基于Nios的SOPC系统是一个软硬件复合的系统,在开发时可以分为硬件和软件两个部分。
本设计通过QuartusII软件内置的SOPCBuilder定制一个基于NIOSII软核的SOPC系统,加入必要的存储器及IO,然后编写动态扫描程序对PIO进行操作来完成彩灯动态显示的功能。
本系统的软件设计在基于Eclipse的NiosⅡ集成开发环境(IDE)上进行开发,编写彩灯控制器程序,实现8个LED多种样式亮灭的变换。
2系统框图
图1基于NiosII软核的SOPC彩灯控制系统框图
3NiosII软核配置
按照彩灯控制系统框图用SOPCBuilder定制NiosII系统。
本系统包含“CPU、onchip_ROM、onchip_RAM、LED_PIO、CONTROL”。
添加NiosIICPUCore。
NiosII有三种标准:
经济型、标准型、全功能型。
这里选择经济型。
分别添加片内RAM、片内ROM“。
添加IO口,8位输出,对应开发板上8个LED;1位输入,对应开发板上的按键。
8位输出端口及1位输入端口分别添加到系统中,分别该名称位“LED_PIO”、“CONTROL”(软件开发编程时要与这里模块组件名称一致)。
图2添加所需的组件
系统NiosII所需组件添加完毕,自动分配基地址和中断,生成NiosII.sopcinfo文件。
图3自动生成NiosII核成功
图4生成NiosII软核元件符号
4原理图设计
由生成的NiosII软核作为主部件,加入时钟输入和复位键和控制键输入,再加上8位的输出(连接8个LED)构成彩灯控制系统的原理图。
图5总原理图
5软件设计
5.1工程创建
通过“NiosIISofteareBuildToolsforEclipse”进行彩灯控制系统的软件设计。
新建一个“NiosIIApplicationandBSPfromTemplate”工程,选择刚刚生成Nois文件“NiosII.sopcinfo”,即可连接到CPU。
Projecttemplate选择“HelloWorld”模板。
图6基于Eclipse的NiosⅡ工程创建
5.2程序设计
程序中数据结构定义是与Nois软核定制的组件名一致的。
彩灯输出对应PIO组件的“LED_PIO”,连接开发板的led;输入控制对应PIO组件的“CONTROL”,连接开发板上的按键。
程序代码见附录。
5.3控制流程图
图7彩灯控制流程图
5.4软件调试
通过Eclipse自带的调试工具对程序设置断点进行调试。
图8调试程序
6实物演示
图9奇偶数位灯间隔亮灭
图10彩灯左移与右移
7结束语
通过两周的课程设计对SOPC系统有了更进一步的理解,并了解其设计过程,初步掌握了通过SOPCBuild对基于NIOSII软核的SOPC系统的定制。
采用SOPC技术设计并实现的芯片是面向特定用户的芯片,它能最大程度满足嵌入式系统的要求,减少了产品设计复杂性和开发成本,缩短了产品开发的时间。
因此,SOPC技术及应用的特点决定它可以为复杂的板上系统提供一种更高效更稳定的解决方案。
每一次课程设计都能从中学到可课本上没有的知识,积累一些处理问题的经验。
困难是有的,但必须要有耐心,不放弃,慢慢的,最终课程设计还是能成功做出来的,虽然不是很完美。
这次的课程设计,前面的NiosII软核的定制还是很顺利的,因为学习过,而且实验也做过多次,但在后面的程序设计就不那么顺利了,多次出错。
经过慢慢的调试,最终发现时按键出了问题。
第一是按键消抖不合理;第二是按键消抖之后没有松手检导致按键次数出了问题,不能出现预期效果。
最终经过不厌倦的调试与修改把程序修改好了,彩灯控制系统可按照要求正常运行起来了!
这次课程设计,让我更加清楚的认识到自己知识的局限性,进一步发现了自己的不足,对问题考虑的不周到,也让我找到了前进的方向,为以后的设计又积累了一次经验,相信在将来的设计中一定会设计的更好!
8参考文献
【1】宋彩利,康磊.数字系统设计与SOPC技术.西安交通大学出版社.2012.10
【2】潘松,黄继业,曾毓.SOPC技术实用教程.清华大学出版社,2004.6.
【3】周立功.SOPC嵌入式系统基础教程[M].北京航空航天出版社.2006.11.
9附录
彩灯控制系统源代码:
#include"stdio.h"
#include"system.h"
#include"altera_avalon_pio_regs.h"
#include"alt_types.h"
alt_u8flag=0;
intmain(void)__attribute__((weak,alias("alt_main")));
intisKeyPress()//判断是否有按键按下
{
if(0==IORD_ALTERA_AVALON_PIO_DATA(CONTROL_BASE))
{
//usleep(10);//消抖
if(0==IORD_ALTERA_AVALON_PIO_DATA(CONTROL_BASE))
{
//if(0!
=IORD_ALTERA_AVALON_PIO_DATA(CONTROL_BASE))//松手检测
{
if(4==flag)
flag=0;
else
flag++;
}
return0;
}
}
return1;
}
voidstyle0(alt_u8temp)
{
alt_u8j=0;
for(j=0;j<2;j++)
{
if(0==isKeyPress())//判断是否有按键按下
break;
if(0==j)
{
temp=0;
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,temp);
usleep(800000);
}
else
{
temp=0xff;
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,temp);
usleep(800000);
}
}
}
voidstyle1(alt_u8temp)//奇偶间隔闪亮
{
alt_u8j=0;
for(j=0;j<2;j++)
{
if(0==isKeyPress())//判断是否有按键按下
break;
if(0==j)
{
temp=0x55;
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,temp);
usleep(800000);
}
else
{
temp=0xaa;
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,temp);
usleep(800000);
}
}
}
voidstyle2(alt_u8temp)//左移
{
alt_u8a,b,j=0;
temp=0xfe;
for(j=1;j<8;j++)
{
if(0==isKeyPress())//判断是否有按键按下
break;
a=temp< b=temp>>(8-j);
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,(a|b));
usleep(800000);
}
}
voidstyle3(alt_u8temp)//右移
{
alt_u8a,b,j=0;
temp=0xfe;
for(j=1;j<8;j++)
{
if(0==isKeyPress())//判断是否有按键按下
break;
a=temp>>j;
b=temp<<(8-j);
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,(a|b));
usleep(800000);
}
}
voidstyle4(alt_u8temp)//逐个点亮
{
temp=0xfe;
alt_u8j=0;
for(j=1;j<8;j++)
{
if(0==isKeyPress())//判断是否有按键按下
break;
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,temp);
usleep(800000);
temp=temp<<1;
}
}
intalt_main(void)
{
alt_u8led=0;
flag=0;
while
(1)
{
if(0==IORD_ALTERA_AVALON_PIO_DATA(CONTROL_BASE))
{
usleep(50);//消抖
if(0==IORD_ALTERA_AVAL