1、 前言
近年来,随着嵌入式核心芯片的飞速发展,改变了传统嵌入式系统的设计方法,嵌入式系统逐渐由板级向芯片级过渡,即片上系统——SOC。片上系统是追求产品系统最大包容的集成器件,是当前嵌入式应用领域的技术热点。SOC的出现使集成电路发展成为集成系统,整个电子整机的功能可以集成到一块芯片中,降低了设计成本,缩短了开发周期。因此,本文设计了一个基于FPGA的嵌入式系统,既能满足嵌入式系统教学实验的需要,同时也可作为嵌入式产品开发平台。
2、 系统硬件设计
本系统要实现的功能包括:可以运行嵌入式操作系统;支持NIOS II开发;支持USB通讯;支持RS-232串口通讯;支持以太网通讯;支持JTAG接口在线调试与下载。
2.1 系统硬件框图
针对所需的功能,设计出系统的相应硬件平台,硬件平台主要是由嵌入式处理器模块、存储器模块、包括以太网接口、USB接口和电源等外部接口电路模块组成。系统硬件结构框图如图1 所示。
图1 系统硬件结构图
2.2 嵌入式处理器模块
嵌入式处理器是整个系统的控制管理中心,主要功能是实现整个系统的控制和任务调试管理。在本系统中嵌入式处理器采用ALTERA公司的Cyclone系列的EP1C12Q240C8芯片,其采用QFP封装,拥有12060个逻辑单元(LE)、52个M4K 存储块、全部RAM位数为239616、两个锁相环,以及249个可用的I/O脚, 其配置存储器采用EPCS1,编译后系统速度可以达到100MHz,支持ALTERA 公司的SOPC内核NIOS II系统的开发,NIOS II开发环境编译后的可执行文件可以通过JTAG接口下载到开发板上的FLASH中去,可以支持一些嵌入式操作系统,比如MicroC/OS操作系统和Clinux操作系统。
2.3存储器模块
2.3.1 专用串行配置器件EPCS1接口电路
EPCS系列器件是Altera公司提供的一种基于FLASH存储器的专用串行配置器件,其具有串行接口,接口只需要四个引脚,能够存储Stratix II 系列、Cyclone系列的FPGA的配置信息,并在系统上电或者需要重新配置FPGA时,向FPGA发送配置信息。本系统用的串行配置器件EPCS1大小为1M字节,反复擦写次数可多达十万,可以轻松实现掉电保护
2.3.2 Flash存储器接口电路
Flash存储器具有低功耗、大容量、擦写速度快、可整片或分扇区在系统编程(烧写)、擦除等特点,因而在各种嵌入式系统中得到了广泛的应用。
系统中用了一片AMD29LV320D FLASH存储器,其单片存储容量为32M位(4M字节),工作电压为2.7V~3.6V,16位数据宽度。AMD29LV320D仅需3V电压即可完成在系统的编程与擦除操作,通过对其内部的命令寄存器写入标准的命令序列,可对Flash进行编程(烧写)、整片擦除、按扇区擦除以及其他操作。
Flash存储器在系统中通常用于存放程序代码,系统上电或复位后从此获取指令并开始执行,由于,在进行系统整体设计时,可以通过使用Quartus II对引脚进行配置,所以对于AMD29LV320D FLASH的三个功能引脚nCE、nOE、nWE,可以各接一个EP1C12Q240C8的通用I/O脚即可。
2.3.3 SDRAM存储器接口电路
与Flash存储器相比较,SDRAM不具有掉电保持数据的特性,但其存取速度大大高于Flash存储器,且具有读/写的属性,因此,SDRAM在系统中主要用作程序的运行空间、数据及堆栈区。当系统启动时,CPU首先从复位地址0x0处读取启动代码,在完成系统的初始化后,程序代码调入SDRAM中运行,以提高系统的运行速度。同时,系统及用户堆栈、运行数据也都放在SDRAM中。
系统中用了一片HY57V641620 SDRAM存储器,其存储容量为4组x16位(8M字节),工作电压为3. 3V,常见封装为54脚TSOP,兼容LVTTL接口,支持自动刷新(Auto-Refresh)和自刷新(Self-Refresh), 16位数据宽度。可满足运行MicroC/OS操作系统、或者Clinux操作系统及各种相对较复杂的算法的运行要求。
要在系统中使用SDRAM,要求微处理器具有刷新控制逻辑,或在系统中另外加入刷新控制逻辑电路。通过Altera公司提供的NIOS II开发工具可以将SDRAM控制器添加到NIOS CPU中,然后下载到EP1C12Q240C8中运行,因此可以方便地使用EP1C12Q240C8的通用I/O口与SDRAM相连接,同样在进行系统整体设计时通过Quartus II定义引脚。
2.4 外部接口模块
2.4.1以太网接口设计
系统采用realteck公司推出多年RTL8019AS网络芯片。RTL8019AS芯片是一款应用广泛的10M网络芯片,支持以太网II 和IEEE802.3 10Base5,10Base2,10BaseT、支持可编程输出的4-诊断 LED。利用RTL8019AS可以在NIOS II系统中方便的建立起完整的网络服务器,可以通过网络从FPGA芯片构成的软嵌入式系统中收发数据。
RTL8019AS与EP1C12Q240C8通过外部总线进行连接。主要是把RTL8019AS的数据总线(SDO~SD15)、地址总线(SAO~SA5,SA8)、读使能(IORB)、写使能(IOWB)、中断输出信号(INTO)和中断输入信号(RSTDRV)与EP1C12Q240C8的通用I/O脚连接即可。
2.4.2 USB接口设计
系统采用Cypress公司的SL811HS芯片作为USB接口芯片,它是一种USB主机控制器,它能与全速或低速USB外围设备通信。SL811HS能与各种微处理器、微控制器、FPGA以及DSP,ISA等各种总线进行接口,适用于各种要求配置USB主机或设备的嵌入式系统。
在USB接口电路设计中,SL811HS的8位数据线直接和FPGA芯片的8位数据线相连。其中需要注意的是,SL811HS的AO引脚和低8位地址线的最低位AO相连,即与锁存器的地址输出端的最低位相连。
2.4.3 串行接口设计
RS232是应用最为广泛的UART接口,可以方便的实现与计算机的数据通讯;同时在调试基于FPGA的嵌入式操作系统时候,可以作为辅助调试接口,结果输出到主机的超级终端上面。因为FPGA的通用I/O引脚可以在后期通过Quartus II软件定义,所以只需选取EP1C12Q240C8的任意四个引脚与电平转换器MAX3232C相连,通过MAX3232C 接RS232标准串行接口(DB9),可与PC机进行串行通信。
2.4.4 电源接口设计
系统需要使用1.5V、3.3V和5V三种直流电源,其中,EP1C12Q240C8内核使用1.5V电源,EP1C12Q240C8的I/O口、MAX3232C、LCD接口等器件使用3.3V电源,RTL8019AS使用5V电源。为简化系统电源电路的设计,要求整个系统的输入电压为高质量的5V直流电压电源,本系统采用电压转换芯片B1117来得到1.5V和3.3V的电压。
2.4.5 系统时钟电路设计
系统时钟模块为试验系统提供时钟信号,使其工作在指定的频率下,是系统不可缺少的部分。本系统的时钟信号由50MHz的有源晶振产生,为了使系统有稳定的时钟输入,要对晶振的输入电压通过简单的LC滤波电路做滤波处理,使其电压更加稳定,尽可能减小干扰。
2.4.6 复位电路设计
在系统中,复位电路主要完成系统的上电复位和系统在运行时用户的按键复位功能。本系统根据实际需要,通过Quartus II软件对复位信号进行延时设计,然后在外部再加以需要简单的电路来实现。
2.4.7 JTAG接口设计
JTAG(Joint Test Action Group)是一种国际标准测试协议,主要用于芯片内部测试及对系统进行仿真、调试 。JTAG技术是一种嵌入式调试技术,它在芯片内部封装了专门的测试电路,可以通过专用的JTAG测试软件对芯片内部节点进行测试。EP1C12Q240C8有四个专用引脚TMS、TDI、TCK、TDO与Altera公司的专用下载电缆——Byte Blaster II通过一个十针的插座相连,用于下载以及在线调试。
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的灵活性、高集成性等特性,大大降低了成本,缩短了开发时间。
责任编辑:gt
评论
查看更多