MIPS单周期可执行24条指令CPU

实验要求

本实训项目帮助学生构建支持 24 条指令的 MIPS 单周期 CPU ,最终实现的处理器能运行 benchmark 测试程序。另外希望学有余力的同学能为自己的处理器增加中断处理机制,能响应外部设备中断请求。

CPU 基本逻辑框架

指令格式指令格式

24条指令

24条指令

*为特殊格式指令


指令详解

R型

R

I型

I

J型

J

其中:

在这里插入图片描述

JumpAddr = ((PC + 4) & 0xf0000000) | ((address << 2) & 0x0ffffffc);

设计硬布线

ALU结构及规格

ALU结构及规格

Equal = (X == Y)?(1:0);

控制信号

控制信号产生条件控制信号产生条件
ALU_OP及控制信号的确定

根据 ALU 规格及控制信号产生条件即可得到下表,其中 X 代表无操作
ALU_OP及控制信号
根据 Logisim 分析组合逻辑电路功能可以自动生成控制器内部逻辑
控制器逻辑

设计数据通路

因为是单周期 CPU,所有指令均在一个时钟周期内完成操作,所以指令与数据分别采用 ROM 及 RAM 存储

  • 取指
  • 取指

指令存储器 ROM 容量为 1K * 32 bit

由于指令存储器存储字长为 4B,而 PC 为指令字节地址,非指令字地址,故舍弃最低两位,将 2 ~ 11 位送入存储器地址端

指令 IR 分线后送入单周期硬布线控制器译码,同时下一指令的地址通过多路选择器送入程序计数器的数据端口,等待时钟上升沿锁存

PC下地址可通过下图产生,其中 X 代表该选择端无效:

PC 下地址

JMP_IF 为条件分支跳转成功信号,只响应 Beq 或 Bne 指令:
J M P _ I F = B e q E q u a l + B n e E q u a l ‾ JMP\_IF = Beq Equal + Bne\overline{Equal} JMP_IF=BeqEqual+BneEqual

PC = PC + 4;													// PC + 4, 无任何跳转
PC = PC + 4 + (SignExtImm << 2);								// PC + imm,当 Beq 或 Bne 指令条件有效
PC = ((PC + 4) & 0xf0000000) | ((address << 2) & 0x0ffffffc);	// PC_J_JAL, J 或者 Jal 指令
PC = Reg[rs];													// PC_JR, JR指令
  • 执行

执行

Syscall 为系统调用指令,在该实验中,需要根据条件输出通用寄存器的值或产生停机信号:

if ($v0 == 0x22)
    /* 若通用寄存器 $v0 的值为 0x22,则输出 LedData,而 LedData 由寄存器锁存通用寄存器 $a0 的值 */
    std::cout << LedData;		 
else{
    /* 否则,产生停机信号,程序不向下执行,直到 Go 按钮事件产生 */
    do{
        ;
    }while(Go != true );
}
  1. A

    通用寄存器 V0 编号为 2a0 编号为 4,执行 syscall 指令时,多路选择器选择该组信号,其余指令选择 rs,rt

    通用寄存器 $ra 编号为 0x1f,记录返回地址,jal 指令可类比 x86 指令集中的 call 指令,所以该指令执行时,多路选择器选择 1 端口,写入寄存器 W# 选择 ra,将返回地址 PC + 4 写入寄存器文件(RegFile)

  2. B

    根据控制信号 AluSrcB 及 SignedExt 作为多路选择器选择端,算逻运算单元 ALU 的 B 端输入数据如下图:

ALU B 端数据来源

另外,(PC + imm)即为上文的具体实现

  1. C

    JMP_IF 信号上文已叙述

    PC_JR 为 JR 指令执行时,指令中通用寄存器 rs 的值,该值作为新的 PC

    • 执行 syscall 指令且通用寄存器 $v0 值不为 0x22 时,使停机信号 Halt 置 1 ,该信号经非门使程序计数器使能端置 0 ,将其封锁
    • 若 $v0 值为 0x22,则 LED 更换数据信号 LED_EN 置 1 ,在下一个时钟的上升沿将通用寄存器 $a0 值锁存至 LedData 寄存器中
  2. D

    数据存储器 RAM 的容量与指令 ROM 一致,均为 1K * 32 bit

    本实验唯一用到数据存储器 RAM 的指令只有 lwsw ,地址线依旧舍弃最低两位

    MDin 为寄存器文件输出端 R2 的值,在 sw 指令执行时, 通过 MemWrite 信号,在时钟上升沿将其写入 RAM 中

    与此类似, lw 指令执行时,多路选择器选择内存数据,送入寄存器文件 Din 端口,在时钟上升沿写入 RegFile

备注

CLK 为时钟信号,RESET 为测试时清空各寄存器及 RAM 信号

最后完成的单周期 CPU

完整 CPU 框架

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