杭电计组实验10实现RIJ型指令的CPU设计实验精编版.docx

上传人:b****5 文档编号:5658089 上传时间:2022-12-30 格式:DOCX 页数:15 大小:105.36KB
下载 相关 举报
杭电计组实验10实现RIJ型指令的CPU设计实验精编版.docx_第1页
第1页 / 共15页
杭电计组实验10实现RIJ型指令的CPU设计实验精编版.docx_第2页
第2页 / 共15页
杭电计组实验10实现RIJ型指令的CPU设计实验精编版.docx_第3页
第3页 / 共15页
杭电计组实验10实现RIJ型指令的CPU设计实验精编版.docx_第4页
第4页 / 共15页
杭电计组实验10实现RIJ型指令的CPU设计实验精编版.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

杭电计组实验10实现RIJ型指令的CPU设计实验精编版.docx

《杭电计组实验10实现RIJ型指令的CPU设计实验精编版.docx》由会员分享,可在线阅读,更多相关《杭电计组实验10实现RIJ型指令的CPU设计实验精编版.docx(15页珍藏版)》请在冰豆网上搜索。

杭电计组实验10实现RIJ型指令的CPU设计实验精编版.docx

杭电计组实验10实现RIJ型指令的CPU设计实验精编版

实验报告

2018年6月9日成绩:

姓名

阳光男

学号

16041321

班级

16052317

专业

计算机科学与技术

课程名称

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

任课老师

张翔老师

指导老师

张翔老师

机位号

默认

实验序号

10

实验名称

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

实验时间

2018/6/9

实验地点

1教221

实验设备号

个人电脑、Nexys3开发板

一、实验程序源代码

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

moduletest;

//Inputs

regrst;

regclk_100MHz;

regclk;

//Outputs

wireZF;

wireOF;

wire[31:

0]F;

wire[31:

0]M_R_Data;

wire[31:

0]PC;

//InstantiatetheUnitUnderTest(UUT)

TOP_RIJ_CPUuut(

.rst(rst),

.clk_100MHz(clk_100MHz),

.clk(clk),

.ZF(ZF),

.OF(OF),

.F(F),

.M_R_Data(M_R_Data),

.PC(PC)

);

initialbegin

//InitializeInputs

rst=0;

clk_100MHz=0;

clk=0;

//Wait100nsforglobalresettofinish

#100;

//Addstimulushere

forever

begin

#2;

clk=~clk;

#10;

clk_100MHz=~clk_100MHz;

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;

wire[31:

0]PC;

xiaodoudoudong(clk_100MHz,oclk,rclk);

TOP_RIJ_CPU(rst,clk_100MHz,rclk,ZF,OF,F,M_R_Data,PC);

always@(*)

begin

case(SW)

4'b0000:

LED=F[7:

0];

4'b0001:

LED=F[15:

8];

4'b0010:

LED=F[23:

16];

4'b0011:

LED=F[31:

24];

4'b0100:

LED=M_R_Data[7:

0];

4'b0101:

LED=M_R_Data[15:

8];

4'b0110:

LED=M_R_Data[23:

16];

4'b0111:

LED=M_R_Data[31:

24];

4'b1000:

beginLED[7:

2]=0;LED[1]=OF;LED[0]=ZF;end

4'b1100:

LED=PC[7:

0];

4'b1101:

LED=PC[15:

8];

4'b1110:

LED=PC[23:

16];

4'b1111:

LED=PC[31:

24];

default:

LED=0;

endcase

end

endmodule

 

顶层RIJ型指令CPU验证模块:

moduleTOP_RIJ_CPU(inputrst,inputclk_100MHz,inputclk,outputZF,

outputOF,output[31:

0]F,output[31:

0]M_R_Data,output[31:

0]PC);

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;

wire[1:

0]w_r_s;

wireimm_s;//判断是否需要扩展

wirert_imm_s;//B端选择rt或者是扩展后的imm

wireMem_Write;

//wirealu_mem_s;

wire[1:

0]wr_data_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;//B端口数据

wire[2:

0]ALU_OP;

wire[1:

0]PC_s;

wire[31:

0]PC_new;

wire[31:

0]PC;

wire[25:

0]address;

pcpc_connect(clk,rst,PC_s,R_Data_A,imm_data,address,Inst_code,PC);

OP_YIMAop(Inst_code,ALU_OP,rs,rt,rd,Write_Reg,imm,imm_s,

rt_imm_s,Mem_Write,address,w_r_s,wr_data_s,PC_s,ZF);

assignW_Addr=(w_r_s[1])?

5'b11111:

((w_r_s[0])?

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);

