计算机组成原理实验报告单周期CPU的设计与实现.docx

上传人:b****1 文档编号:22794766 上传时间:2023-04-28 格式:DOCX 页数:49 大小:526.54KB
下载 相关 举报
计算机组成原理实验报告单周期CPU的设计与实现.docx_第1页
第1页 / 共49页
计算机组成原理实验报告单周期CPU的设计与实现.docx_第2页
第2页 / 共49页
计算机组成原理实验报告单周期CPU的设计与实现.docx_第3页
第3页 / 共49页
计算机组成原理实验报告单周期CPU的设计与实现.docx_第4页
第4页 / 共49页
计算机组成原理实验报告单周期CPU的设计与实现.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

计算机组成原理实验报告单周期CPU的设计与实现.docx

《计算机组成原理实验报告单周期CPU的设计与实现.docx》由会员分享,可在线阅读,更多相关《计算机组成原理实验报告单周期CPU的设计与实现.docx(49页珍藏版)》请在冰豆网上搜索。

计算机组成原理实验报告单周期CPU的设计与实现.docx

计算机组成原理实验报告单周期CPU的设计与实现

电子科技大学计算机科学与工程学院

 

标准实验报告

 

(实验)课程名称:

计算机组成原理实验

 

电子科技大学教务处制表

 

电子科技大学

实验报告

实验地点:

主楼A2-411实验时间:

12周-15周

一、实验室名称:

主楼A2-411

二、实验项目名称:

单周期CPU的设计与实现。

三、实验学时:

8学时

四、实验原理:

(一)概述

单周期(SingleCycle)CPU是指CPU从取出1条指令到执行完该指令只需1个时钟周期。

一条指令的执行过程包括:

取指令→分析指令→取操作数→执行指令→保存结果。

对于单周期CPU来说,这些执行步骤均在一个时钟周期内完成。

(二)单周期cpu总体电路

本实验所设计的单周期CPU的总体电路结构如下。

(三)MIPS指令格式化

MIPS指令系统结构有MIPS-32和MIPS-64两种。

本实验的MIPS指令选用MIPS-32。

以下所说的MIPS指令均指MIPS-32。

MIPS的指令格式为32位。

下图给出MIPS指令的3种格式。

本实验只选取了9条典型的MIPS指令来描述CPU逻辑电路的设计方法。

下图列出了本实验的所涉及到的9条MIPS指令。

五、实验目的

1、掌握单周期CPU的工作原理、实现方法及其组成部件的原理和设计方法,如控制器、运算器等。

 

2、认识和掌握指令与CPU的关系、指令的执行过程。

 

3、熟练使用硬件描述语言Verilog、EDA工具软件进行软件设计与仿真,以培养学生的分析和设计CPU的能力。

六、实验内容

(一)拟定本实验的指令系统,指令应包含R型指令、I型指令和J型指令,指令数为9条。

(二)CPU各功能模块的设计与实现。

(三)对设计的各个模块的仿真测试。

(四)整个CPU的封装与测试。

七、实验器材(设备、元器件):

(一)

(二)FPGA开发板:

AnvylSpartan6/XC6SLX45

(三)计算机与FPGA开发板通过JTAG(JointTestActionGroup)接口连接,其连接方式如图所示。

八、实验步骤

一个CPU主要由ALU(运算器)、控制器、寄存器堆、取指部件及其它基本功能部件等构成。

 

在本实验中基本功能部件主要有:

32位2选1多路选择器、5位2选1多路选择器、32位寄存器堆、ALU等。

(一)新建工程(NewProject)

启动软件,然后选择菜单File→NewProject,弹出NewProjectWizard对话框,在对话框中输入工程名CPU,并指定工作路径D:

\Single_Cycle_CPU。

(二)基本功能器件的设计与实现

(1)多路选择器的设计与实现

a.5位2选1多路选择器(MUX5_2_1)的设计与实现

在ISE集成开发环境中,在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择NewSource命令,创建一个VerilogModule模块,名称为:

MUX5_2_1,然后输入其实现代码:

moduleMUX5_2_1(

input[4:

0]A,

input[4:

0]B,

inputSel,

output[4:

0]O

);

assignO=Sel?

B:

A;

endmodule

