#计组实验#多周期CPU设计

本文介绍了使用Verilog语言设计一个多周期CPU的过程,展示了一段CPUrunner模块的代码,包括内部信号定义和接口。虽然没有提供完整的指令分析和波形图,但鼓励读者自行完成这部分工作,以提高动手能力。
摘要由CSDN通过智能技术生成

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

// PCd模块的代码
module PC(
    // input
    input clk,
    input reset,
    input PCWre,
    input [31:0] immediate, addrFromReg,
    input [25:0] addrFromJ,
    input [1:0] selectSignal,
    // output
    output reg[31:0] addr,
    output [31:0] pc4
    );

   // reg[27:0] tmp;
    integer i;
   assign pc4 = addr + 4;
    always @(negedge clk) begin 
    // always @(selectSignal or PCWre or negedge reset) begin 
        if(reset == 0) begin
            addr <= 0; // Reset,指令地址初值为0
        end else if(PCWre) begin
            // pc4 = addr + 4;
            case(selectSignal)
                2'b00: addr = addr + 4;
                2'b01: addr = addr + 4 + immediate * 4;
                2'b10: addr = addrFromReg;
                2'b11:begin
                       // $display("when triggled pc4", pc4);
                        addr[0] = 0;
                        addr[1] = 0;
                        for(i = 0; i < 26; i = i + 1) begin
                            addr[i+2] = addrFromJ[i];
                        end
                        for(i = 27; i< 32; i = i + 1) begin
                            addr[i] = pc4[i];
                        end
                         $display("when triggled addr", addr);
                      end
                default: begin end
            endcase
        end
        $display("curPC: ", addr, "nextPC:", pc4);
    end
endmodule

这里写图片描述

module InstructionMemory(
    input [31:0] Iaddr, // 指令存储器地址输入端口
    // input [31:0] IDataIn,  // 指令存储器数据输入端口(指令代码输入端口)
    input RW,      // 指令存储器读写控制信号,为1读,为0写
    output reg[31:0] IDataOut // 指令存储器数据输出端口(指令代码输出端口)
    );

    reg[7:0] storage [127:0];

     always @(RW or Iaddr ) begin
           if(RW == 0) begin //write
            /* 本次实验不需要用到写指令功能
               storage[Iaddr] <= IDataIn[7:0];
               storage[Iaddr + 1] <= IDataIn[15:8];
               storage[Iaddr + 2] <= IDataIn[23:16];
               storage[Iaddr + 3] <= IDataIn[31:24];
            */
               end
           else begin // read
               IDataOut[7:0] <= storage[Iaddr + 3];
               IDataOut[15:8] <= storage[Iaddr + 2];
               IDataOut[23:16] <= storage[Iaddr + 1];
               IDataOut[31:24] <= storage[Iaddr];
                end  
       end

       initial begin
             $readmemb("F:/ECOP_Experiment/MultiCycleCPU/ins.txt",storage);
       end
endmodule

这里写图片描述

module IR(
    input [31:0] inData,
    input clk, IRWre,
    output reg[31:0] outData
);

reg[31:0] storage;
always @(posedge clk) begin 
    if(IRWre ==
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值