RAM_BData_Mem(

.clka(clk_100MHz),//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=(wr_data_s[1])?

PC_new:

((wr_data_s[0])?

M_R_Data:

F);

endmodule

 

PC取指令模块:

modulepc(inputclk,inputrst,input[1:

0]PC_s,input[31:

0]R_Data_A,

input[31:

0]imm_data,input[25:

0]address,output[31:

0]Inst_code,output[31:

0]PC);

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

begin

case(PC_s)

2'b00:

PC<=PC_new;

2'b01:

PC<=R_Data_A;

2'b10:

PC<=PC_new+(imm_data<<2);

2'b11:

PC<={PC_new[31:

28],address,2'b00};

endcase

end

end

endmodule

 

OP指令功能译码模块:

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

imm,imm_s,rt_imm_s,Mem_Write,address,w_r_s,wr_data_s,PC_s,ZF);

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;

outputreg[25:

0]address;

outputreg[1:

0]w_r_s;

outputreg[1:

0]wr_data_s;

outputreg[1:

0]PC_s;

inputZF;

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;

wr_data_s=2'b00;

Mem_Write=0;

//rd_rt_s=0;

w_r_s=2'b00;

rt_imm_s=0;

case(inst[5:

0])

6'b100000:

beginALU_OP=3'b100;Write_Reg=1;PC_s=2'b00;end

6'b100010:

beginALU_OP=3'b101;Write_Reg=1;PC_s=2'b00;end

6'b100100:

beginALU_OP=3'b000;Write_Reg=1;PC_s=2'b00;end

6'b100101:

beginALU_OP=3'b001;Write_Reg=1;PC_s=2'b00;end

6'b100110:

beginALU_OP=3'b010;Write_Reg=1;PC_s=2'b00;end

6'b100111:

beginALU_OP=3'b011;Write_Reg=1;PC_s=2'b00;end

6'b101011:

beginALU_OP=3'b110;Write_Reg=1;PC_s=2'b00;end

6'b000100:

beginALU_OP=3'b111;Write_Reg=1;PC_s=2'b00;end

6'b001000:

beginALU_OP=3'b100;Write_Reg=0;PC_s=2'b01;end

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;

w_r_s=2'b01;

Write_Reg=1;

wr_data_s=2'b00;

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];//rt寄存器

rs=inst[25:

21];//rs寄存器

//rd_rt_s=1;//rt作为目的存储器

rt_imm_s=1;//imm作为源操作数

imm_s=1;

w_r_s=2'b01;

wr_data_s=2'b01;

PC_s=2'b00;

case(inst[31:

26])

6'b100011:

beginMem_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

//-----------处理I型跳转指令---------

if(inst[31:

27]==5'b00010)

begin

imm=inst[15:

0];

rt=inst[20:

16];//rt

rs=inst[25:

21];//rs

case(inst[31:

26])

6'b000100:

beginrt_imm_s=0;ALU_OP=3'b101;Write_Reg=0;Mem_Write=0;

PC_s=(ZF?

2'b10:

2'b00);end

6'b000101:

beginrt_imm_s=0;ALU_OP=3'b101;Write_Reg=0;Mem_Write=0;

PC_s=(ZF?

2'b00:

2'b10);end

endcase

end

//----------处理J型跳转指令----------

if(inst[31:

27]==5'b00001)

begin

address=inst[25:

0];

case(inst[31:

26])

6'b000010:

beginw_r_s=2'b00;Write_Reg=0;Mem_Write=0;PC_s=2'b11;end

6'b000011:

beginw_r_s=2'b10;wr_data_s=2'b10;Write_Reg=1;Mem_Write=0;PC_s=2'b11;end

endcase

end

end

endmodule

 

寄存器堆模块:

moduleRegister_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

二、仿真波形

三、电路图

顶层电路模块

 

顶层电路内部结构:

 

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

NET"LED[7]"LOC=T11;

NET"LED[6]"LOC=R11;

NET"LED[5]"LOC=N11;

NET"LED[4]"LOC=M11;

NET"LED[3]"LOC=V15;

NET"LED[2]"LOC=U15;

NET"LED[1]"LOC=V16;

NET"LED[0]"LOC=U16;

NET"SW[3]"LOC=M8;

NET"SW[1]"LOC=T9;

NET"SW[0]"LOC=T10;

NET"clk_100MHz"LOC=V10;

NET"oclk"LOC=C9;

NET"rst"LOC=C4;

NET"SW[2]"LOC=V9;

五、思考与探索

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

序号指令执行结果标志结论

100004020$8=0000_000000正确

200004820$9=0000_000000正确

3200a0014$10=0000_001400正确

48d2b0010$11=0000_001000正确

5010b4020$8=0000_222200正确

621290004$9=0000_000400正确

7214affff$10=000_001300正确

811400001判断:

$10不为000正确

908000003返回去执行地址为00正确

0000_0010的指令,

即序号4:

8d2b0010

……

……

10ac0b0030存储器地址:

0000_003000正确

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

当前位置:首页 > 考试认证 > 交规考试

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

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