在ISE集成开发环境中,对模块MUX5_2_1进行综合(Synthesize),综合结果如图所示:

在ISE集成开发环境中,对模块MUX5_2_1进行仿真(Simulation)。

输入如下测式代码:

moduleMUX5_2_1_T;

//Inputs

reg[4:

0]A;

reg[4:

0]B;

regsel;

//Outputs

wire[4:

0]C;

//InstantiatetheUnitUnderTest(UUT)

MUX5_2_1uut(

.A(A),

.B(B),

.sel(sel),

.C(C)

);

initialbegin

//InitializeInputs

A=0;

B=0;

sel=0;

//Wait100nsforglobalresettofinish

#100;

A=5'b10100;

B=0;

sel=1;

//Wait100nsforglobalresettofinish

#100;

A=1;

B=5'b10000;

sel=0;

//Wait100nsforglobalresettofinish

#100;

A=5'b00000;

B=5'b11000;

sel=1;

//Addstimulushere

end

endmodule

然后进行仿真,仿真结果如图所示:

b.32位2选1多路选择器的设计与实现

在ISE集成开发环境中,在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择NewSource命令,创建一个VerilogModule模块,名称为:

MUX32_2_1,然后输入其实现代码:

moduleMUX32_2_1(

input[31:

0]A,

input[31:

0]B,

inputsel,

output[31:

0]O

);

assignO=sel?

B:

A;

endmodule

在ISE集成开发环境中,对模块MUX32_2_1进行综合(Synthesize),综合结果如图所示:

在ISE集成开发环境中,对模块MUX32_2_1进行仿真(Simulation)。

首先输入如下测式代码:

moduleMUX32_2_1_T;

//Inputs

reg[31:

0]A;

reg[31:

0]B;

regsel;

//Outputs

wire[31:

0]O;

//InstantiatetheUnitUnderTest(UUT)

MUX32_2_1uut(

.A(A),

.B(B),

.sel(sel),

.O(O)

);

initialbegin

A=0;

B=0;

sel=0;

//Wait100nsforglobalresettofinish

#100;

A=32'h00000001;

B=32'h00000000;

sel=1;

#100;

A=32'h00000101;

B=32'h00000010;

sel=0;

//Addstimulushere

end

endmodule

然后进行仿真,仿真结果如图所示:

(2)符号扩展(Sign_Extender)的设计与实现

在ISE集成开发环境中,在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择NewSource命令,创建一个VerilogModule模块,名称为:

Sign_Extender,然后输入其实现代码:

moduleSign_Extender(

input[15:

0]d,

output[31:

0]o

);

assigno=(d[15:

15]==1'b0)?

{16'b0,d[15:

0]}:

{16'b1,d[15:

0]};

endmodule

在ISE集成开发环境中,对模块Sign_Extender进行综合(Synthesize),综合结果如图所示。

在ISE集成开发环境中,对模块MUX32_2_1进行仿真(Simulation)。

首先输入如下测式代码:

moduleSign_Extender_t;

//Inputs

reg[15:

0]d;

//Outputs

wire[31:

0]o;

//InstantiatetheUnitUnderTest(UUT)

Sign_Extenderuut(

.d(d),

.o(o)

);

initialbegin

//InitializeInputs

d=0;

//Wait100nsforglobalresettofinish

#100;

//Addstimulushere

d=16'h0011;

#100;

d=16'h1011;

end

endmodule

然后进行仿真,仿真结果如图所示:

(3)32位寄存器堆(RegFile)的设计与实现

在ISE集成开发环境中,在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择NewSource命令,创建一个VerilogModule模块,名称为:

RegFile,然后输入其实现代码:

moduleRegFile(

input[4:

0]Rn1,Rn2,Wn,

inputWrite,

input[31:

0]Wd,

output[31:

0]A,B,

inputClock

);

reg[31:

0]Register[1:

31];

assignA=(Rn1==0)?

0:

Register[Rn1];

assignB=(Rn2==0)?

0:

Register[Rn2];

always@(posedgeClock)begin

if(Write&&Wn!

=0)

Register[Wn]<=Wd;

end

endmodule

在ISE集成开发环境中,对模块RegFile进行综合(Synthesize),综合结果如图所示。

在ISE集成开发环境中,对模块RegFile进行仿真(Simulation)。

输入如下测式代码:

moduleRegfile_t;

//Inputs

reg[4:

0]Rn1;

reg[4:

0]Rn2;

reg[4:

0]Wn;

regWrite;

reg[31:

0]Wd;

regClock;

//Outputs

wire[31:

0]A;

wire[31:

0]B;

//InstantiatetheUnitUnderTest(UUT)

RegFileuut(

.Rn1(Rn1),

.Rn2(Rn2),

.Wn(Wn),

.Write(Write),

.Wd(Wd),

.A(A),

.B(B),

.Clock(Clock)

);

initialbegin

//InitializeInputs

Rn1=0;

Rn2=0;

Wn=0;

Write=0;

Wd=0;

Clock=0;

//Wait100nsforglobalresettofinish

#100;

Rn1=5'b00001;

Rn2=5'b00001;

Wn=5'b00001;

Write=1;

Wd=0;

Clock=0;

#100;

Clock=1;

#50;

Wd=32'hBBBBBBBB;

#50;

Clock=0;

#100;

Clock=1;

#100

Clock=0;

//Addstimulushere

end

endmodule

然后进行仿真,仿真结果如图所示:

(4)运算器(ALU)设计与实现

在ISE集成开发环境中,在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择NewSource命令,创建一个VerilogModule模块,名称为:

ALU,然后输入其实现代码:

moduleALU(

input[31:

0]A,B,

input[2:

0]ALU_operation,

output[31:

0]Result,

outputZero

);

