计算机组成原理 取指令与指令译码实验
Posted Ice丨shine
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机组成原理 取指令与指令译码实验相关的知识,希望对你有一定的参考价值。
最终目标:设计一个单周期MIPS CPU 在指令周期(即时钟周期)clk上跳沿,执行取指令操作,在clk下跳沿更新PC值。 复位信号rst:=1时,PC清零,即指定MIPS CPU从0号主存开始执行程序。 生成只读的指令存储器时,使用Memory IP核,同上个实验,但是选择single port ROM;
实验代码:
module Inst(
input clk,
input rst,
output reg [31:0]PC,
output [31:0]PC_new,
output [31:0]Inst_code,
output [5:0]opcode,
output [5:0]func,
output [4:0]rs,
output [4:0]rt,
output [4:0]rd,
output [4:0]shamt,
output [15:0]imm,
output [15:0]address
);
initial PC = 32'h00000000;
assign PC_new = PC + 4;
ROM_A ROM1 (
.clka(clk), // input clka
.addra(PC[7:2]), // input [5 : 0] addra
.douta(Inst_code) // output [31 : 0] douta
);
always @(negedge clk or posedge rst)
begin
if (rst)
PC = 32'h00000000; //PC复位;
else
PC = PC_new; //PC更新为PC+4;
end;
assign opcode = Inst_code[31:26];
assign rs = Inst_code[25:21];
assign rt = Inst_code[20:16];
assign rd= Inst_code[15:11];
assign shamt = Inst_code[10:6];
assign func = Inst_code[5:0];
assign imm= Inst_code[15:0];
assign address = Inst_code[15:0];
endmodule
测试代码
module Inst_test;
// Inputs
reg clk;
reg rst;
// Outputs
wire [31:0] PC;
wire [31:0] PC_new;
wire [31:0] Inst_code;
wire [5:0] opcode;
wire [5:0] func;
wire [4:0] rs;
wire [4:0] rt;
wire [4:0] rd;
wire [4:0] shamt;
wire [15:0] imm;
wire [15:0] address;
// Instantiate the Unit Under Test (UUT)
Inst uut (
.clk(clk),
.rst(rst),
.PC(PC),
.PC_new(PC_new),
.Inst_code(Inst_code),
.opcode(opcode),
.func(func),
.rs(rs),
.rt(rt),
.rd(rd),
.shamt(shamt),
.imm(imm),
.address(address)
);
always begin
#3 clk=~clk;
end
initial begin
// Initialize Inputs
clk = 0;
rst = 0;
#10 rst=1;
#10 rst=0;
// Wait 100 ns for global reset to finish
// Add stimulus here
end
endmodule
波形
以上是关于计算机组成原理 取指令与指令译码实验的主要内容,如果未能解决你的问题,请参考以下文章