杭电计组实验9-实现R-I型指令地CPU设计实验

文章描述:-2022年4月14日发(作者:曾世麟)***实验报告2018年姓名6月1阳光男日学号课程名称张翔老师班级成绩:专业计算机科学与技术张翔老师/6/2指导老师实验名称实验地点《计算机组成原理与系统结构试验》机位号无任课老师实验序号实验时间《实验九实现R-I型指令的CPU设计实验》1教221实验设备号个人电脑一、实验程序源代码顶层RI型指令CPU模块测试文件:

-

杭电计组实验9-实现R-I型指令地CPU设计实验
2022年4月14日发
(作者:曾世麟)

***

实验报告

2018年

姓名

6月1

阳光男

学号16041321

课程名称

张翔老师

班级

成绩:

16052317

专业计算机科学与技术

张翔老师

9

2018/6/2

指导老

实验名

实验地

《计算机组成原理与系统结构

试验》

机位号

任课老

实验序

实验时

《实验九实现R-I型指令的CPU设计实验》

1教221

实验设

备号

个人电脑

一、实验程序源代码

顶层RI型指令CPU模块测试文件:

moduletest;

//Inputs

regrst;

regclk;

//Outputs

wireZF;

wireOF;

wire[31:0]F;

wire[31:0]M_R_Data;

//InstantiatetheUnitUnderTest(UUT)

TOP_RI_CPUuut(

.rst(rst),

.clk(clk),

.ZF(ZF),

.OF(OF),

.F(F),

***

***

.M_R_Data(M_R_Data)

);

initialbegin

//InitializeInputs

rst=0;

clk=0;

//Wait100nsforglobalresettofinish

#100;

clk=1;

//Addstimulushere

forever

begin

#50;

clk=~clk;

end

end

endmodule

顶层LED验证模块:

moduleTOP_LED(clk_100MHz,oclk,rst,SW,LED);

inputclk_100MHz;

inputoclk,rst;

input[3:0]SW;

outputreg[7:0]LED;

wirerclk;

wireZF,OF;

wire[31:0]F;

wire[31:0]M_R_Data;

xiaodoudoudong(clk_100MHz,oclk,rclk);

TOP_RI_CPU(clk_100MHz,rst,rclk,ZF,OF,F,M_R_Data);

***

***

always@(*)

begin

case(SW)

3'b0000:LED=F[7:0];

3'b0001:LED=F[15:8];

3'b0010:LED=F[23:16];

3'b0011:LED=F[31:24];

3'b0100:LED=M_R_Data[7:0];

3'b0101:LED=M_R_Data[15:8];

3'b0110:LED=M_R_Data[23:16];

3'b0111:LED=M_R_Data[31:24];

3'b1111:beginLED[7:2]=0;LED[1]=OF;LED[0]=ZF;end

default:LED=0;

endcase

end

endmodule

顶层RI型指令CPU模块

moduleTOP_RI_CPU(inputrst,inputclk,outputZF,outputOF,output[31:0]F,output

[31:0]M_R_Data);

wireWrite_Reg;

wire[31:0]Inst_code;

wire[4:0]rs;

wire[4:0]rt;

wire[4:0]rd;

wire[31:0]rs_data;

wire[31:0]rt_data;

wire[31:0]rd_data;

wire[31:0]imm_data;

wire[15:0]imm;

wirerd_rt_s;

wireimm_s;

wireMem_Write;

wirealu_mem_s;

***

***

wire[31:0]W_Addr;

wire[31:0]W_Data;

wire[31:0]R_Data_A;

wire[31:0]R_Data_B;

wire[31:0]F;

wire[31:0]ALU_B;

wire[2:0]ALU_OP;

pcpc_connect(clk,rst,Inst_code);

OP_YIMA

op(Inst_code,ALU_OP,rs,rt,rd,Write_Reg,imm,rd_rt_s,imm_s,rt_imm_s,Mem_Write,alu_mem_s);

assignW_Addr=(rd_rt_s)?rt:rd;