assignResult=(ALU_operation==3'b000)?

A+B:

(ALU_operation==3'b100)?

A-B:

(ALU_operation==3'b001)?

A&B:

(ALU_operation==3'b101)?

A|B:

(ALU_operation==3'b010)?

A^B:

(ALU_operation==3'b110)?

{B[15:

0],16'h0}:

32'hxxxxxxxx;

assignZero=~|Result;

endmodule

在ISE集成开发环境中,对模块ALU进行综合(Synthesize),综合结果如图所示:

在ISE集成开发环境中,对模块ALU进行仿真(Simulation)。

输入如下测式代码:

moduleALU_tb;

//Inputs

reg[31:

0]A;

reg[31:

0]B;

reg[2:

0]ALU_operation;

//Outputs

wire[31:

0]Result;

wireZero;

//InstantiatetheUnitUnderTest(UUT)

ALUuut(

.A(A),

.B(B),

.ALU_operation(ALU_operation),

.Result(Result),

.Zero(Zero)

);

initialbegin

//InitializeInputs

A=0;

B=0;

ALU_operation=0;

//Wait100nsforglobalresettofinish

#100;

A=1;

B=1;

ALU_operation=0;

//Addstimulushere

#100

A=2;

B=2;

ALU_operation=4;

#100

A=1;

B=1;

ALU_operation=1;

#100

A=1;

B=1;

ALU_operation=5;

#100

A=1;

B=1;

ALU_operation=2;

 

end

endmodule

然后进行仿真,仿真结果如图所示:

(5)控制器(Controller)的设计与实现

为了简化设计,控制器由控制单元Control和控制单元ALUop组成,控制器结构如下所示。

a.Control的设计与实现

在ISE集成开发环境中,在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择NewSource命令,创建一个VerilogModule模块,名称为:

Control,然后输入其实现代码:

moduleControl(

input[5:

0]op,

outputRegDst,

outputRegWrite,

outputALUSrc,

outputMemWrite,

outputMemRead,

outputMemtoReg,

outputBranch,

output[1:

0]ALUctr

);

wirei_Rt=~|op;

wirei_Lw=op[5]&~op[3];

wirei_Sw=op[5]&op[3];

wirei_Beq=op[2]&~op[1];

wirei_Lui=op[3]&op[2];

assignRegDst=i_Rt;

assignRegWrite=i_Rt|i_Lw|i_Lui;

assignALUSrc=i_Lw|i_Sw|i_Lui;

assignMemWrite=i_Sw;

assignMemRead=i_Lw;

assignMemtoReg=i_Lw;

assignBranch=i_Beq;

assignALUctr[1]=i_Rt|i_Lui;

assignALUctr[0]=i_Beq|i_Lui;

 

endmodule

在ISE集成开发环境中,对模块Control进行综合(Synthesize),综合结果如图:

在ISE集成开发环境中,对模块Control进行仿真(Simulation)。

首先输入如下测式代码:

moduleControl_tb;

//Inputs

reg[5:

0]op;

//Outputs

wireRegDst;

wireRegWrite;

wireALUSrc;

wireMemWrite;

wireMemRead;

wireMemtoReg;

wireBranch;

wire[1:

0]ALUctr;

//InstantiatetheUnitUnderTest(UUT)

Controluut(

.op(op),

.RegDst(RegDst),

.RegWrite(RegWrite),

.ALUSrc(ALUSrc),

.MemWrite(MemWrite),

.MemRead(MemRead),

.MemtoReg(MemtoReg),

.Branch(Branch),

.ALUctr(ALUctr)

);

initialbegin

//InitializeInputs

op=0;

//Wait100nsforglobalresettofinish

#100;

op=6'b000000;

#100;

op=6'b100011;

#100;

op=6'b101011;

#100;

op=6'b000100;

#100;

op=6'b001111;

end

endmodule

然后进行仿真,仿真结果如图所示:

b.ALUop的设计与实现

在ISE集成开发环境中,在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择NewSource命令,创建一个VerilogModule模块,名称为:

ALUop,然后输入其实现代码:

moduleALUop(

input[5:

0]func,

input[1:

0]ALUctr,

output[2:

0]ALU_op

);

wirei_Rt=ALUctr[1]&~ALUctr[0];

assignALU_op[2]=(i_Rt&((~func[2]&func[1])|(func[2]&func[0])))|ALUctr[0];

assignALU_op[1]=(i_Rt&func[2]&func[1])|(ALUctr[1]&ALUctr[0]);

assignALU_op[0]=(i_Rt&func[2]&~func[1]);

endmodule

在ISE集成开发环境中,对模块ALUop进行综合(Synthesize),综合结果如图:

在ISE集成开发环境中,对模块ALUop进行仿真(Simulation)。

首先输入如下测式代码:

moduleALU_tb;

//Inputs

reg[31:

0]A;

reg[31:

0]B;

reg[2:

0]ALU_operation;

//Outputs

wire[31:

0]Result;

wireZero;

//InstantiatetheUnitUnderTest(UUT)

ALUuut(

.A(A),

.B(B),

.ALU_operation(ALU_operation),

.Result(Result),

.Zero(Zero)

);

initialbegin

//InitializeInputs

A=0;

B=0;

ALU_operation=0;

//Wait100nsforglobalresettofinish

#100;

A=1;

B=1;

ALU_operation=0;

//Addstimulushere

#100

A=2;

B=2;

ALU_operation=4;

#100

A=1;

B=1;

ALU_operation=1;

#100

A=1;

B=1;

ALU_operation=5;

#100

A=1;

B=1;

ALU_operation=2;

 

end

endmodule

然后进行仿真,仿真结果如图所:

c.将Control与ALUop封装成Controller

在ISE集成开发环境中,在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择NewSource命令,创建一个VerilogModule模块,名称为:

Controller,然后输入其实现代码:

moduleController(

input[5:

0]op,

input[5:

0]func,

outputRegDst,

outputRegWrite,

outputALUSrc,

outputMemWrite,

outputMemRead,

outputMemtoReg,

outputBranch,

output[2:

0]ALU_op

);

wire[1:

0]ALUctr;

ControlU0(op,RegDst,RegWrite,ALUSrc,MemWrite,MemRead,MemtoReg,Branch,ALUctr);

ALUopU1(func,ALUctr,ALU_op);

endmodule

在ISE集成开发环境中,对模块Controller进行综合(Synthesize),综合结果如图:

在ISE集成开发环境中,对模块Controller进行仿真(Simulation)。

首先输入如下测式代码:

moduleController_tb;

//Inputs

reg[5:

0]op;

reg[5:

0]func;

//Outputs

wireRegDst;

wireRegWrite;

wireALUSrc;

wireMemWrite;

wireMemRead;

wireMemtoReg;

wireBranch;

wire[2:

0]ALU_op;

//Instantiateth

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1