3 系统软件设计
本系统主要的开发调试工具有SOPC Builder、Quartus II和 NIOS II IDE。SOPC Builder是一个自动化的系统开发工具,它能够极大地简化高性能SOPC的设计工作;Quartus II是Altera公司推出的CPLD/FPGA开发工具,Quartus II提供了完全集成且与电路结构无关的开发包环境,具有数字逻辑设计的全部特性,主要用于system-on-a-programmable-chip (SOPC)的设计环境;NIOS II IDE是NIOS II系列嵌入式处理器的基本软件开发工具。所有软件开发任务都可以NIOS II IDE下完成,包括编辑、编译和调试程序。
3.1.系统软件配置
采用NIOS处理器开发设计与采用传统的处理器开发设计不同,开发者必须先配置处理器结构、设置接口等内容。也就是说,开发者必须根据实际需求构建一个处理器,而传统的处理器具有固定接口、片内RAM和外部设备。系统设计所需的具体软件配置如下:
(1)用SOPC Builder系统综合软件来进行NIOS软核的软件配置,包括NIOS CPU配置、片上ROM及RAM设置、FLASH设置、SDRAM设置、JTAG调试配置、加入定时器、加入外部RAM总线——Avalon三态总线桥、通讯接口、按键PIO与LED PIO设置、指定基地址和配置NIOS软核,这样整个NIOS软核已经配置完毕,之后需要编译,并生成图形文件,成为Quartus II设计的一部分。
(2)使用Quartos II软件来选取具体的Altera可编程器件系列,并对SOPC Builder生成的HDL设计文件进行布局布线;再使用Quartos II软件选取目标器件并对NIOS II系统上的各种I/O口分配管脚,另外还要根据要求进行硬件编译选项或时序约束的设置。在编译的过程中,Quartos II从HDL源文件综合生成一个适合目标器件的网表。最后生成配置文件。
(3)使用Quartos II编程器和Altera下载电缆,将配置文件下载到开发板上。当校验完当前硬件设计后,再将新的配置文件下载到开发板上的非易失存储器里。
3.2.嵌入式实时操作系统MicroC/OS-II的应用设计
目前比较流行的嵌入式操作系统主要有MicroC/OS-II , MicroCLinux,VxWorks等,考虑到系统资源以及NIOS II IDE 开发环境包含MicroC/OS-II实时操作系统,为设计者提供快速地搭建基于NIOS II处理器的MicroC/OS-II应用程序的能力,, 故本系统的操作系统选用MicroC/OS-II 。MicroC/OS-II 是一种可固化、可剪裁、占先式的多任务实时操作系统内核。它为每个任务分配单独的堆栈, 提供多种系统服务可进行中断管理。
创建一个基于NIOS II处理器的MicroC/OS-II软件过程包含以下步骤:创建一个新的NIOS II IDE工程;设定MicroC/OS-II软件工程库;建立并运行NIOS II 下的MicroC/OS-II软件工程。
一、 创建一个新的NIOS II IDE工程
创建一个新的NIOS II IDE工程的方法比较简单,基本上按照向导就能完成,要注意的是在 Project Template(工程模板)选择中, 要选择 the MicroC/OS-II Tutorial,在New System Library Dialog Box 页面中的Select Type of system library栏中要选择MicroC/OS-II。
二、设定MicroC/OS-II的步骤
(1). 在NIOS II IDE的C/C++ Projects视图中,右键在系统库上单击std_system_lib。
(2). 在弹出的菜单中选择Properties打开Properties对话框。
(3). 单击System Library显示system library选项。
(4).单击在RTOS 下面的RTOS Options。弹出MicroC/OS-II RTOS Options对话框。
(5).单击“+”在在左边的面板中,展开MicroC/OS-II目录。MicroC/OS-II是高度映射可设定的。你选定的对话框中的选项被保存在os_cfg.h文件中。选定的MicroC/OS-II选项被包含在二进制中。通过单击MicroC/OS-II下每一个选项检查你所能选择的选项。
(6).选择默认设置单击OK。你将返回系统库选项对话框,然后单击OK完成设置。
三、建立并运行NIOS II 下的MicroC/OS-II软件工程
在这一部分,在嵌入式系统中设计并运行一个MicroC/OS-II程序,通过在嵌入式操作系统MicroC/OS-II下编写2个互相调用任务来测试本系统的运行情况。
1.打开ucosii_tutorial.c
2.头文件加入如下代码
#include “system.h”
#include “altera_avalon_pio_regs.h”
#include “alt_types.h”
3.加入相关定义
#define TASK_STK_SIZE 1024
#define TaskStart_ID 0
#define Task1_ID 1
#define Task2_ID 2
#define TaskStart_Prio 1
#define Task1_Prio 4
#define Task2_Prio 3
OS_STK TaskStk[N_TASKS][TASK_STK_SIZE];
OS_EVENT *AckMbox;
OS_EVENT *TxMbox
4.在初始化函数 initCreateTasks函数中加入如下代码
OSTaskCreateExt(TaskStart, 0, &TaskStk[0][TASK_STK_SIZE-1], TaskStart_Prio, TaskStart_ID, &TaskStk[0][0], TASK_STK_SIZE, 0, OS_TASK_OPT_STK_CHK );
OSTaskCreateExt(Task1, 0, &TaskStk[1][TASK_STK_SIZE-1], Task1_Prio, Task1_ID, &TaskStk[2][0], TASK_STK_SIZE, 0, OS_TASK_OPT_STK_CHK );
OSTaskCreateExt(Task2, 0, &TaskStk[2][TASK_STK_SIZE-1], Task2_Prio, Task2_ID, &TaskStk[3][0], TASK_STK_SIZE, 0, OS_TASK_OPT_STK_CHK );
5.增加执行2任务互相调用的代码
void Task1(void * pParam)
{ //往接收消息队列发送A
char txmsg;
INT8U err;
txmsg = ‘A’;
while(1)
{
OS_ENTER_CRITICAL();
printf( “Hello from task1\n” );
OS_EXIT_CRITICAL();
OSMboxPost(TxMbox, &txmsg);
OSMboxPend(AckMbox, 0, &err);
OSTimeDly(2);
}
}
void Task2(void * pParam)
{
char *rxmsg;
INT8U err;
while(1)
{
rxmsg = OSMboxPend(TxMbox, 0, &err);
OS_ENTER_CRITICAL();
printf( “Hello from task2\n” );
OS_EXIT_CRITICAL();
OSTimeDly(2);
OSMboxPost(AckMbox, (void*)1);
}
}
6、 选择Run As 》 NIOS II Hardware (Run menu中)创建程序,下载它到试验板中并运行。下载完成后,当执行这两个任务时,任务一返回:“Hello from task1”;而任务二返回:“Hello from task2”,两个任务之间互相调用。
得到测试结果如图2:
图2 MicroC/OS系统测试结果
从测试结果中可以看出,任务一和任务二被反复的调用,这与预期中执行的结果相同,说明系统能够在FPGA中稳定运行。
四、结束语
本文介绍的基于FPGA的嵌入式系统设计达到了预期效果, CPU 本身是以软核的方式实现, 其功能可根据需要进行定制, 非常灵活。嵌入式MicroC/OS-II 操作系统的32 位嵌入式微处理器进行核心控制,利用它强大的运算处理能力,不仅减少了系统所用的器件数量和系统的尺寸,更提高了系统的可靠性和灵活性。该设计为嵌入式系统设计提供了一条新思路,体现了FPGA的灵活性、高集成性等特性,大大降低了成本,缩短了开发时间。
评论
查看更多