0418 --- 经过努力,终于有所成

前言

之前多次想到要放弃
然而放弃并不能带来什么,只会让自己更加堕落。
于是我选择开始一点点慢慢做项目,把难的问题分解成小的简单的问题。

我分了好几次,把组件一点点加入到datapath里
下面的代码是含有 程序计数器PC, 指令存储器imem, 控制单元 mainDecoder的半成品

`timescale 1ns / 1ps


module mips_datapath(
    input wire clk,          // 时钟信号
    input wire reset         // 复位信号
);

    // 信号声明
    wire [31:0] PC;           // 程序计数器
    wire [31:0] PCPlus4;     // PC + 4
    wire [31:0] Instruction; // 指令
    wire [31:0] ReadData1, ReadData2; // 寄存器文件读取数据
    wire [31:0] SignImm;     // 符号扩展后的立即数
    wire [31:0] ALUResult;   // ALU结果
    wire [31:0] WriteData;   // 写入数据
    wire [4:0] WriteReg;     // 写入寄存器地址
    wire [2:0] ALUControl;   // ALU控制信号
    wire Zero;               // ALU结果是否为0
    wire Mem2Reg, MemWrite, RegWrite,branch,aluSrc,RegDst; // 控制信号
    wire [1:0] ALUOp;        // ALU操作码
    wire [5:0] Opcode;       // 指令操作码
    wire [5:0] Funct;        // 指令功能码

    // 模块实例化
    pc pc1(.clk(clk), .reset(reset), .in(PCPlus4), .out(PC));
    pcPlus4 pcPlus4_1(.in(PC), .out(PCPlus4));
    instMem imem(.addr(PC), .inst(Instruction));
   

    // 控制单元
    mainDecoder mdec(.opcode(Opcode), .Mem2Reg(Mem2Reg), .MemWrite(MemWrite), 
                     .Branch(branch), .ALUSrc(aluSrc), .RegDst(RegDst),
                     .RegWrite(RegWrite), .ALUOp(ALUOp));

    // 从指令中提取Opcode和Funct
    assign Opcode = Instruction[31:26];
    assign Funct = Instruction[5:0];




endmodule

我在仿真模块的代码里,让指令存储器存储了一条 add 指令

// 初始化指令存储器
    initial begin
        // 指令存储器的初始内容
        uut.imem.memory[0] = 32'h00000000; // 0x00000000: nop
        uut.imem.memory[1] = 32'h012a4020; // 0x00000004: add $t0, $t1, $t2
    end

这是从《数字设计和计算机体系结构》第七章微体系结构,里面截取的关于R型指令的数据通路。

注意看 RegWrite,RegDst, ALUSrc,ALUControl, MemWrite,Mem2Reg 这几条 控制信号

下面的仿真,是主译码单元的控制信号输出,可以看到和上面的R型指令的控制信号一致。

posted @ 2025-04-18 11:02  lucky_doog  阅读(30)  评论(0)    收藏  举报