FPGA-CPLD原理及应用课程设计报告
题目: 基于 NIOS 的 μC/OS-II 实验
学院: 信息与电子工程学院
专业: 电子科学与技术
学号:
姓名:
指导老师:
时间:2013-7-15~2013-7-20
一、摘要
本实验项目使用 Quartus II、SOPC Builder和Nios II EDS 从零开始构建一个能够在 DE2-115 实验平台上运行的 μC/OS-II 操作系统的 Nios II 系统。初学者可以借此范例熟悉 Quartus II、SOPC Builder、Nios II EDS 的使用,并且了解基于 FPGA 的嵌入式系统开发流程。
关键词: SOPC Builder Nios II DE2 Nios II EDS
二、设计要求
从零开始建立一个基于 Nios II 的 μC/OS-II 应用实验系统(也可以认为是一个Nios II+μC/OS-II 的应用框架)具有以下一些作用。
(1) 读者可以借助 SOPC Builder 工具自行对 Nios II 软核处理器进行配置。
(2) 很多范例都是纯硬件的VHDL代码,需要自行从零开始建立 Nios II 系统,不能够直接使用 Altera 公司已经建立好的 Nios II 系统。
(3) DE2-115并非Altera公司原创的开发板,而是友晶科技ODM的电路板,很多外围设备都与 Altera 提供的电路板不一样,所以很多Altera手册中范例都无法执行,必须要有自己从硬件到软件建立系统的能力,将来才有办法将 Altera 提供的范例移植到 DE2-115 上执行并做到最佳化。
三、设计内容”
1、SOPC Builder 硬件建立
SOPC Builder是在Quartus II里的SOPC Builder进行的,先建立工程在SOPC Builder里添加硬件,包括CPU ,PLL,onchip_memory,SSRAM,SDRAM Tristate Bridge, Flash, JTAG UART,UART, Timer System ID
2、Quartus II硬件处理
硬件会自动建立一个顶层模块,通过建一个原理图来对对应的硬件进行输入输出的添加,再锁定引脚,编译工程,硬件下载。
3、Nios II DE2嵌入软件编写
在Nios II里建立工程,选择相应的模块,编写需要嵌入的软件,添加缺少的头文件对应的宏定义,编译工程,进行软件下载,在观察结果。
四、设计步骤
1、打开Quartus II新建工程
2、打开SOPC Builder生成相应的硬件如图所示
图1.SoPC配置
建立好后点击Generate运行,看是否出错,然后点击exit退出。
3、调用刚才生成的硬件系统,在Quartus II中建立图形文件,然后进行引脚锁定。
引脚锁定引脚文件如下:
图2.引脚配置
然后进行编译,在Quartus I下生成文件如下图:
4、Nios II运行
打开Nios II IDE2,建立工程,选择count_binary模块,添加一个LCD.h的顶层文件。
在此写出C语言程序代码。
#include #include "includes.h" /* Definition of Task Stacks */ #define TASK_STACKSIZE 2048 OS_STK task1_stk[TASK_STACKSIZE]; OS_STK task2_stk[TASK_STACKSIZE]; OS_STK task3_stk[TASK_STACKSIZE]; /* Definition of Task Priorities */ #define TASK1_PRIORITY 1 #define TASK2_PRIORITY 2 #define TASK3_PRIORITY 3 /* Prints "Hello World" and sleeps for three seconds */ void task1(void* pdata) { while (1) { printf("Hello from task1\\n"); OSTimeDlyHMSM(0, 0, 6, 0); } } /* Prints "Hello World" and sleeps for three seconds */ void task2(void* pdata) { while (1) { printf("Hello from task2\\n"); OSTimeDlyHMSM(0, 0, 5, 0); } } void task3(void* pdata) { while (1) { printf("Hello from task3\\n"); OSTimeDlyHMSM(0, 0, 4, 0); } } /* The main function creates two task and starts multi-tasking */ int main(void) { OSTaskCreateExt(task1, NULL, (void *)&task1_stk[TASK_STACKSIZE-1], TASK1_PRIORITY, TASK1_PRIORITY, task1_stk, TASK_STACKSIZE, NULL, 0); OSTaskCreateExt(task2, NULL, (void *)&task2_stk[TASK_STACKSIZE-1], TASK2_PRIORITY, TASK2_PRIORITY, task2_stk, TASK_STACKSIZE, NULL, 0); OSTaskCreateExt(task3, NULL, (void *)&task3_stk[TASK_STACKSIZE-1], TASK3_PRIORITY, TASK3_PRIORITY, task3_stk, TASK_STACKSIZE, NULL, 0); OSStart(); return 0; } LCD.h的顶层文件为: #ifndef _LCD_H_ #define _LCD_H_ //LCD Module 16*2 #define lcd_write_cmd(base,data) IOWR(base, 0, data) #define lcd_read_cmd(base) IORD(base, 1) #define lcd_write_data(base,data) IOWR(base, 2, data) #define lcd_read_data(base) IORD(base, 3) //========================== void LCD_Init(); void LCD_Show_Text(char*Text); void LCD_Line2(); void LCD_Test(); //========================= #endif //_LCD_H_ 5、连接开发板,将文件下载到开发板,运行文件检验是否正确。 6、检查错误并修改,知道结果正确。 7、运行结果 图3.运行结果 五、运行情况与问题分析 1、建立工程时,注意不能出现中文或者空格,且工程名需与文件名一致,选定芯片; 2、在生成CPU硬件系统时,定义端口时,需注意设定端口输入与输出的位宽,需与程序定义的数值一致,否则运行溢出报错,须修改; 3、建立图形文件后,需进行编译,出现错误得返回原理图核对,找到错误修改后重新编译; 4、进行引脚锁定时,注意引脚文件的编写,否则选择引脚文件点击Run后会不成功,从而影响后面程序的调试; 六、结论 采用NIOSⅡ集成开发环境提供的快捷开发手段,在Cyclone 1C6Q240C8芯片上创建了一个用户定制CPU和外设的片上系统,同时完成对液晶显示器和LED的编程控制。整个系统充分体现了SOPC设计方法的灵活性,设计时只定制系统需要的外设器件接口,避免过多的外围电路和器件造成体积、功耗的增多和可靠性的下降。由于采用软核结构,方便系统的升级和扩展,而不必硬件改版,节约了成本,加快开发进度,缩短了产品的开发周期。 七、心得体会 经过本次SOPC课程设计实验,使我更加熟悉了Quartus Ⅱ与Nios Ⅱ DE2以及开发板的使用,熟练掌握了从理论设计到硬件开发的流程,了解了万年历通过编程实现的整个过程。从整个实验实现的过程中,碰到一些以前未出现过的问题,在自己的努力以及同学、老师的帮助下,使自己的理论及操作水平有所提高。 指导教师评语 课程设计成绩: 指导教师签字: