此为中山大学17级计算机组成与设计实验课题。为不影响老师的教学,本文已经删去所有实现代码,完整含代码版本将在本学期结束时发布在我的个人博客https://wu-kan.cn/_posts/2018-12-23-多周期CPU设计/
实验目的
- 认识和掌握多周期数据通路图的构成、原理及其设计方法;
- 掌握多周期CPU的实现方法,代码实现方法;
- 编写一个编译器,将MIPS汇编程序编译为二进制机器码;
- 掌握多周期CPU的测试方法;
- 掌握多周期CPU的实现方法。
实验内容
设计一个多周期CPU,该CPU至少能实现以下指令功能操作。需设计的指令与格式如下:
算术运算指令
add rd rs rt
000000 | rs(5位) | rt(5位) | rd(5位) | reserved |
---|---|---|---|---|
- | - | - | - | - |
功能:rd←rs + rt
;reserved为预留部分,即未用,一般填“0”。
sub rd rs rt
000001 | rs(5位) | rt(5位) | rd(5位) | reserved |
---|---|---|---|---|
- | - | - | - | - |
功能:rd←rs - rt
。
addiu rt rs immediate
000010 | rs(5位) | rt(5位) | immediate(16位) |
---|---|---|---|
- | - | - | - |
功能:rt←rs + (sign-extend)immediate
;immediate符号扩展再参加“加”运算。
逻辑运算指令
and rd rs rt
010000 | rs(5位) | rt(5位) | rd(5位) | reserved |
---|---|---|---|---|
- | - | - | - | - |
功能:rd←rs & rt
;逻辑与运算。
andi rt rs immediate
010001 | rs(5位) | rt(5位) | immediate(16位) |
---|---|---|---|
- | - | - | - |
功能:rt←rs & (zero-extend)immediate
;immediate做“0”扩展再参加“与”运算。
ori rt rs immediate
010010 | rs(5位) | rt(5位) | immediate(16位) |
---|---|---|---|
- | - | - | - |
功能:rt←rs | (zero-extend)immediate
;immediate做“0”扩展再参加“或”运算。
xori rd rs rt
010011 | rs(5位) | rt(5位) | rd(5位) | reserved |
---|---|---|---|---|
- | - | - | - | - |
功能:rt←rs
⊕ \oplus ⊕(zero-extend)immediate
;immediate做“0”扩展再参加“异或”运算。
移位指令
sll rd rt sa
011000 | 未用 | rt(5位) | rd(5位) | sa(5位) | reserved |
---|---|---|---|---|---|
- | - | - | - | - | - |
功能:rd<-rt<<(zero-extend)sa
,左移sa位 ,(zero-extend)sa。
比较指令
slti rt rs immediate
100110 | rs(5位) | rt(5位) | immediate(16位) |
---|---|---|---|
- | - | - | - |
功能:if (rs< (sign-extend)immediate) rt =1 else rt=0
, 带符号比较,详见ALU运算功能表。
slt rd rs rt
100111 | rs(5位) | rt(5位) | rd(5位) | sa(5位) | reserved |
---|---|---|---|---|---|
- | - | - | - | - | - |
功能:if (rs<rt) rd =1 else rd=0
, 具体请看ALU运算功能表,带符号。
存储器读/写指令
sw rt immediate(rs)
110000 | rs(5位) | rt(5位) | immediate(16位) |
---|---|---|---|
- | - | - | - |
功能:memory[rs+ (sign-extend)immediate]←rt
;immediate符号扩展再相加。即将rt寄存器的内容保存到rs寄存器内容和立即数符号扩展后的数相加作为地址的内存单元中。
lw rt immediate(rs)
110001 | rs(5位) | rt(5位) | immediate(16位) |
---|---|---|---|
- | - | - | - |
功能:rt ← memory[rs + (sign-extend)immediate]
;immediate符号扩展再相加。即读取rs寄存器内容和立即数符号扩展后的数相加作为地址的内存单元中的数,然后保存到rt寄存器中。
分支指令
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位的,也就是以上说的“指令之间指令条数”。
bne rs rt immediate
110101 | rs(5位) | rt(5位) | immediate(16位) |
---|---|---|---|
- | - | - | - |
功能:if(rs!=rt) pc←pc + 4 + (sign-extend)immediate <<2 else pc ←pc + 4
特别说明:与beq不同点是,不等时转移,相等时顺序执行。
bltz rs immediate
110110 | rs(5位) | 00000 | immediate(16位) |
---|---|---|---|
- | - | - | - |
功能:if(rs<$zero) pc←pc + 4 + (sign-extend)immediate <<2 else pc ←pc + 4
。
跳转指令
j addr
111000 | addr[27:2] |
---|---|
- | - |
功能:pc <-{(pc+4)[31:28],addr[27:2],2'b00}
,无条件跳转。
说明:由于MIPS32的指令代码长度占4个字节,所以指令地址二进制数最低2位均为0,将指令地址放进指令代码中时,可省掉!这样,除了最高6位操作码外,还有26位可用于存放地址,事实上,可存放28位地址,剩下最高4位由pc+4最高4位拼接上。
jr rs
111001 | rs(5位) | 未用 | 未用 | reserved |
---|---|---|---|---|
- | - | - | - | - |
功能:pc <- rs,跳转。
调用子程序指令
jal addr
111010 | addr[27:2] |
---|---|
- | - |
功能:调用子程序,pc <- {(pc+4)[31:28],addr[27:2],2'b00}
;$31<-pc+4
,返回地址设置;子程序返回,需用指令 jr $31
。跳转地址的形成同 j addr 指令。
停机指令
halt
111111 | 00000000000000000000000000(26位) |
---|---|
- | - |
功能:停机;不改变PC的值,PC保持不变。
实验原理
多周期CPU指的是将整个CPU的执行过程分成几个阶段,每个阶段用一个时钟去完成,然后开始下一条指令的执行,而每种指令执行时所用的时钟数不尽相同,这就是所谓的多周期CPU。