实验分析报告模板.docx
- 文档编号:23046223
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:26
- 大小:474.45KB
实验分析报告模板.docx
《实验分析报告模板.docx》由会员分享,可在线阅读,更多相关《实验分析报告模板.docx(26页珍藏版)》请在冰豆网上搜索。
实验分析报告模板
实验报告模板
————————————————————————————————作者:
————————————————————————————————日期:
同济大学
计算机科学与技术系
计算机组成原理课程实验报告
学号1452312
姓名冯凯
专业计算机科学与技术
授课老师王力生
日期2016.06.18
一、
实验目标
1、熟悉Verilog语言的编写。
2、掌握计算机的每个部件的构成逻辑及工作原理,计算机各部件之间的连接逻辑,计算机整机的工作原理。
3、掌握CPU功能。
4、设计55条单周期指令CPU下板成功
2、.在自己的CPU上跑一个汇编程序
二、总体设计
1.作品功能设计及原理说明
modulecomp(
inputclock,
inputresetn,
output[2:
0]r,
output[2:
0]g,
output[1:
0]b,
outpuths,
outputvs,
);
2.硬件逻辑图
三、主要模块设计
1.ALU
modulealu(
input[31:
0]a,
input[31:
0]b,
input[3:
0]aluc,
output[31:
0]r,
outputzero,//零标志
outputcarry,//进位标志位
outputnegative,//负数标志位
outputoverflow//溢出标志位
);
wire[31:
0]d_and=a&b;//0100
wire[31:
0]d_or=a|b;//0101
wire[31:
0]d_xor=a^b;//0110
wire[31:
0]d_nor=~(a|b);//0111
wire[31:
0]d_lui={b[15:
0],16'h0};//100x
wire[31:
0]d_slt=a
1:
0;
wire[31:
0]d_sltu=(a[31]&&~b[31])||(a[31]&&b[31]&&a>b)||(~a[31]&&~b[31]&&a
wire[31:
0]d_and_or=aluc[0]?
d_or:
d_and;
wire[31:
0]d_xor_nor=aluc[0]?
d_nor:
d_xor;
wire[31:
0]d_and_or_xor_nor=aluc[1]?
d_xor_nor:
d_and_or;
wire[31:
0]d_slt_sltu=aluc[0]?
d_slt:
d_sltu;
wire[31:
0]d_lui_slt_sltu=aluc[1]?
d_slt_sltu:
d_lui;
wire[31:
0]d_as;
wire[31:
0]d_sh;
wirecarry_as;
wirenegative_as;
wireoverflow_as;
wirecarry_sh;
addsub32as32(a,b,aluc[0],aluc[1],d_as,carry_as,overflow_as);
shiftshifter(b,a[4:
0],~aluc[1],~aluc[0],d_sh,carry_sh);
mux4x32select_d(d_as,d_and_or_xor_nor,d_lui_slt_sltu,d_sh,aluc[3:
2],r);
mux4x1select_carry(carry_as,1'b0,1'b0,carry_sh,aluc[3:
2],carry);
mux4x1select_overflow(overflow_as,1'b0,1'b0,overflow_sh,aluc[3:
2],overflow);
assignzero=~|r;
assignnegative=r[31];
endmodule
2.regfile
moduleregfile(
input[4:
0]raddr1,
input[4:
0]raddr2,
input[31:
0]wdata,
input[4:
0]waddr,
inputwe,
inputclk,
inputrst,
output[31:
0]radata1,
output[31:
0]radata2
);
reg[31:
0]register[0:
31];
assignradata1=(raddr1==0)?
0:
register[raddr1];
assignradata2=(raddr2==0)?
0:
register[raddr2];
integeri;
always@(posedgerstornegedgeclk)begin
if(rst==1)
begin
for(i=1;i<32;i=i+1)begin
register[i]<=0;
end
end
elsebegin
register[0]<=32'b0;
if((waddr!
=0)&&we)begin
register[waddr]<=wdata;
end
end
end
endmodule
3.CP0
moduleCoprocessor0(
inputclk,
input[4:
0]C0adr,
input[31:
0]C0Wdata,
inputC0Write,
input[31:
0]InteCause,
inputInterrupt,
outputInteAccept,
output[31:
0]C0State,
outputreg[31:
0]C0Data
);
parameterEPCadr=5'h0;
parameterCauseadr=5'h1;
parameterStateadr=5'h2;
reg[31:
0]EPC;
reg[31:
0]Cause;
reg[31:
0]State;
initialbegin
State<=32'h1;
Cause<=32'h0;
EPC<=32'h0;
end
assignC0State=State;
assignInteAccept=
(C0Write&&(C0adr==Stateadr))&&Interrupt&&~C0Wdata[1]||
~(C0Write&&(C0adr==Stateadr))&&~(C0Write&&(C0adr==Causeadr))&&Interrupt&&~State[1];
always@(posedgeclk)begin
if(C0Write)begin
if(C0adr==EPCadr)begin
EPC<=C0Wdata;
if(Interrupt&&~State[1])begin
State<=State|32'b10;
Cause<=InteCause;
end
end
if(C0adr==Stateadr)begin
if(Interrupt&&~C0Wdata[1])begin
State<=C0Wdata|32'b10;
Cause<=InteCause;
end
elsebegin
State<=C0Wdata;
end
end
if(C0adr==Causeadr)begin
Cause<=C0Wdata;
end
end
elsebegin
if(Interrupt&&~State[1])begin
State<=State|32'b10;
Cause<=InteCause;
end
end
case(C0adr)
EPCadr:
begin
C0Data<=EPC;
end
Causeadr:
begin
C0Data<=Cause;
end
Stateadr:
begin
C0Data<=State;
end
endcase
end
endmodule
4.pc_reg
modulepc_reg(
inputclk,
inputrst,
input[31:
0]data_in,
outputreg[31:
0]data_out
);
always@(posedgeclk)begin
if(rst==1)begin
data_out<=0;
end
elsebegin
data_out<=data_in;
end
end
endmodule
5.mul
modulemul(
input[31:
0]a,
input[31:
0]b,
inputwe,
inputu,//1有符号,0无符号
output[31:
0]hi,
output[31:
0]lo
);
reg[32:
0]a_bi[32:
0];
integeri;
integerj;
wire[32:
0]ai;
wire[32:
0]bi;
wire[65:
0]z;
assignai=u?
{a[31],a}:
{1'b0,a};
assignbi=u?
{b[31],b}:
{1'b0,b};
always@(*)begin
if(we)
for(i=0;i<32;i=i+1)
for(j=0;j<32;j=j+1)
a_bi[i][j]=ai[i]&bi[j];
for(i=0;i<32;i=i+1)
a_bi[i][32]=~(ai[i]&bi[32]);
for(j=0;j<32;j=j+1)
a_bi[32][j]=~(ai[32]&bi[j]);
a_bi[32][32]=ai[32]&bi[32];
end
assignz={33'b1,a_bi[0][32],a_bi[0][31:
0]}+
(((({32'b0,a_bi[1][32],a_bi[1][31:
0],1'b0}+
{31'b0,a_bi[2][32],a_bi[2][31:
0],2'b0})+
({30'b0,a_bi[3][32],a_bi[3][31:
0],3'b0}+
{29'b0,a_bi[4][32],a_bi[4][31:
0],4'b0}))+
(({28'b0,a_bi[5][32],a_bi[5][31:
0],5'b0}+
{27'b0,a_bi[6][32],a_bi[6][31:
0],6'b0})+
({26'b0,a_bi[7][32],a_bi[7][31:
0],7'b0}+
{25'b0,a_bi[8][32],a_bi[8][31:
0],8'b0})))+
((({24'b0,a_bi[9][32],a_bi[9][31:
0],9'b0}+
{23'b0,a_bi[10][32],a_bi[10][31:
0],10'b0})+
({22'b0,a_bi[11][32],a_bi[11][31:
0],11'b0}+
{21'b0,a_bi[12][32],a_bi[12][31:
0],12'b0}))+
(({20'b0,a_bi[13][32],a_bi[13][31:
0],13'b0}+
{19'b0,a_bi[14][32],a_bi[14][31:
0],14'b0})+
({18'b0,a_bi[15][32],a_bi[15][31:
0],15'b0}+
{17'b0,a_bi[16][32],a_bi[16][31:
0],16'b0}))))+
(((({16'b0,a_bi[17][32],a_bi[17][31:
0],17'b0}+
{15'b0,a_bi[18][32],a_bi[18][31:
0],18'b0})+
({14'b0,a_bi[19][32],a_bi[19][31:
0],19'b0}+
{13'b0,a_bi[20][32],a_bi[20][31:
0],20'b0}))+
(({12'b0,a_bi[21][32],a_bi[21][31:
0],21'b0}+
{11'b0,a_bi[22][32],a_bi[22][31:
0],22'b0})+
({10'b0,a_bi[23][32],a_bi[23][31:
0],23'b0}+
{9'b0,a_bi[24][32],a_bi[24][31:
0],24'b0})))+
((({8'b0,a_bi[25][32],a_bi[25][31:
0],25'b0}+
{7'b0,a_bi[26][32],a_bi[26][31:
0],26'b0})+
({6'b0,a_bi[27][32],a_bi[27][31:
0],27'b0}+
{5'b0,a_bi[28][32],a_bi[28][31:
0],28'b0}))+
(({4'b0,a_bi[29][32],a_bi[29][31:
0],29'b0}+
{3'b0,a_bi[30][32],a_bi[30][31:
0],30'b0})+
({2'b0,a_bi[31][32],a_bi[31][31:
0],31'b0}+
{1'b1,a_bi[32][32],a_bi[32][31:
0],32'b0}))));
assignhi=z[63:
32];
assignlo=z[31:
0];
endmodule
6.div
modulediv(
input[31:
0]a1,//被除数低位
input[31:
0]a2,//被除数高位
input[31:
0]b,//除数
inputen,//使能
inputu,//0无符号,1有符号
outputreg[31:
0]q,//商
outputreg[31:
0]r//余数
);
reg[5:
0]count;//32
reg[66:
0]a;
initialbegin
count=0;
end
integeri;
always@(*)begin
if(en==1)begin
if(u==0)begin
a={2'b00,a2[31:
0],a1[31:
0],1'b0};
a=a-{b[31:
0],33'b000000000000000000000000000000000};
for(i=0;i<32;i=i+1)begin
if(a[66]+a[65]==2)begin
a[0]=0;
a=a<<1;
a=a+{b[31:
0],33'b000000000000000000000000000000000};
end
elsebegin
a[0]=1;
a=a<<1;
a=a-{b[31:
0],33'b000000000000000000000000000000000};
end
end
if(a[66]+a[65]==2)begin
a[0]=0;
a=a+{b[31:
0],33'b000000000000000000000000000000000};
end
elsebegin
a[0]=1;
end
q={a[31:
0]};
r={a[64:
33]};
end
elsebegin
if(a2[31]==b[31])begin
a={2'b00,a2[31:
0],a1[31:
0],1'b0};
a=a-{b[31:
0],33'b000000000000000000000000000000000};
end
elsebegin
a={2'b00,a2[31:
0],a1[31:
0],1'b0};
a=a+{b[31:
0],33'b000000000000000000000000000000000};
end
for(i=0;i<32;i=i+1)begin
if(a[63]!
=b[31])begin
a[0]=0;
a=a<<1;
a=a+{b[31:
0],33'b000000000000000000000000000000000};
end
elsebegin
a[0]=1;
a=a<<1;
a=a-{b[31:
0],33'b000000000000000000000000000000000};
end
end
if(a[64]==1)begin
a[0]=0;
a=a+{b[31:
0],33'b000000000000000000000000000000000};
end
elsebegin
a[0]=1;
end
q={a[31:
0]};
r={a[64:
33]};
end
end
end
endmodule
7.bz0//自己设计模块针对bgez、bgtz、blez、bltz四条指令
modulebz(
input[31:
0]a,
input[1:
0]b,
outputregz
);
always@(*)begin
case(b)
2'b00:
//>=0
if(a[31]==0)
z<=1;
else
z<=0;
2'b01:
//<0
if(a[31]==1)
z<=1;
else
z<=0;
2'b10:
//<=0
if(a[31]==1||a==0)
z<=1;
else
z<=0;
2'b11:
//>0
if(a[31]==0||a!
=0)
z<=1;
else
z<=0;
endcase
end
endmodule
8.imem
moduleinstmem(
input[31:
0]pc,
output[31:
0]inst
);
reg[31:
0]a[0:
255];
initialbegin
$readmemh("1.txt",a);
end
assigninst=a[pc[31:
2]];
endmodule
9.dmem//因lh、lb、sh、sb等指令对dmem做了改动
moduleram(
inputclk,
inputram_ena,
input[1:
0]c,//0xlw/sw,10lh/sh,11lb/hb
inputu,
input[31:
0]addr,
input[31:
0]data_in,
outputreg[31:
0]data_out
);
reg[7:
0]a[0:
20470];
always@(posedgeclk)begin
if(ram_ena)
case(c)
2'b00:
begin
a[{addr[31:
2],2'b00}]<=data_in[7:
0];
a[{addr[31:
2],2'b00}+1]<=data_in[15:
8];
a[{addr[31:
2],2'b00}+2]<=data_in[23:
16];
a[{addr[31:
2],2'b00}+3]<=data_in[31:
24];
end
2'b10:
begin
a[{addr[31:
1],1'b0}]<=data_in[7:
0];
a[{addr[31:
1],1'b0}+1]<=data_in[15:
8];
end
2'b11:
begin
a[addr]<=data_in[7:
0];
end
default:
begin
a[addr]<=0;
end
endcase
end
always@(*)begin
case(c)
2'b00:
begin
data_out<={a[{addr[31:
2],2'b00}+3],a[{addr[31:
2],2'b00}+2],a[{addr[31:
2],2'b00}+1],a[{addr[31:
2],2'b00}]};
end
2'b01:
begin
data_out<={a[{addr[31:
2],2'b00}+3],a[{addr[31:
2],2'b00}+2],a[{addr[31:
2],2'b00}+1],a[{addr[31:
2],2'b00}]};
end
2'b10:
begin
data_out<={{16{u&a[{addr[31:
1],1'b0}+1][7]}},a[{addr[31:
1],1'b0}+1],a[{addr[31:
1],1'b0}]};
end
2'b11:
begin
data_out<={{24{u&a[addr][7]}},a[addr]};
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 分析 报告 模板