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型指令的控制信号一致。


浙公网安备 33010602011771号