RISC是一种执行较少类型计算机指令的微处理器,起源于80 年代的MIPS主机(即RISC 机),RISC机中采用的微处理器统称RISC处理器。这样一来,它能够以更快的速度执行操作(每秒执行更多百万条指令,即MIPS)。因为计算机执行每个指令类型都需要额外的晶体管和电路元件,计算机指令集越大就会使微处理器更复杂,执行操作也会更慢。RISC微处理器不仅精简了指令系统,采用超标量和超流水线结构;它们的指令数目只有几十条,却大大增强了并行处理能力。如:1987年Sun Microsystem公司推出的SPARC芯片就是一种超标量结构的RISC处理器。而SGI公司推出的MIPS处理器则采用超流水线结构,这些RISC处理器在构建并行精简指令系统多处理机中起着的作用。
近年来开放源代码运动迅速发展,开放性源码的概念已经从软件领域(如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的设计
Boot Loader 是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为终调用操作系统内核准备好正确的环境。通常,Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 Boot Loader 设计与实现。
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绝大部分的代码是用ANSI的C语言编写的,包含一小部分汇编代码,使之可供不同架构的微处理器使用。
μ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]. RISC datasheet https://www.dzsc.com/datasheet/RISC_1189725.html.
[2]. DM9000A datasheet https://www.dzsc.com/datasheet/DM9000A_1137137.html.
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。