计算机组成原理 取指令与指令译码实验

计算机组成原理 取指令与指令译码实验_第1张图片
计算机组成原理 取指令与指令译码实验_第2张图片
最终目标:设计一个单周期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

波形
计算机组成原理 取指令与指令译码实验_第3张图片

你可能感兴趣的:(数字电路,verilog)