计组实验报告91.docx
- 文档编号:2267303
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:15
- 大小:271.38KB
计组实验报告91.docx
《计组实验报告91.docx》由会员分享,可在线阅读,更多相关《计组实验报告91.docx(15页珍藏版)》请在冰豆网上搜索。
计组实验报告91
实验报告
2014年05月29日成绩:
姓名
曹亚娟
学号
12051201
班级
12052311
专业
计算机科学与技术
课程名称
《计算机组成原理》
任课老师
冯建文
指导老师
冯建文
机位号
实验序号
9
实验名称
实现R-I型指令的CPU设计实验
实验时间
2014.05.29
实验地点
1教225
实验设备号
一、实验程序源代码
moduleRI_CPU_Top(rst,clk_100MHZ,BTN,select,LED);
inputrst;
inputclk_100MHZ,BTN;
input[3:
0]select;
output[7:
0]LED;
wireclk;
wire[31:
0]M_R_Data;
wire[31:
0]ALU_F;
reg[7:
0]LED;
BTN_OKbtn(
.clk_100MHz(clk_100MHZ),
.BTN(BTN),
.BTN_Out(clk)
);
CPUcpu(
.rst(rst),
.clk(clk),
.clk_100MHZ(clk_100MHZ),
.ALU_F(ALU_F),
.ZF(ZF),
.OF(OF),
.M_R_Data(M_R_Data)
);
always@(*)
begin
if(rst)
begin
LED=32'b0000_0000;
end
case(select)
4'b0000:
LED=ALU_F[7:
0];
4'b0001:
LED=ALU_F[15:
8];
4'b0010:
LED=ALU_F[23:
16];
4'b0011:
LED=ALU_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]=ZF;LED[6:
1]=6'b0;LED[0]=OF;end
default:
LED=32'b0000_0000;
endcase
end
endmodule
moduleBTN_OK(
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
moduleCPU(rst,clk,clk_100MHZ,ALU_F,ZF,OF,M_R_Data);
inputrst;
inputclk;
inputclk_100MHZ;
output[31:
0]ALU_F;
outputZF;
outputOF;
output[31:
0]M_R_Data;
wire[31:
0]R_Data_A;
wire[31:
0]R_Data_B;
wire[31:
0]Inst_code;
/*R型*/
wire[5:
0]OP;
wire[4:
0]rs;
wire[4:
0]rt;
wire[4:
0]rd;
wire[4:
0]shamt;
wire[5:
0]func;
wireWrite_Reg;
wire[2:
0]ALU_OP;
/*I型*/
wire[15:
0]imm;
assignOP[5:
0]=Inst_code[31:
26];
assignrs[4:
0]=Inst_code[25:
21];
assignrt[4:
0]=Inst_code[20:
16];
assignrd[4:
0]=Inst_code[15:
11];
assignshamt[4:
0]=Inst_code[10:
6];
assignfunc[5:
0]=Inst_code[5:
0];
assignimm[15:
0]=Inst_code[15:
0];
/*控制信号*/
wirerd_rt_s;
wireimm_s;
wirert_imm_s;
wirealu_mem_s;
wire[4:
0]W_Addr;
wire[31:
0]imm_data;
wire[31:
0]ALU_B;
wire[31:
0]M_R_Data;
wire[31:
0]W_Data;
assignW_Addr=(rd_rt_s)?
rt:
rd;
assignimm_data=(imm_s)?
{{16{imm[15]}},imm}:
{{16{1'b0}},imm};
assignALU_B=(rt_imm_s)?
imm_data:
R_Data_B;
assignW_Data=alu_mem_s?
M_R_Data:
ALU_F;
Instructioninstruction(
.rst(rst),
.clk(clk),
.Inst_code(Inst_code)
);
Registerregister(
.R_Addr_A(rs),
.R_Addr_B(rt),
.R_Data_A(R_Data_A),
.R_Data_B(R_Data_B),
.W_Addr(W_Addr),
.W_Data(W_Data),
.Write_Reg(Write_Reg),
.Clk(~clk),
.Reset(rst)
);
ALUalu(
.A(R_Data_A),
.B(ALU_B),
.ZF(ZF),
.F(ALU_F),
.OF(OF),
.ALU_OP(ALU_OP)
);
translateTranslate(
.OP(OP),
.func(func),
.Write_Reg(Write_Reg),
.ALU_OP(ALU_OP),
.Mem_Write(Mem_Write),
.rd_rt_s(rd_rt_s),
.imm_s(imm_s),
.rt_imm_s(rt_imm_s),
.alu_mem_s(alu_mem_s)
);
Data_RAMdata_ram(
.clka(clk_100MHZ),//inputclka
.wea(Mem_Write),//input[0:
0]wea
.addra(ALU_F[5:
0]),//input[5:
0]addra
.dina(R_Data_B),//input[31:
0]dina
.douta(M_R_Data)//output[31:
0]douta
);
endmodule
moduleInstruction(rst,clk,Inst_code);
inputrst;
inputclk;
output[31:
0]Inst_code;//指令
reg[7:
0]PC;
wire[7:
0]PC_new;
assignPC_new=PC+4;
Inst_ROMinst_ROM(
.clka(clk),
.addra(PC[7:
2]),
.douta(Inst_code)
);
//更新PC值
always@(posedgerstornegedgeclk)
begin
if(rst)
begin
PC<=0;
end
else
begin
PC<=PC_new;
end
end
Endmodule
moduleRegister(R_Addr_A,R_Addr_B,R_Data_A,R_Data_B,W_Addr,W_Data,Write_Reg,Clk,Reset);
input[4:
0]R_Addr_A;
input[4:
0]R_Addr_B;
input[4:
0]W_Addr;
input[31:
0]W_Data;
inputWrite_Reg;
inputClk;
inputReset;
output[31:
0]R_Data_A;
output[31:
0]R_Data_B;
integeri;
reg[31:
0]REG_Files[0:
31];//定义寄存器
assignR_Data_A=REG_Files[R_Addr_A];
assignR_Data_B=REG_Files[R_Addr_B];
always@(posedgeClkorposedgeReset)
begin
if(Reset)//清零
begin
for(i=0;i<32;i=i+1)
REG_Files[i]<=0;
end
else
begin
if(Write_Reg&&(W_Addr!
=0))
begin
REG_Files[W_Addr]<=W_Data;
end
end
end
Endmodule
moduleALU(A,B,ZF,F,OF,ALU_OP);
input[2:
0]ALU_OP;
input[31:
0]A,B;
output[31:
0]F;
outputZF,OF;
reg[32:
0]F;
regZF,OF;
always@(*)
begin
F[32]=1'b0;
OF=1'b0;
case(ALU_OP)
3'b000:
begin
F[31:
0]=A[31:
0]&B[31:
0];
end
3'b001:
begin
F[31:
0]=A[31:
0]|B[31:
0];
end
3'b010:
begin
F[31:
0]=A[31:
0]^B[31:
0];
end
3'b011:
begin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告 91
![提示](https://static.bdocx.com/images/bang_tan.gif)