计算机组成原理实验8,9,10:CPU设计

R型指令CPU设计

module R_CPU(
	input clk,rst,
	output reg [31:0]PC,
	output [31:0]new_PC,
	output [5:0] OP,func,
	output [4:0] rs,rt,rd,shamt,
	output reg [2:0] ALU_OP,
	output [31:0] ALU_F,A,B,
	output reg R_ZF,R_OF,
	output [31:0] Inst_code
    );
	 
	wire ZF,OF;
	reg Write_Reg;
	
	initial begin PC = 32'h0000_0000; end
	//更新PC
	assign new_PC = PC + 4;
	//clk信号下降沿打入new_PC的值,rst信号上升沿代表复位操作
	always @(negedge clk,posedge rst)
	begin
		if (rst)
			PC <= 32'h0000_0000;
		else
			PC <= new_PC;
	end
	
	Get_Inst your_instance_name (
	  .clka(clk), // input clka
	  .addra(PC[7:2]), // input [5 : 0] addra
	  .douta(Inst_code) // output [31 : 0] douta
	);	
	assign OP = 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];
	
	//ALU_OP信号的选择
	always@(*) begin
		ALU_OP = 3'b000;
		if(OP == 6'b000000)begin
			Write_Reg = 1'b1;
			case (func)
				6'b100000: begin ALU_OP=3'b100; end
				6'b100010: begin ALU_OP=3'b101; end
				6'b100100: begin ALU_OP=3'b000; end
				6'b100101: begin ALU_OP=3'b001; end
				6'b100110: begin ALU_OP=3'b010; end
				6'b100111: begin ALU_OP=3'b011; end
				6'b101011: begin ALU_OP=3'b110; end
				6'b000100: begin ALU_OP=3'b111; end			
			endcase
		 end
	 end
	
	Registor uu1(rs,rt,rd,Write_Reg,ALU_F,clk,rst,A,B);//clk信号下降沿数据写入
	ALU uu2(ALU_OP,A,B,ALU_F,ZF,OF);
	
	//在clk信号的下降沿将标志位打入标志寄存器
	initial begin 
		R_ZF = 1'b0;
		R_OF = 1'b0;
	end
	always @(negedge clk,posedge rst) begin
		if(rst) begin
			R_ZF <= 0;//默认情况下结果不为0
			R_OF <= 0;//默认情况下不溢出
		end
		else begin
			R_ZF <= ZF;
			R_OF <= OF;
		end
	end

endmodule

测试文件

module test;

	// Inputs
	reg clk;
	reg rst;

	// Outputs
	wire [31:0] PC;
	wire [31:0] new_PC;
	wire [5:0] OP;
	wire [5:0] func;
	wire [4:0] rs;
	wire [4:0] rt;
	wire [4:0] rd;
	wire [4:0] shamt;
	wire [2:0] ALU_OP;
	wire [31:0] ALU_F;
	wire [31:0] A;
	wire [31:0] B;
	wire R_ZF;
	wire R_OF;
	wire [31:0] Inst_code;

	// Instantiate the Unit Under Test (UUT)
	R_CPU uut (
		.clk(clk), 
		.rst(rst), 
		.PC(PC), 
		.new_PC(new_PC), 
		.OP(OP), 
		.func(func), 
		.rs(rs), 
		.rt(rt), 
		.rd(rd), 
		.shamt(shamt), 
		.ALU_OP(ALU_OP), 
		.ALU_F(ALU_F), 
		.A(A), 
		.B(B), 
		.R_ZF(R_ZF), 
		.R_OF(R_OF), 
		.Inst_code(Inst_code)
	);

	always #25 clk=~clk;
	initial begin
		clk = 0;
		rst = 0;
		//先将CPU进行复位
		#1 rst = 1;
		#1 rst = 0;
		
	end
      
endmodule

R-I型指令

module R_I_CPU(
	input clk,clk_D,rst,//clk_D信号传送到数据寄存器中,频率为主频2倍以上
	output reg [31:0] PC,
	output [31:0] new_PC,
	output [15:0] imm_offset,//I型指令中imm和offset字段
	output [5:0] OP,//指令中OP字段
	output [5:0] func,//R型指令func字段
	output [4:0] rs,//左操作数
	output [4:0] rt,//R型指令中为右操作数,I型指令中为目的寄存器
	output [4:0] rd,//R型指令中的目的寄存器
	output [4:0] shamt,//R型指令中的位移量
	output reg [2:0] ALU_OP,//运算控制信号
	output [31:0] A,B,//ALU的两个运算数
	output [31:0] ALU_F,//ALU的运算结果
	output reg [31:0] imm_data,//经扩展后的立即数
	output [31:0] R_Data_B,//寄存器B端读出
	output [31:0] W_Data,//写入寄存器的值;通过imm_s信号控制
	output reg R_ZF,R_OF,//标志寄存器
	output [31:0] M_R_Data,//数据存储器读出
	output [31:0] Inst_code,
	output [4:0] W_Addr,//
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值