多周期CPU设计与实现
实验内容:学校资料
设计一个多周期CPU,该CPU至少能实现以下指令功能操作。指令与格式如下:
==> 算术运算指令
1. add rd , rs, rt (说明:以助记符表示,是汇编指令;以代码表示,是机器指令)
000000 | rs(5位) | rt(5位) | rd(5位) | reserved |
---|
功能:rd←rs + rt。reserved为预留部分,即未用,一般填“0”。
2. addi rt , rs ,immediate
000010 | rs(5位) | rt(5位) | immediate(16位) |
---|
功能:rt←rs + (sign-extend)immediate;immediate符号扩展再参加“加”运算。
3. sub rd , rs , rt
000001 | rs(5位) | rt(5位) | rd(5位) | reserved |
---|
功能:rd←rs - rt
==> 逻辑运算指令
4. ori rt , rs ,immediate
010010 | rs(5位) | rt(5位) | immediate(16位) |
---|
功能:rt←rs | (zero-extend)immediate;immediate做“0”扩展再参加“或”运算。
5. and rd , rs , rt
010001 | rs(5位) | rt(5位) | rd(5位) | reserved |
---|
功能:rd←rs & rt;逻辑与运算。
6. or rd , rs , rt
010000 | rs(5位) | rt(5位) | rd(5位) | reserved |
---|
功能:rd←rs | rt;逻辑或运算。
==>移位指令
7. sll rd, rt,sa
011000 | 未用 | rt(5位) | rd(5位) | sa | reserved |
---|
功能:rd<-rt<<(zero-extend)sa,左移sa位 ,(zero-extend)sa
==>比较指令
8. sltiu rt, rs,immediate 不带符号
100011 | rs(5位) | rt(5位) | immediate(16位) |
---|
功能:if (rs <(sign-extend)immediate) rt =1 else rt=0, 具体请看表2 ALU运算功能表,不带符号
==> 存储器读/写指令
9. sw rt ,immediate(rs) 写存储器
110000 | rs(5位) | rt(5位) | immediate(16位) |
---|
功能:memory[rs+ (sign-extend)immediate]←rt;immediate符号扩展再相加。即将rt寄存器的内容保存到rs寄存器内容和立即数符号扩展后的数相加作为地址的内存单元中。
10. lw rt , immediate(rs) 读存储器
110001 | rs(5位) | rt(5位) | immediate(16位) |
---|
功能:rt ← memory[rs + (sign-extend)immediate];immediate符号扩展再相加。
即读取rs寄存器内容和立即数符号扩展后的数相加作为地址的内存单元中的数,然后保存到rt寄存器中。
==> 分支指令
11. beq rs,rt,immediate
110100 | rs(5位) | rt(5位) | immediate(16位) |
---|
功能:if(rs=rt) pc←pc + 4 + (sign-extend)immediate <<2 else pc ←pc + 4
特别说明:immediate是从PC+4地址开始和转移到的指令之间指令条数。immediate符号扩展之后左移2位再相加。为什么要左移2位?由于跳转到的指令地址肯定是4的倍数(每条指令占4个字节),最低两位是“00”,因此将immediate放进指令码中的时候,是右移了2位的,也就是以上说的“指令之间指令条数”。
12. bltz rs,immediate
110110 | rs(5位) | 00000 | immediate(16位) |
---|
功能:if(rs<0) pc←pc + 4 + (sign-extend)immediate <<2 else pc ←pc + 4
==>跳转指令
13. j addr
111000 | addr[27…2] |
---|
功能:pc <-{(pc+4)[31..28],addr[27..2],2{0}},无条件跳转。
说明:由于MIPS32的指令代码长度占4个字节,所以指令地址二进制数最低2位均为0,将指令地址放进指令代码中时,可省掉!这样,除了最高6位操作码外,还有26位可用于存放地址,事实上,可存放28位地址了,剩下最高4位由pc+4最高4位拼接上。
14. jr rs
111001 | rs(5位) | 未用 | 未用 | reserved |
---|
功能:调用子程序,pc <- {(pc+4)[31:28],addr[27:2],2’b00}; 31<-pc+4,返回地址设置;子程序返回,需用指令jr 31 < - p c + 4 , 返 回 地 址 设 置 ; 子 程 序 返 回 , 需 用 指 令 j r 31。跳转地址的形成同 j addr 指令。
15. j al addr
111000 | addr[27…2] |
---|
功能:调用子程序,pc <- {(pc+4)[31:28],addr[27:2],2’b00}; 31<-pc+4,返回地址设