摘 要:介绍了一种基于32位开放源代码的OpenRISC1200处理器嵌入式SoC的设计方案。系统以OR1200为核心,开发基于Wishone总线的IP核,并集成到OR1200系统中,构成了系统的硬件平台。软件部分构建了基于OR1200系统的交叉编译环境,开发了系统的启动程序Bootloader,移植了μC/OS-II操作系统。
关键词:OR1200微处理器;嵌入式系统;Bootloader;μC/OS-II
高性能的处理器核是SoC设计中最为关键和核心的部分。绝大多数SoC的处理器都采用了R ISC体系结构。RISC 处理器具有指令效率高、电路面积小和功率消耗低等特点, 满足了SoC高性能、低成本和低功耗的设计要求。目前在SoC设计中广泛使用的32位RISC处理器(如ARM公司的ARM处理器、IBM的Power PC处理器、MIPS公司的MIPS处理器等)均属于商业内核, 使用者必须支付相对昂贵的授权费。
近年来开放源代码运动迅速发展,开放性源码的概念已经从软件领域(如Linux,GCC等)扩展到了硬件领域,出现了专门发布免费的IP核源代码的组织——OpenCores。OR1200以其完全开放的源代码和编译器吸引了设计者。其结构简单、通用性和可移植性强,具备完整的开发平台,非常适合嵌入式SoC设计[1]。关于OR1200的研究也受到学术界和工业界越来越多的关注。
1 32位开放源代码处理器核OpenRISC1200
OpenRISC1000系列处理器是开放IP核源代码组织OpenCores公布的32/64位处理器软核。OpenRISC1200采用了自主设计的OpenRISC1000体系结构和自定义的ORBIS32 指令集。它是一种32位、标量、哈佛结构、5 级整数流水线的RISC,支持Cache、MMU和基本的DSP 功能。OR1200具有较好的可配置性, 使用者可以根据自己的需要定制自定义的指令,确定是否使用MMU,配置Cache 的大小(1 KB~64 KB之间)。OR1200同时还提供了1个用于降低功耗的电源管理单元和1个支持片内调试的调试单元[2]。
OR1200有完善的软件开发环境和操作系统的支持。使用者可以通过包括GCC、Binutils和GDB等在内的GNU tool chains进行基于OR1200内核的编译和调试。同时,OR1200拥有专门的仿真器Or1ksim,可以进行指令集一级的仿真,并支持Linux,μClinux,μC/OS-Ⅱ等任何一种现代操作系统。
OR1200典型应用情况[3]:使用0.18 ?滋m和6层金属工艺时,主频运行达到300 MHz,可以提供300Dhrystone、2.1MIPS和300 Hz的32 bit×32 bit的DSP乘加操作的能力。OR1200默认配置有100万个晶体管。
2 系统的总体方案
本文构建以OR1200微处理器为核心,包含软硬件平台的嵌入式SoC系统。硬件系统以开源32位RISC核+Wishbone总线为主干,进行增量迭代开发,将仿真验证过的模块逐个加入到OR1200嵌入式系统中,然后在FPGA上进行验证。软件部分进行交叉编译环境的建立、操作系统的移植、应用程序开发并利用驱动程序、函数库,经交叉编译工具最后生成可执行程序下载到内存中。最后在Altera的DE2-70开发板上验证系统能否稳定运行。系统开发流程如图1所示:
主函数中3个任务函数非常简单,优先级从高到底分别为1、2、3,系统提供的函数OSTimeDly()分别为10、20、30,OsTimeDly()是将1个任务挂起,延时若干个时钟节拍,CPU可以去执行其它任务。
图4给出的是通过串口工具输出μC/OS-II多任务调度的信息,3个任务根据优先级和延迟时间正确执行并打印出执行信息,测试证明OR1200嵌入式SoC系统能够稳定的运行μC/OS-II。
3 硬件平台的构建
OR1200Q嵌入式SoC系统组件包括:OR1200、Wishbone互联模块、Memory Controller、Flash、SDRAM、UART、GPIO、DM9000A接口模块以及DM9000A控制器。图2所示系统的硬件架构。
系统外接50 MHz的时钟,经过PLL分频,系统工作在25 MHz频率。由于OR1200的可配置性,配置了硬件乘法功能,选择8 KB的IC(指令缓存)、8 KB的DC(数据缓存),选择NO_DMMU,NO_IMMU,即未加内存管理单元。起始地址设为0x100,对系统做了硬件映射,复位时,0x04000000地址映射到0x0地址,所以系统可以从Flash启动。Memory Control为统一的存储控制器模块,控制着SDRAM和Flash 2种存储器。本系统针对AlteraDE2-70开发板硬件配置选择64 MB的SDRAM和8 MB的Flash。Flash用于存储压缩的内存映像文件及启动程序Bootloder。Bootloder把压缩的内存映像文件从Flash复制到SDRAM中,并跳到起始位置解压执行可执行文件、启动操作系统。UART是嵌入式中重要的I/O设备,本系统选择由OpenCores组织维护的UART16550 IP核,它与国家工业标准兼容并且可配置。UART通信协议的要求是:波特率9600 b/s、8个数据位、1个停止位、无奇偶校验位。GPIO在系统中主要用于控制LED显示状态。DM9000A支持8 bit和16 bit数据接口以适用于不同的微处理器,但是没有合适的开源IP模块来连接DM9000A和Wishbone。因此需要开发1个IP接口模块能将Wishbone从设备信号转换为DM9000A控制信号。这个接口模块有2个接口:1个连接在Wishbone从设备上;1个连接DM9000A控制器。DM9000A本身是little-endian,OR1200是big-endian,所以数据线接法应该做交叉接法。
Wishbone互联模块有很多种,比如Wishbone Conbuse、Wishbone Traffic Cop、Wishbone Interconnect Matrix。鉴于本系统外设不多,选择Wishbone Traffic Cop,它有8个主设备、9个从设备。系统2个主设备即指令总线主设备、数据总线主设备,主设备通过Wishbone 的总线译码器和仲裁器与从设备进行数据通信,总线仲裁器选择控制总线的主设备,保证每个周期最多只有1个主设备获得总线控制权。系统有4个从设备,分别是UART、Flash、SDRAM和DM9000A。每个从设备都由32 bit地址线的最高8 bit来编址,总线译码器对主设备发出的地址的最高3 bit进行译码来决定访问哪个从设备。
4 系统的软件开发
软件开发过程包括交叉编译环境的搭建,Bootloader的设计、μC/OS-II的移植和应用程序开发等。
4.1 GNU交叉编译环境的构建
OR1200系统使用的是OR32工具链,它由GCC, GNU Binutils和GDB组成,另外还提供了OR32模拟仿真工具。gcc-3.4.4用于程序的编译;Binutils-2.16.1提供了链接等各种工具;gdb-5.3用于程序的调试。OR32模拟仿真工具or1ksim工具可以模拟OR1200处理器的行为,让程序脱离处理器在模拟工具上运行,从而实现OR1200与程序并行开发。OR32可从opencores网站上下载。
4.2 启动代码Bootloder的设计
4.2.1 移植分析
对于计算机系统来说,从开机到操作系统启动需要一个引导过程,嵌入式系统同样离不开引导程序,这个引导程序就是Bootloader。通过这段小程序,可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。
结合前面构建的OR1200嵌入式SoC系统,具体的移植过程中需要修改或编写以下代码:
spr_defs.h OR1200相关寄存器的设置;
board.h系统验证所用的DE2-70开发板的定义,启动参数等;
flash_boot.S,修改初始化代码和入口;
flash.ld,代码在flash中的地址空间安排;
mc.h存储控制器的初始化;
uart.h UART的初始化;
copier.c下载的程序从Flash拷贝到SDRAM执行的拷贝代码;
在Makefile中添加Bootloder的编译支持。
4.2.2 启动分析
0x100处是复位入口地址,但是Flash的初始地址为0x04000000,通过设置寄存器对系统做了硬件映射。复位时,0x04000000地址映射到0x0地址,所以可从Flash启动。系统加电后,CPU从该地址开始执行。该地址也就是系统异常处理向量表第1项(复位)。跳到了init_mc 中,此时完成了系统的大部分初始化,例如设置寄存器、CPU、SDRAM、Flash。然后把Flash中的拷贝代码(copier)拷贝到SDRAM,跳到SDRAM中的Copier处,copier负责把Flash中的用户程序(userprog.bin)拷贝到SDRAM中去,并跳到0x100处,解压执行用户程序,启动操作系统。此时的内存映射为:SDRAM为0x00000000~0x04000000, Flash还是0x04000000~0x08000000。Bootloader的启动如图3所示。
4.3 实时操作系统μC/OS-II的移植
μC/OS-II是一个代码公开、内核精简、实时性强、支持多任务的操作系统,非常适合嵌入式系统开发。μC/OS-II 是由与处理器相关的代码,与处理器无关的代码及与应用程序相关的代码组成。它在设计之初就已经充分考虑了可移植性,所以μC/OS-II在不同处理器上的移植是比较容易的,主要是编写与处理器相关的代码,即OS_CPU_A_ASM、OS_CPU.H、OS_CPU_C.C。因此对于μC/OS-II的移植可以参考文献[4]中第13章,明确OR1200微处理器的数据声明类型、OR1200微处理器支持的堆栈增长方向、临界区处理方式。
5 系统运行测试
系统通过验证操作系统移植的正确性来测试所构建的OR1200嵌入式SoC系统能否正常运行,编写main.c实现3个任务以及任务切换。函数的主要功能包括完成μC/OS-II操作系统的初始化、硬件资源的初始化、创建相关任务和启动μC/OS-II操作系统这几部分。main.c的主函数部分如下:
本文介绍了一种基于OR1200微处理器的嵌入式SoC系统的软硬件设计。系统经测试运行稳定。系统的硬件核心选用了开源的32位微处理器核OR1200,并定位于嵌入式系统,性能良好,也可适应其他的开放源码IP,对于掌握具有自主知识产权和自主创新的处理器具有重大的意义,本系统已应用于青岛市重大科技攻关项目“基于OR1200嵌入式SoC网关集成电路的设计及AVS实现”。
参考文献
[1] 刘军,郭立,郑东飞,等.开放性32位RISC处理器IP核的比较与分析[J].电子器件,2005,28(4):50-52. [2] 孙恺,王田苗,魏洪兴,等.嵌入式CPU软核综述[J].计算机工程,2006,32(7):8-9.
[3] 徐敏,孙恺,潘峰.开源软核处理器OpenRisc的SOPC设计[M].北京:北京航空航天大学出版社,2008.
[4] LABROSSEZ J J.嵌入式实时操作系统uCOS-II[M].邵贝贝,译.第2版.北京:北京航空航天大学出版社,2003.