杭电计组实验9实现RI型指令地CPU设计实验.docx

上传人:b****3 文档编号:5977040 上传时间:2023-05-09 格式:DOCX 页数:14 大小:117.97KB
下载 相关 举报
杭电计组实验9实现RI型指令地CPU设计实验.docx_第1页
第1页 / 共14页
杭电计组实验9实现RI型指令地CPU设计实验.docx_第2页
第2页 / 共14页
杭电计组实验9实现RI型指令地CPU设计实验.docx_第3页
第3页 / 共14页
杭电计组实验9实现RI型指令地CPU设计实验.docx_第4页
第4页 / 共14页
杭电计组实验9实现RI型指令地CPU设计实验.docx_第5页
第5页 / 共14页
杭电计组实验9实现RI型指令地CPU设计实验.docx_第6页
第6页 / 共14页
杭电计组实验9实现RI型指令地CPU设计实验.docx_第7页
第7页 / 共14页
杭电计组实验9实现RI型指令地CPU设计实验.docx_第8页
第8页 / 共14页
杭电计组实验9实现RI型指令地CPU设计实验.docx_第9页
第9页 / 共14页
杭电计组实验9实现RI型指令地CPU设计实验.docx_第10页
第10页 / 共14页
杭电计组实验9实现RI型指令地CPU设计实验.docx_第11页
第11页 / 共14页
杭电计组实验9实现RI型指令地CPU设计实验.docx_第12页
第12页 / 共14页
杭电计组实验9实现RI型指令地CPU设计实验.docx_第13页
第13页 / 共14页
杭电计组实验9实现RI型指令地CPU设计实验.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

杭电计组实验9实现RI型指令地CPU设计实验.docx

《杭电计组实验9实现RI型指令地CPU设计实验.docx》由会员分享,可在线阅读,更多相关《杭电计组实验9实现RI型指令地CPU设计实验.docx(14页珍藏版)》请在冰点文库上搜索。

杭电计组实验9实现RI型指令地CPU设计实验.docx

杭电计组实验9实现RI型指令地CPU设计实验

实验报告

2018年6月1日成绩:

姓名

阳光男

学号

16041321

班级

16052317

专业

计算机科学与技术

课程名称

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

任课老师

张翔老师

指导老师

张翔老师

机位号

实验序号

9

实验名称

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

实验时间

2018/6/2

实验地点

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_YIMAop(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

寄存器堆模块:

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

时钟按键消抖代码:

modulexiaodou(

inputclk_100MHz,

inputBTN,

outputregBTN_Out

);

regBTN1,BTN2;

wireBTN_Down;

reg[21:

0]cnt;

regBTN_20ms_1,BTN_20ms_2;

wireBTN_Up;

always@(posedgeclk_100MHz)

begin

BTN1<=BTN;

BTN2<=BTN1;

end

assignBTN_Down=(~BTN2)&&BTN1;//从0到1的跳变

always@(posedgeclk_100MHz)

begin

if(BTN_Down)

begin

cnt<=22'b0;

BTN_Out<=1'b1;

end

elsecnt<=cnt+1'b1;

if(cnt==22'h20000)BTN_20ms_1<=BTN;

BTN_20ms_2<=BTN_20ms_1;

if(BTN_Up)BTN_Out<=1'b0;

end

assignBTN_Up=BTN_20ms_2&&(~BTN_20ms_1);//从1到0

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[2]"LOC=V9;

NET"SW[1]"LOC=T9;

NET"SW[0]"LOC=T10;

NET"rst"LOC=C4;

NET"clk_100MHz"LOC=V10;

NET"oclk"LOC=C9;

五、思考与探索

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

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

1380112340000_123400正确

2200267890000_678900正确

320039000FFFF_900000正确

4380400100000_001000正确

5008228046789_000000正确

6002530256789_123400正确

7008338049000_000000正确

8004640206789_79BD00正确

900414822,0000_555500正确

1000225022FFFF_AAAB00正确

11206b7fff0000_0FFF00正确

12206c8000FFFF_100000正确

13314dffff0000_AAAB00正确

142c4e67880000_000000正确

152c4f678a0000_000100正确

16ac0c00140000_0FFF00正确

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2