7 结束语
通过两周的课程设计对SOPC系统有了更进一步的理解,并了解其设计过程,初步掌握了通过SOPC Build对基于NIOS II软核的SOPC系统的定制。采用SOPC技术设计并实现的芯片是面向特定用户的芯片,它能最大程度满足嵌入式系统的要求,减少了产品设计复杂性和开发成本,缩短了产品开发的时间。因此,SOPC 技术及应用的特点决定它可以为复杂的板上系统提供一种更高效更稳定的解决方案。
每一次课程设计都能从中学到可课本上没有的知识,积累一些处理问题的经验。困难是有的,但必须要有耐心,不放弃,慢慢的,最终课程设计还是能成功做出来的,虽然不是很完美。这次的课程设计,前面的NiosII软核的定制还是很顺利的,因为学习过,而且实验也做过多次,但在后面的程序设计就不那么顺利了,多次出错。经过慢慢的调试,最终发现时按键出了问题。第一是按键消抖不合理;第二是按键消抖之后没有松手检导致按键次数出了问题,不能出现预期效果。最终经过不厌倦的调试与修改把程序修改好了,彩灯控制系统可按照要求正常运行起来了!
这次课程设计,让我更加清楚的认识到自己知识的局限性,进一步发现了自己的不足,对问题考虑的不周到,也让我找到了前进的方向,为以后的设计又积累了一次经验,相信在将来的设计中一定会设计的更好!
8 参考文献
【1】 宋彩利,康磊.数字系统设计与SOPC技术.西安交通大学出版社.2012.10
【2】 潘松,黄继业,曾毓. SOPC 技术实用教程.清华大学出版社,2004 . 6.
【3】 周立功.SOPC嵌入式系统基础教程[M].北京航空航天出版社.2006.11.
6
9 附 录
彩灯控制系统源代码:
#include \#include \
#include \#include \
alt_u8 flag=0;
int main(void) __attribute__ ((weak, alias(\
int isKeyPress()//判断是否有按键按下 { 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++; } return 0; } } return 1; }
void style0(alt_u8 temp) { alt_u8 j=0;
7
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); } } }
void style1(alt_u8 temp)//奇偶间隔闪亮 { alt_u8 j=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;
8
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, temp); usleep(800000); } } }
void style2(alt_u8 temp)//左移 { alt_u8 a,b,j=0; temp = 0xfe; for(j=1;j<8;j++) { if(0 == isKeyPress())//判断是否有按键按下 break; a=temp<
void style3(alt_u8 temp)//右移 { alt_u8 a,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); } }
9
void style4(alt_u8 temp)//逐个点亮 { temp = 0xfe; alt_u8 j=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; } }
int alt_main(void) { alt_u8 led = 0; flag = 0; while(1) { if(0 ==
IORD_ALTERA_AVALON_PIO_DATA(CONTROL_BASE)) { usleep(50);//消抖 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++; } } } switch(flag)
10