计算机设计与实践——MIPS基本指令
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MIPS 基本指令和寻址方式:
MIPS 是典型的RISC 处理器,采用32位定长指令字,操作码字段也是固定长度,没有专门的寻址方式字段,由指令格式确定各操作数的寻址方式。
MIPS 指令格式一般有三种格式: R-型指令格式 I-型指令格式 J-型指令格式
R _Type 指指指指
26
21
16
11
6
31
OP : 操作码
rs : 第一个源操作数寄存器
rt : 第二个源操作数寄存器(单目原数据) rd : 结果寄存器 shamt :移位指令的位移量 func : 指令的具体操作类型
特点:R-型指令是RR 型指令,其操作码OP 字段是特定的“000000”,具体操作类型由
func 字段给定。例如:func=“100000”时,表示“加法”运算。
R[rd] ← R[rs] + R[rt]
I_Type 指指指指
OP immediate
rt
rs 0
262116
3115
特点:I-型指令是立即数型指令
双目运算:R[rt] R[rs](OP)SignExt(imm16)
Load指令:
Addr ←R[rs] + SignExt(imm16) 计算数据地址(立即数要进行符号扩
展)
R[rt] ←M[Addr] 从存储器中取出数据,装入到寄存器中
Store指令:
Addr ←R[rs] + SignExt(imm16)
M[Addr] ←R[rt]
J_Type 指令格式
OP target address 0
26
31
6bit26bit
25
特点:J-型指令主要是无条件跳转指令,将当前PC的高4位拼上26位立即数,后补两个“0”,作为跳转目标地址。
j L //goto L 指指指指指指指指指
jal L //$ra指PC+4;goto L 指指指指指指指指指
R型指令:
定点运算:add / addu,sub / subu,sra,mult/multu,div/divu
逻辑运算:and / or / nor,sll / srl
比较分支:beq / bne / slt / sltu
跳转指令:jr
I型指令:
定点运算:addi / addiu
逻辑运算:andi / ori
比较分支:slti / sltiu
数据传送:lw / sw/ lhu / sh / lbu / sb / lui
J型指令:j / jal
设计模块划分,教学安排
1、MIPS格式指令系统设计
2、指令存储器设计
3、寄存器堆设计
4、ALU设计——基本算术、逻辑单元的设计
32位超前进位加法器的设计
32位桶式移位寄存器的设计
5、取指令部件的设计
6、立即数处理单元设计
7、单周期处理器设计——R型指令的数据通路设计
I型指令的数据通路设计
Load/Store指令的数据通路设计
分支指令/转移指令的数据通路设计
综合12条指令的完整数据通路设计
8、ALU控制单元设计
9、主控制单元的设计
10、单周期处理器总体验证
11、异常和中断处理及其电路实现
12、带有异常和中断处理功能的处理器的设计
设计示例1:指令存储器设计
1、指令存储器模块定义:
指令存储器用于存放CPU运算的程序指令和数据等,采用单端口存储器设计,设计最大为64个存储单元,每个存储单元数据宽度为32bit。下图为指令存储器的模块框图。
module
ExtMem
图1 模块框图
表1:存储器接口信号说明表
ExtMem_CLK ExtMem_WR ExtMem_RD
ExtMem_Adr Valid
Valid
ExtMem_Din
ExtMem_CS
图2 存储器接口读时序框图
ExtMem_CLK ExtMem_WR ExtMem_RD ExtMem_Adr Valid Valid
ExtMem_Dout
ExtMem_CS
图3 存储器接口写时序框图
Valid ExtMem_Dout
ExtMem_CLK ExtMem_WR ExtMem_RD ExtMem_Adr Valid Valid
ExtMem_Din ExtMem_CS Valid
图4 存储器接口读写时序框图
2、 设计电路源代码
Module ExtMem ( input ExtMem_CLK,
input ExtMem_CS,
input [5:0] ExtMem_Adr,
input ExtMem_WR,
input ExtMem_RD,
input [31:0] ExtMem_Din,
output [31:0] ExtMem_Dout );
reg [31:0] Memory [0: 63] ;
//---存储器写操作
always @( posedge ExtMem )
begin
if (~ExtMem_CS & ~ExtMem_WR ) Memory[ExtMem_Adr]<= ExtMem_Din;
end
//---存储器读操作方式1
always @( posedge ExtMem )
begin
if (~ExtMem_CS & ~ExtMem_RD ) ExtMem_Dout<= Memory[ExtMem_Adr];
end
//---存储器读操作方式2
always @( * )