assignimm_data=(imm_s)?{{16{imm[15]}},imm}:{{16{1'b0}},imm};

Register_fileR_connect(rs,rt,W_Addr,Write_Reg,W_Data,~clk,rst,R_Data_A,R_Data_B);

assignALU_B=(rt_imm_s)?imm_data:R_Data_B;

ALUALU_connect(R_Data_A,ALU_B,F,ALU_OP,ZF,OF);

wireclk_tmp;

wired_outn;

regd_out=0;

assignclk_tmp=clk^d_out;

assignd_outn=~d_out;

always@(posedgeclk_tmp)

begin

d_out<=d_outn;

end

RAM_BData_Mem(

.clka(clk_tmp),//inputclka

.wea(Mem_Write),//input[0:0]wea

.addra(F[5:0]),//input[5:0]addra

.dina(R_Data_B),//input[31:0]dina

.douta(M_R_Data)//output[31:0]douta

);

assignW_Data=alu_mem_s?M_R_Data:F;

endmodule

***

***

PC取指令模块:

modulepc(inputclk,inputrst,output[31:0]Inst_code);

reg[31:0]PC;

wire[31:0]PC_new;

initial

PC<=32'h00000000;

Inst_ROMInst_ROM1(

.clka(clk),

.addra(PC[7:2]),

.douta(Inst_code)

);

assignPC_new=PC+4;

always@(negedgeclkorposedgerst)

begin

if(rst)

PC=32'h00000000;

else

PC={24'h000000,PC_new[7:0]};

end

endmodule

OP指令功能译码模块

moduleOP_YIMA(inst,ALU_OP,rs,rt,rd,Write_Reg,

imm,rd_rt_s,imm_s,rt_imm_s,Mem_Write,alu_mem_s);

input[31:0]inst;

outputreg[2:0]ALU_OP;

outputreg[4:0]rs;

outputreg[4:0]rt;

outputreg[4:0]rd;

outputregWrite_Reg;

outputreg[15:0]imm;

outputregrd_rt_s;

outputregimm_s;

outputregrt_imm_s;

***

***

outputregMem_Write;

outputregalu_mem_s;

always@(*)

begin

//R型指令

if(inst[31:26]==6'b000000)

begin

rd=inst[15:11];

rt=inst[20:16];

rs=inst[25:21];

alu_mem_s=0;

Mem_Write=0;

rd_rt_s=0;

rt_imm_s=0;

Write_Reg=(inst[5:0]==0)?1'b0:1'b1;

case(inst[5:0])

6'b100000:ALU_OP=3'b100;

6'b100010:ALU_OP=3'b101;

6'b100100:ALU_OP=3'b000;

6'b100101:ALU_OP=3'b001;

6'b100110:ALU_OP=3'b010;

6'b100111:ALU_OP=3'b011;

6'b101011:ALU_OP=3'b110;

6'b000100:ALU_OP=3'b111;

endcase

end

//I型立即数寻址指令

if(inst[31:29]==3'b001)

begin

imm=inst[15:0];

rt=inst[20:16];

rs=inst[25:21];

Mem_Write=0;

rd_rt_s=1;

***

***

rt_imm_s=1;

alu_mem_s=0;

Write_Reg=1;

case(inst[31:26])

6'b001000:beginimm_s=1;ALU_OP=3'b100;end

6'b001100:beginimm_s=0;ALU_OP=3'b000;end

6'b001110:beginimm_s=0;ALU_OP=3'b010;end

6'b001011:beginimm_s=0;ALU_OP=3'b110;end

endcase

end

//I型取数/存数指令

if((inst[31:30]==2'b10)&&(inst[28:26]==3'b011))

begin

imm=inst[15:0];

rt=inst[20:16];

rs=inst[25:21];

rd_rt_s=1;

rt_imm_s=1;

imm_s=1;

case(inst[31:26])

6'b100011:beginalu_mem_s=1;Mem_Write=0;Write_Reg=1;ALU_OP=3'b100;end

6'b101011:beginMem_Write=1;Write_Reg=0;ALU_OP=3'b100;end

endcase

end

end

endmodule

寄存器堆模块:

Module

Register_file(R_Addr_A,R_Addr_B,W_Addr,Write_Reg,W_Data,Clk,Reset,R_Data_A,R_Data_B);

input[4:0]R_Addr_A;

input[4:0]R_Addr_B;

input[4:0]W_Addr;

inputWrite_Reg;

***

***

input[31:0]W_Data;

inputClk;

inputReset;

output[31:0]R_Data_A;

output[31:0]R_Data_B;

reg[31:0]REG_Files[0:31];

reg[5:0]i;

initial//仿真过程中的初始化

begin

for(i=0;i<=31;i=i+1)

REG_Files[i]=0;

end

assignR_Data_A=REG_Files[R_Addr_A];

assignR_Data_B=REG_Files[R_Addr_B];

always@(posedgeClkorposedgeReset)

begin

if(Reset)

for(i=0;i<=31;i=i+1)

REG_Files[i]=0;

else

if(Write_Reg&&W_Addr!=0)

REG_Files[W_Addr]=W_Data;

end

endmodule

ALU运算模块:

moduleALU(A,B,F,ALU_OP,ZF,OF);

input[31:0]A,B;

input[2:0]ALU_OP;

outputregZF,OF;

outputreg[31:0]F;

regC32;

always@(*)

begin

***

***

OF=1'b0;

C32=1'b0;

case(ALU_OP)

3'b000:F=A&B;

3'b001:F=A|B;

3'b010:F=A^B;

3'b011:F=~(A^B);

3'b100:begin{C32,F}=A+B;OF=A[31]^B[31]^F[31]^C32;end

3'b101:begin{C32,F}=A-B;OF=A[31]^B[31]^F[31]^C32;end

3'b110:

if(A

F=1;

else

F=0;

3'b111:F=B<

endcase

if(F==0)

ZF=1;

else

ZF=0;

end

endmodule

时钟按键消抖代码:

modulexiaodou(

inputclk_100MHz,

inputBT,

outputregBT_Out

);

regBT1,BT2;

wireBT_Down;

reg[21:0]cnt;

regBT_20ms_1,BT_20ms_2;

wireBT_Up;

***

***

always@(posedgeclk_100MHz)

begin

BT1<=BT;

BT2<=BT1;

end

assignBT_Down=(~BT2)&&BT1;从//0到1的跳变

always@(posedgeclk_100MHz)

begin

if(BT_Down)

begin

cnt<=22'b0;

BT_Out<=1'b1;

end

elsecnt<=cnt+1'b1;

if(cnt==22'h20000)BT_20ms_1<=BT;

BT_20ms_2<=BT_20ms_1;

if(BT_Up)BT_Out<=1'b0;

end

assignBT_Up=BT_20ms_2&&(~BT_20ms_1从);//1到0

endmodule

二、仿真波形

***

***

三、电路图

***

***

顶层电路模块

顶层电路内部结构

四、引脚配置(约束文件)

ET"LED[7]"LOC=T11;

ET"LED[6]"LOC=R11;

ET"LED[5]"LOC=11;

ET"LED[4]"LOC=M11;

***

***

ET"LED[3]"LOC=V15;

ET"LED[2]"LOC=U15;

ET"LED[1]"LOC=V16;

ET"LED[0]"LOC=U16;

ET"SW[3]"LOC=M8;

ET"SW[2]"LOC=V9;

ET"SW[1]"LOC=T9;

ET"SW[0]"LOC=T10;

ET"rst"LOC=C4;

ET"clk_100MHz"LOC=V10;

ET"oclk"LOC=C9;

五、思考与探索

(1)R-I型指令CPU实验结果记录表

序号

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

指令

38011234

20026789

20039000

38040010

00822804

00253025

00833804

00464020

00414822,

00225022

206b7fff

206c8000

314dffff

2c4e6788

2c4f678a

ac0c0014

执行结果

0000_1234

0000_6789

FFFF_9000

0000_0010

6789_0000

6789_1234

9000_0000

6789_79BD

0000_5555

FFFF_AAAB

0000_0FFF

FFFF_1000

0000_AAAB

0000_0000

0000_0001

0000_0FFF

标志

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

结论

正确

正确

正确

正确

正确

正确

正确

正确

正确

正确

正确

正确

正确

正确

正确

正确

***

-

杭电计组实验9-实现R-I型指令地CPU设计实验

发布时间:2022-04-14 08:57:04
文章版权声明:除非注明,否则均为IT技术网-学习WEB前端开发等IT技术的网络平台原创文章,转载或复制请以超链接形式并注明出处。

发表评论

评论列表 (有 14 条评论,22人围观)
摩卡巴卡V铁粉6 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
2]=0;LED[1]=OF;LED[0]=ZF;enddefault
乐至租房V铁粉12 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
W_Data
谷歌金山词霸下载V铁粉11 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
LED=F[15
脚跟痛V铁粉12 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
0]imm_data;wire[15
扬州三盛国际广场V铁粉1 minute ago Google Chrome 93.0.4577.82 Windows 10 x64
rd;assignimm_data=(imm_s)?{{16{imm[15]}}
厦门仙岳路V铁粉26 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
0]rd_data;wire[31
李丽云V铁粉22 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
{{16{1'b0}}
女比男大V铁粉26 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
-2022年4月14日发(作者:曾世麟)***实验报告2018年姓名6月1阳光男日学号16041321课程名称张翔老师班级成绩:16052317专业计算机科学与技术张翔老师92018/6/2指导老师实验名称实验地点《计算机组成原理与系统结构试验》机位号无任课老师实验序号实验时间《实验九实现R-I型指令的CPU设计实验》1教221实验设备号个人电脑一
垃圾短信投诉V铁粉16 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
8];3'b0110
盐慌V铁粉3 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
0]M_R_Data;//InstantiatetheUnitUnderTest(UUT)TOP_RI_CPUuut(.rst(rst)
快速瘦小腿V铁粉16 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
0]rs_data;wire[31
鲍鱼的营养价值V铁粉22 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
0]F;wire[31
胎心率看胎儿性别V铁粉19 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
M_R_Data);******always@(*)begincase(SW)3'b0000