华科微机原理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机原理实验报告
课程:微机原理
指导老师
姓名:
学号:
实验名称:Lab 02: MIPS处理器部件实现A
微机原理实验报告
一、实验目的
本实验旨在实现MIPS处理器的部件—控制器和ALU,理解CPU控制器,理解ALU的原理,使用Verilog语言设计CPU控制器和ALU ,使用ISim进行行为仿真。
二、实验原理及说明
MIPS的基本架构如图1所示,包括Control,ALU这样的组合逻辑单元,也包括如instruction memory,Data memory和Registers file存储单元。本实验主要实现CPU Control和ALU两个部分。
(一)CPU控制器的实现
CPU Control单元输入为指令的opCode字段,即操作码;以及R指令的funct编码。操作码和Funct编码经过主控制单元的译码,给ALU,Data Memory,Registers ,Muxs等部件输出正确的控制信号。
图2. MIPS基本指令格式
图: 控制模块的IO定义
注:Jump指令编码是000010,Jump输出信号为1,其他输出信号都为0
图3. OpCode与控制输出的编码关系
图4. Funct,ALUOp与ALU Control编码关系
(二) ALU的实现
ALU是CPU核心的计算单元,实现诸如加,减,或,与等操作。
算术操作的编码
三、实验verilog代码
(一)CPU控制器的实现
module Ctr(
input [5:0] OpCode,
input [5:0] Funct,
output regRegDst,
output regALUSrc,
output regRegWrite,
output regMemWrite,
output regMemRead,
output regMemtoReg,
output reg Branch,
output reg Jump,
output reg [3:0] ALUControl
);
reg [1:0] ALUOp;
always @(OpCode)
begin
case(OpCode)
//R type
6'b000000:
begin
RegDst=1; ALUSrc=0; RegWrite=1; MemWrite=0; MemRead=0; MemtoReg=0;
Branch=0;
ALUOp=2'b10; Jump=0;
end
//beq
6'b000100:
begin
RegDst=1'bx; ALUSrc=0; RegWrite=0; MemWrite=0; MemRead=0; MemtoReg=1'bx; Branch=1;
ALUOp=2'b01; Jump=0;
end
//lw
6'b100011:
begin
RegDst=0; ALUSrc=1; RegWrite=1; MemWrite=0; MemRead=1; MemtoReg=1;
Branch=0;
ALUOp=2'b00; Jump=0;
end
//sw
6'b101011:
begin
RegDst=1'bx;
ALUSrc=1;
RegWrite=0;
MemWrite=1;
MemRead=0;
MemtoReg=1'bx;
Branch=0;
ALUOp=2'b00;
Jump=0;
end
//Jump
6'b000010:
begin
RegDst=0;
ALUSrc=0;
MemtoReg=0;
RegWrite=0;
MemRead=0;
MemWrite=0;
Branch=0;
ALUOp=2'b00;
Jump=1;
end
endcase
end
always @(ALUOp or Funct)
begin
casex({ALUOp,Funct})
8'b00xxxxxx: ALUControl=4'b0010;
8'b01xxxxxx: ALUControl=4'b0110;
8'b1xxx0000: ALUControl=4'b0010;
8'b1xxx0010: ALUControl=4'b0110;
8'b1xxx0100: ALUControl=4'b0000;
8'b1xxx0101: ALUControl=4'b0001;
8'b1xxx1010: ALUControl=4'b0111;
default: ALUControl=4'b0000;
endcase
end
endmodule
(二) ALU的实现
module ALU(
input [31:0] SrcA,
input [31:0] SrcB,
input [3:0] ALUCtr,
output Zero,
output reg [31:0] ALURes
);
assign Zero=(ALURes==1'b0);
always @(SrcA or SrcB or ALUCtr)
begin
case(ALUCtr)
4'b0000: ALURes=SrcA&SrcB; //AND
4'b0001: ALURes=SrcA | SrcB; //OR
4'b0010: ALURes=SrcA + SrcB; //add
4'b0110: ALURes=SrcA - SrcB; //substract
4'b0111: ALURes=SrcA default ALURes=32'h0; endcase end endmodule 四、仿真测试 1.代码 (一)CPU控制器的实现 module Ctr_tb; // Inputs reg [5:0] OpCode; reg [5:0] Funct; // Outputs wire RegDst; wire ALUSrc; wire RegWrite; wire MemWrite; wire MemRead; wire MemtoReg; wire Branch; wire Jump; wire [3:0] ALUControl; // Instantiate the Unit Under Test (UUT) Ctruut (