1. MIPS指令集与FPGA模型机设计基础
第一次接触MIPS指令集是在大学计算机组成原理课上,当时看着老师用Verilog实现的简易CPU跑起第一个加法指令,那种成就感至今难忘。MIPS作为经典的RISC指令集,以其规整的指令格式和简洁的数据通路,成为许多高校CPU设计的首选教学案例。这次我们要在FPGA上实现的模型机,就是基于MIPS的12条核心整数指令集。
MIPS指令最显著的特点是其规整的三种指令格式:R型(寄存器操作)、I型(立即数操作)和J型(跳转操作)。比如R型指令的32位编码中,6位操作码(op)、5位源寄存器rs、5位源寄存器rt、5位目标寄存器rd、5位移位量(shamt)和6位功能码(funct)。这种规整性让译码电路设计变得异常清晰。
在FPGA选型上,Xilinx Artix-7系列就完全够用,它的可编程逻辑单元和Block RAM资源足以承载我们的单周期处理器设计。所谓单周期,是指所有指令都在一个时钟周期内完成取指、译码、执行、访存和写回五个阶段。虽然这种设计会导致时钟频率受限于最慢指令(通常是lw),但对教学演示来说已经足够。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心模块设计与Verilog实现
2.1 指令存储器(InstMem)设计
指令存储器本质上就是个只读的ROM,我用Block RAM实现时踩过一个坑:初始时忘记给指令内存赋初值,导致处理器跑飞。后来用$readmemh加载指令才解决。下面是核心代码:
verilog复制module InstMem(
input wire ce,
input wire [31:0] addr,
output reg [31:0] data
);
reg [31:0] instmem [0:1023]; // 1KB指令存储器
always@(*)
if(ce == `RomDisable)
data = `Zero;
else
data = instmem[addr[11:2]]; // 按字寻址
initial begin
// 测试slt指令
instmem[6] = 32'b000000_00001_00010_00111_00000_101010; // slt R7,R1,R2
