购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3 OR1200
——OpenRISC 1000架构的一个实现

OR1200是一个采用Harvard结构的32位RISC处理器,其基于OpenRISC 1000架构,具有五级流水线(需要探讨)、支持MMU、Cache及基本的DSP功能。OR1200总体结构如图1.2所示。

图1.2 OR1200总体结构

OR1200具有32个通用寄存器,没有影子寄存器,所以不支持上下文快速切换。默认配置中有8KB的直接映射数据缓存、8KB直接映射指令缓存,缓存的块大小为16字节。默认配置中数据MMU含有64项的直接映射数据快表(DTLB:Data Translation Lookaside Buffers),指令MMU含有64项的直接映射指令快表(ITLB:Instruction Translation Lookaside Buffers)。OR1200采用Wishbone B3版本的总线接口,支持电源管理、计时器、调试和外部中断。

需要注意的是,虽然在OR1200的代码中包括FPU,但这里的FPU实际并不是OR1200的一部分,而是一个独立的项目,所以本书不对FPU的实现代码进行分析。

下面简单介绍OR1200的寻址模式、位和字节次序、寄存器集、指令集、异常模型,图1.2中的MMU、Cache、可编程中断控制(PIC)、计时器单元(TT)、电源管理(PM)、Wishbone总线单元将在本书的后续章节分别独立分析。

1.3.1 寻址模式

OR1200的寻址模式有寄存器寻址、立即数寻址、寄存器相对寻址和PC相对寻址4种。其中寄存器相对寻址、PC相对寻址内容如下。

(1)寄存器相对寻址

这种寻址模式主要是加载/存储指令使用,它将一个16位的立即数做符号扩展,然后与指定通用寄存器的值相加,从而得到有效地址,如图1.3所示。

图1.3 寄存器相对寻址

(2)PC相对寻址

这种寻址模式主要是转移指令使用,在转移指令中有一个26位的立即数,将其符号扩展,然后与程序计数寄存器(PC:Program Counter)的值相加,从而得到有效地址,如图1.4所示。

图1.4 PC相对寻址

1.3.2 位和字节次序

数据在存储器中是按照字节存放的,OR1200也是按照字节访问存储器中的指令或数据,但是如果需要读出一个字,也就是4字节,比如读出的是mem[n]、mem[n+1]、mem[n+2]和mem[n+3]这4字节,那最终交给处理器的是{mem[n],mem[n+1],mem[n+2],mem[n+3]},还是{mem[n+3],mem[n+2],mem[n+1],mem[n]},就有所区分了,前者称为大端模式(Big-Endian),也称为MSB(Most Significant Byte),后者称之为小端模式(Little-Endian),也称之为LSB(Least Significant Byte)。在大端模式下,数据的高位保存在存储器的低地址中,而数据的低位保存在存储器的高地址中,图1.5给出0x12345678在两种模式下的存储情况。OR1200采用的是大端模式(Big-Endian)。

图1.5 大、小端模式下存储0x12345678的区别

1.3.3 寄存器集

RISC有一个特点:大量使用寄存器。这是因为寄存器的存取可以在一个时钟周期内完成,同时也简化了寻址方式。OR1200的指令中除加载/存储指令外,都是使用寄存器或立即数作为操作数的。OR1200中的寄存器分为两类,通用寄存器(GPR:General Purpose Register)和特殊寄存器(SPR:Special Purpose Register)。

通用寄存器有32个,分别以r0、r1……r31表示,都是32位,其中r0一般用做常量0。

特殊寄存器被分为11组,如表1.2所示。

表1.2 OR1200中的特殊寄存器组

续表

可见大部分特殊寄存器都是与图1.2中特定的硬件模块有关,所以在后续章节分析相关模块的时候再对该模块中相应的特殊寄存器进行介绍。这里只需要知道一点,在第0组寄存器中有一个SR(Supervisor Register)寄存器,SR中有一个SM位,该位决定了OR1200所处的两种模式:当SR[SM]为0时,OR1200处于用户模式;当SR[SM]为1时,OR1200处于特权模式。在用户模式下OR1200可以访问的特殊寄存器受限,在特权模式下可以访问所有的特殊寄存器。

1.3.4 指令集

OpenRISC 1000架构指令集中的指令分为3种:基本指令集、向量/DSP扩展指令和浮点扩展指令,其指令助记符分别以“l.”、“lv.”和“lf.”开始。OR1200主要实现了OpenRISC1000架构中基本指令集(ORBIS32/64)中的一部分指令,而不是全部。共有76条指令,本书将其分为6类,分别是:数据处理类指令(含算术、逻辑、移位、比较、数据传送等)、特殊寄存器访问类指令、转移类指令、异常处理类指令、乘法除法类指令和加载存储类指令。

1.数据处理类指令

数据处理类指令包含算术、逻辑、移位、比较、数据传送等指令,算术指令,如:加法指令l.add、减法指令l.sub;逻辑指令,如:寄存器相与指令l.and、寄存器相或指令l.or;移位指令,如:带立即数循环右移指令l.rori、逻辑左移指令l.sll;比较指令,如:比较寄存器是否相等指令l.sfeq;数据传送指令,如:l.movhi,表示将16位立即数左移16位,然后存储到目标寄存器。本书将在第4章对数据处理类指令进行详细介绍,同时分析其执行过程。

2.特殊寄存器访问类指令

特殊寄存器访问类指令有两个:特殊寄存器读指令l.mfspr、特殊寄存器写指令l.mtspr。本书将在第5章对特殊寄存器访问类指令进行详细介绍,同时分析其执行过程。

3.转移类指令

转移类指令包括条件转移、无条件转移和绝对转移、相对转移等指令。本书将在第6章对转移类指令进行详细介绍,同时分析其执行过程。

4.异常处理类指令

异常处理类指令包括系统调用l.sys、自陷l.trap和异常返回l.rfe等指令。本书将在第7章对异常处理类指令进行详细介绍,同时分析其执行过程。

5.乘法、除法类指令

乘法、除法类指令包括乘法指令、乘累加指令和除法指令等。本书将在第8章对乘法、除法类指令进行详细介绍,同时分析其执行过程。

6.加载存储类指令

加载存储类指令包括加载指令、存储指令。加载指令如:加载一个字到寄存器的指令l.lwz;存储指令如:存储一个字到指定地址的指令l.sw。本书将在第9章对加载存储类指令进行详细介绍,同时分析其执行过程。

1.3.5 异常模型

在指令的执行过程中由于外部信号、错误或指令本身的一些原因会导致处理器进入异常处理过程。异常处理过程偏离了原程序的执行流程,OR1200将跳转到一个指定的地址,从那里读取指令,开始异常处理,这个指定的地址称为异常处理例程入口地址。OR1200定义的异常类型及其处理例程入口地址如表1.3所示。异常处理过程涉及几个特殊寄存器的使用,以及延迟槽的知识。本书将在第7章详细介绍OR1200的异常处理过程。

表1.3 异常类型及对应处理例程的入口地址 wiDlSp9Irmpl9zDu/uKiKqaAvCQPi33kVnnQbCKzYc8BpxQNmzaiuJFLwfxdrqkZ

点击中间区域
呼出菜单
上一章
目录
下一章
×