在本设计中,采用了MIPS32架构,选取了常用的31条MIPS指令作为指令集,在logsim平台中,从设计单周期CPU出发,逐步将单周期CPU改造为五段流水线CPU
- 五段流水线是将一条指令的执行过程划分为取指、译码、执行、访存、写回五个阶段
- 采用插入气泡法解决了分支冒险
- 采用重定向技术解决了数据冒险
- 对装载-使用型(load-used)特殊数据冒险采用了插入气泡法处理
- 基于支持的指令集编写程序验证CPU设计的正确性,经验证可以正确执行走马灯、冒泡排序等程序,在一定程度上说明CPU设计的正确性
R型指令17条:add,addu,sub,subu,and,or,xor,nor,slt,sltu,sll,srl,sra,sllv,srlv,srav,jr
I型指令12条:addi,addiu,andi,ori,xori,lw,sw,beq,bne,slti,sltiu
J型指令2条:j,jal
syscall(只支持打印16进制数以及停机)
NAME | MENEMONIC | FORMAT | OPERATION |
---|---|---|---|
Add | add | R | R[rd] = R[rs] + R[rt] |
Add Unsigned | addu | R | R[rd] = R[rs] + R[rt] |
Subtract | sub | R | R[rd] = R[rs] - R[rt] |
Subtract Unsigned | subu | R | R[rd] = R[rs] - R[rt] |
And | and | R | R[rd] = R[rs] & R[rt] |
Or | or | R | R[rd] = R[rs]|R[rt] |
Exclusive OR | xor | R | R[rd] = R[rs]^R[rt] |
Nor | nor | R | R[rd] = ~ (R[rs]|R[rt]) |
Set Less Than | slt | R | R[rd] = (R[rs] < R[rt]) ? 1 : 0 |
Set Less Than Unsig. | sltu | R | R[rd] = (R[rs] < R[rt]) ? 1 : 0 |
Shift Left Logical | sll | R | R[rd] = R[rt] << shamt |
Shift Right Logical | srl | R | R[rd] = R[rt] >> shamt |
Shift Right Arith. | sra | R | R[rd] = R[rt] >>> shamt |
Shift Word Left Logical Variable | sllv | R | R[rd] = R[rt] << R[rs] |
Shift Word Right Logical Variable | srlv | R | R[rd] = R[rt] >> R[rs] |
Shift Word Right Arithmetic Variable | srav | R | R[rd] = R[rt] >>> R[rs] |
Jump Register | jr | R | PC=R[rs] |
Add Immediate | addi | I | R[rt] = R[rs] + SignExtImm |
Add Imm. Unsigned | addiu | I | R[rt] = R[rs] + SignExtImm |
And Immediate | andi | I | R[rt] = R[rs] & ZeroExtImm |
Or Immediate | ori | I | R[rt] = R[rs] | ZeroExtImm |
Exclusive OR Immediate | xori | I | R[rt] = R[rs] ^ ZeroExtImm |
Load Upper Imm. | lui | I | R[rt] = {imm, 16’b0} |
Load Word | lw | I | R[rt] = M[R[rs]+SignExtImm] |
Store Word | sw | I | M[R[rs]+SignExtImm] = R[rt] |
Branch On Equal | beq | I | if(R[rs]==R[rt]) PC=PC+4+BranchAddr |
Branch On Not Equal | bne | I | if(R[rs]!=R[rt]) PC=PC+4+BranchAddr |
Set Less Than Imm. | slti | I | R[rt] = (R[rs] < SignExtImm)? 1 : 0 |
Set Less Than Imm.Unsigned | sltiu | I | R[rt] = (R[rs] < SignExtImm)? 1 : 0 |
Jump | j | J | PC=JumpAddr |
Jump And Link | jal | J | R[31]=PC+8;PC=JumpAddr |
流水线CPU电路图
单周期CPU电路图
下载软件目录下的logsim(该软件运行需要Java环境),用logsim打开当前目录下的Pipeline-CPU.circ
文件,在左侧选择main子电路,windos下ctr + k
,时钟连续运行,CPU开始运行提前加载好的程序,程序位于./汇编工具及测试用例/benchmark.asm