回 Jason 主站
MY_MIPS

单周期 MIPS 微处理器

华中科大 EIC 数字逻辑课程实验:8 模块 Verilog 设计 + ROM 汇编 + Vivado 仿真。

CPU 总览

单周期实现,每条指令 1 个 clock 完成 fetch / decode / execute / mem / writeback 全流程。数据通路连接 8 个模块。

模块详解

PC(程序计数器)

module pc(
    input clk, rst,
    input [31:0] next_pc,
    output reg [31:0] pc_out
);
    always @(posedge clk or posedge rst) begin
        if (rst) pc_out <= 32'h0;
        else pc_out <= next_pc;
    end
endmodule

IM(指令存储器) · DM(数据存储器)

IM 只读,存放 ROM 程序;DM 读写,按字节寻址 + 字对齐写入。

RegFile(寄存器堆)

32 × 32-bit 寄存器,双读端口 + 单写端口;$0 永远 0。

ALU

支持 ADD / SUB / AND / OR / XOR / SLT / SLL / SRL / SRA 9 种操作,由 4 位 op 码选择。

Control · SignExt · PCCalc

Control 译码 opcode/funct 产生控制信号;SignExt 16→32 位符号扩展;PCCalc 计算 PC+4 / branch / jump 地址。

指令集与 ROM 程序

支持的指令:lw / sw / add / sub / and / or / beq / j / jal / addi / sll。ROM 程序用 .coe 文件初始化,跑斐波那契数列前 10 项。

仿真验证

每个模块单独写 testbench;整体集成测试观察 PC、RegFile、DM 的波形变化。

踩坑 · 单周期下分支必须在 ID 阶段决定,否则 PC 会取错指令;本实现把 branch 判定放在 ALU 输出端用组合逻辑提前回写 next_pc。

实验心得

最大收获是搞清楚"指令周期"与"时钟周期"的关系,以及为什么单周期 CPU 的频率被最长路径限制(lw 要走 IM → RegFile → ALU → DM → RegFile,是关键路径)。