实验报告模板.docx

上传人:b****8 文档编号:9228559 上传时间:2023-02-03 格式:DOCX 页数:26 大小:474.61KB
下载 相关 举报
实验报告模板.docx_第1页
第1页 / 共26页
实验报告模板.docx_第2页
第2页 / 共26页
实验报告模板.docx_第3页
第3页 / 共26页
实验报告模板.docx_第4页
第4页 / 共26页
实验报告模板.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

实验报告模板.docx

《实验报告模板.docx》由会员分享,可在线阅读,更多相关《实验报告模板.docx(26页珍藏版)》请在冰豆网上搜索。

实验报告模板.docx

实验报告模板

同济大学

计算机科学与技术系

计算机组成原理课程实验报告

学号*******

姓名冯凯

专业计算机科学与技术

授课老师王力生

日期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]};

end

endcase

end

endmodule

四、应用程序

八数码

addi$10,$0,1

addi$11,$0,2

addi$12,$0,3

addi

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

当前位置:首页 > 解决方案 > 学习计划

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

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