计算机组成原理实验参考答案(西南交大).docx
《计算机组成原理实验参考答案(西南交大).docx》由会员分享,可在线阅读,更多相关《计算机组成原理实验参考答案(西南交大).docx(27页珍藏版)》请在冰点文库上搜索。
![计算机组成原理实验参考答案(西南交大).docx](https://file1.bingdoc.com/fileroot1/2023-6/26/0411840d-adca-40d2-aabd-9bce6f106808/0411840d-adca-40d2-aabd-9bce6f1068081.gif)
[原创]西南交通大学计算机组成实验参考答案
注1、引脚分配依照EP3C40F780C8芯片
注2、一定要参照实验指导书阅读此文
实验一:
多路数据选择器的设计
f=((~sel)a)+((sel)b)
当sel=0时,f=a,否则f=b。
引脚分配参考:
a[3:
0]AH12AF14AA8AB8
b[3:
0]AF12AG12AA10U8
f[3:
0]E24F22E22F21
sel:
AC5
实验二基于原理图方式的3-8译码电路的设计
f0=(~en)+(~a)(~b)(~c)
f1=(~en)+(~a)(~b)c
f2=(~en)+(~a)b(~c)
f3=(~en)+(~a)bc
f4=(~en)+a(~b)(~c)
f5=(~en)+a(~b)c
f6=(~en)+ab(~c)
f7=(~en)+abc
en为使能端,低电平有效,高电平时输出全为1。
引脚分配参考:
a:
AH12,b:
AF14,c:
AA8,en:
AC5
f[7:
0]F24H24H23L23L24M24J22AE8
实验三四位加法器设计
实验思路:
用VerilogHDL语言编写一位全加器,再用原理图方式用四个全加器组合实现四位加法器。
Adder.v
moduleAdder(a,b,cin,cout,sum);
inputa,b,cin;
outputcout,sum;
assign{cout,sum}=a+b+cin;
endmodule
原理图:
{cout,sum}=a+b+cin
cin为进位输入,cout为进位输出。
引脚分配参考:
a[3:
0]AH12AF14AA8AB8
b[3:
0]AF12AG12AA10U8
sum[3:
0]E24F22E22F21
cin:
AC5,cout:
F24
实验四:
七段LED数码管显示译码器设计
本实验使用VerilogHDL实现。
moduleExp4(f,clk,rst,in,out,sel);
input[15:
0]in;//输入
inputf,clk,rst;//计数开关,时钟,置零开关
outputreg[7:
0]out;//数码管输出
outputreg[2:
0]sel;//数码管3-8译码器输出
reg[15:
0]counter;
reg[3:
0]data;
regclk_alt;
reg[9:
0]l;
//changefrequency 变频段
always@(posedgeclk)
begin
if(l>=1023)l=0;
elsel=l+1;
clk_alt=l[2];
end
//select选择在哪一个数码管显示
always@(posedgeclk)
begin
sel=sel+1;
if(sel>=4)sel=0;
case(sel)
0:
data=counter[3:
0];
1:
data=counter[7:
4];
2:
data=counter[11:
8];
3:
data=counter[15:
12];
endcase
end
//countandreset计数和清零
always@(posedgeclk_altorposedgerst)
begin
if(rst==1)counter=0;
elseif(f==1)counter=in;
elsecounter=counter+1;
end
//translate译码段,此处可以使用二进制或十六进制,后面的实验同,不再赘述。
always
case(data)
0:
out=63;
1:
out=6;
2:
out=91;
3:
out=79;
4:
out=102;
5:
out=109;
6:
out=125;
7:
out=7;
8:
out=127;
9:
out=111;
10:
out=119;
11:
out=124;
12:
out=57;
13:
out=94;
14:
out=121;
15:
out=113;
endcase
endmodule
引脚分配参考:
in[15:
0]AH12AF14AA8AB8AF12AG12AA10U8AF5AH6AH7AH8AH14AG7AG8AF9
out[7:
0]M21G12G14G15G18F18G17G16
sel[2:
0]G9D22C22
clk:
A14,f:
AC5,rst:
AD4
实验五:
算数逻辑单元(ALU)设计
moduleExp5(s,cin,d,wt,sel,out,slt,clk);
input[2:
0]s;//功能开关
inputsel,cin,wt,clk;//选择输入开关,进位输入,写入开关,时钟
input[15:
0]d;//输入
outputreg[7:
0]out;//数码管输出
outputreg[2:
0]slt;//数码管3-8译码器输出
reg[15:
0]a;//暂存器a
reg[15:
0]b;//暂存器b
reg[15:
0]result;//计算结果
reg[3:
0]outdata;
regcout;
//选择显示的数码管
always@(posedgeclk)
begin
slt=slt+1;
if(slt>=5)slt=0;
case(slt)
0:
outdata=cout;
1:
outdata=result[15:
12];
2:
outdata=result[11:
8];
3:
outdata=result[7:
4];
4:
outdata=result[3:
0];
endcase
end
//译码
always
case(outdata)
0:
out=63;
1:
out=6;
2:
out=91;
3:
out=79;
4:
out=102;
5:
out=109;
6:
out=125;
7:
out=7;
8:
out=127;
9:
out=111;
10:
out=119;
11:
out=124;
12:
out=57;
13:
out=94;
14:
out=121;
15:
out=113;
endcase
//选择输入到哪一个暂存
always@(selorwt)
begin
if(wt==0)
begin
if(sel==0)a=d;
elseb=d;
end
end
//计算功能选择
always
case(s)
0:
result=0;//置零
1:
result=a&b;//逻辑与
2:
result=a|b;//逻辑或
3:
result=a^b;//逻辑异或
4:
{cout,result}=a+b+cin;//算术加
5:
{cout,result}=a<<1;//a左移一位(含进位)
6:
result=a>>1;//a右移一位
7:
;//无功能
endcase
endmodule
引脚分配参考:
d[15:
0]AH12AF14AA8AB8AF12AG12AA10U8AF5AH6AH7AH8AH14AG7AG8AF9
out[7:
0]M21G12G14G15G18F18G17G16
slt[2:
0]G9D22C22
s[2:
0]AE4AC5AD4
clk:
A14,cin:
AH11,sel:
AE3,wt:
AH10
实验六CPU寄存器组的设计
moduleExp6(RA,wt,rd,m,rst,clk,d,out,sel);
input[1:
0]RA;//通用寄存器选择
inputrd,wt,rst,clk;//读开关,写开关,置零开关,时钟
input[1:
0]m;//功能选择
input[15:
0]d;//输入
outputreg[7:
0]out;//数码管输出
outputreg[2:
0]sel;//数码管3-8译码器输出
reg[3:
0]data;
reg[15:
0]R0;
reg[15:
0]R1;
reg[15:
0]R2;
reg[15:
0]R3;
reg[15:
0]mid;
reg[15:
0]counter;
regclk_alt;
reg[2:
0]l;
//变频段
always@(negedgeclk)
begin
if(l>=7)l=0;
elsel=l+1;
clk_alt=l[2];
end
//读写
always@(RAorrdorwt)
begin
case(RA)
0:
begin
if(rd==1&&wt==0)R0=d;
elseif(rd==0&&wt==1)mid=R0;
end
1:
begin
if(rd==1&&wt==0)R1=d;
elseif(rd==0&&wt==1)mid=R1;
end
2:
begin
if(rd==1&&wt==0)R2=d;
elseif(rd==0&&wt==1)mid=R2;
end
3:
begin
if(rd==1&&wt==0)R3=d;
elseif(rd==0&&wt==1)mid=R3;
end
endcase
end
//PC寄存器
always@(negedgeclk_alt)
begin
if(rst==0)counter=0;
elsecase(m)
0:
;//无功能
1:
counter=counter-1;//减一计数
2:
counter=counter+1;//加一计数
3:
counter=mid;//置数
endcase
end
//输出
always@(negedgeclk)
begin
sel=sel+1;
if(sel>=8)sel=0;
case(sel)
0:
data=counter[15:
12];
1:
data=counter[11:
8];
2:
data=counter[7:
4];
3:
data=counter[3:
0];//前四位显示PC寄存器数值
4:
data=mid[15:
12];
5:
data=mid[11:
8];
6:
data=mid[7:
4];
7:
data=mid[3:
0];//后四位显示通用寄存器数值
endcase
end
//译码
always
case(data)
0:
out=63;
1:
out=6;
2:
out=91;
3:
out=79;
4:
out=102;
5:
out=109;
6:
out=125;
7:
out=7;
8:
out=127;
9:
out=111;
10:
out=119;
11:
out=124;
12:
out=57;
13:
out=94;
14:
out=121;
15:
out=113;
endcase
endmodule
引脚分配参考:
RA[1:
0]AG10AG11,m[1:
0]AE4AC5
d[15:
0]AH12AF14AA8AB8AF12AG12AA10U8AF5AH6AH7AH8AH14AG7AG8AF9
out[7:
0]M21G12G14G15G18F18G17G16
sel[2:
0]G9D22C22
clk:
A14,rst:
AH11,rd:
AE3,wt:
AD4
实验七运算器设计
此实验用VerilogHDL和原理图实现
ALU.v ALU部分(功能参照实验五)
moduleALU(s,cin,wt,sel,in,cout,out);
input[2:
0]s;
inputsel,cin,wt;
input[15:
0]in;
outputreg[15:
0]out;
outputregcout;
reg[15:
0]a;
reg[15:
0]b;
always@(selorwt)
begin
if(wt==0)
begin
if(sel==0)a=in;
elseb=in;
end
end
always
case(s)
0:
out=0;
1:
out=a&b;
2:
out=a|b;
3:
out=a^b;
4:
{cout,out}=a+b+cin;
5:
{cout,out}=a<<2;
6:
out=a>>2;
7:
;
endcase
endmodule
REG.v CPU寄存器组部分(功能参照实验六)
moduleREG(in,out,slt,d,RA,wr,m,rst,clk,sel,mid);
input[15:
0]in;
input[15:
0]d;
input[1:
0]RA;
inputwr,rst,clk,sel;//sel为选择开关,选择从ALU的输出出入或者外部输入
input[1:
0]m;
outputreg[7:
0]out;
outputreg[2:
0]slt;
reg[3:
0]data;
reg[15:
0]R0;
reg[15:
0]R1;
reg[15:
0]R2;
reg[15:
0]R3;
outputreg[15:
0]mid;
reg[15:
0]counter;
regclk_alt,wt,rd;
reg[2:
0]l;
always@(negedgeclk)
begin
if(l>=7)l=0;
elsel=l+1;
clk_alt=l[2];
end
//ReadandWrite
always
begin
case(RA)
0:
begin
if(wr==0)
if(sel==1)R0=d;elseR0=in;//sel高电平从外部输入,否则从ALU输入,下同
elsemid=R0;
end
1:
begin
if(wr==0)
if(sel==1)R1=d;elseR1=in;
elsemid=R1;
end
2:
begin
if(wr==0)
if(sel==1)R2=d;elseR2=in;
elsemid=R2;
end
3:
begin
if(wr==0)
if(sel==1)R3=d;elseR3=in;
elsemid=R3;
end
endcase
end
//PC
always@(negedgeclk_alt)
begin
if(rst==0)counter=0;
elsecase(m)
0:
;
1:
counter=counter-1;
2:
counter=counter+1;
3:
counter=d;
endcase
end
//output
always@(negedgeclk)
begin
slt=slt+1;
if(slt>=8)slt=0;
case(slt)
0:
data=counter[15:
12];
1:
data=counter[11:
8];
2:
data=counter[7:
4];
3:
data=counter[3:
0];
4:
data=mid[15:
12];
5:
data=mid[11:
8];
6:
data=mid[7:
4];
7:
data=mid[3:
0];
endcase
end
//translate
always
case(data)
0:
out=63;
1:
out=6;
2:
out=91;
3:
out=79;
4:
out=102;
5:
out=109;
6:
out=125;
7:
out=7;
8:
out=127;
9:
out=111;
10:
out=119;
11:
out=124;
12:
out=57;
13:
out=94;
14:
out=121;
15:
out=113;
endcase
endmodule
两个文件写完之后分别生成symbol文件,并绘制原理图
由于实验箱只有28个开关输入,因此为节省引脚,将cin接地或接+5V,并将实验六的读写开关合二为一。
引脚分配参考:
d[15:
0]AH12AF14AF12AG12AF5AH6AH7AH8AG10AG11AH14AG7AG8AF9AH10AH11
out[7:
0]M21G12G14G15G18F18G17G16
slt[2:
0]G9D22C22,s[2:
0]AA8AB8AE4,m[1:
0]AE3AD4,RA[1:
0]AA10U8
clk:
A14,cout:
AE8,rst:
J27,sel_alu:
AC5,sel_reg:
J28,wr:
Y28,wt_alu:
Y27
实验八指令存储器与取指令部件的设计
此实验用VerilogHDL和原理图实现
PC.v 取地址部分
modulePC(pc_in,load,rst,clk_pc,add,out);
inputrst,clk_pc,add,load;//置零开关、时钟、加1控制输入、置数开关
input[7:
0]pc_in;
outputreg[7:
0]out;
always@(posedgeclk_pc)
begin
if(rst==0)out=0;
elseif(load==0)out=pc_in;
elseif(add==1)out=out+1;//当加1控制有效时,地址加1
end
endmodule
FRQ.v 分频部分
moduleFRQ(clk_in,clk_out);
inputclk_in;
outputregclk_out;
reg[2:
0]l;
always@(posedgeclk_in)
begin
l=l+1;
clk_out=l[2];//8分频
end
endmodule
IR.v 取指令部分
moduleIR(in,add,wr,clk_ir,clk_scn,out,sel);
input[15:
0]in;//地址输入
inputwr,clk_ir,clk_scn;//显示开关,显示频率,刷新频率
outputregadd;//加1控制(与PC相连)
outputreg[7:
0]out;//数码管输出
outputreg[2:
0]sel;//数码管3-8译码器输出
reg[3:
0]data;
always@(posedgeclk_scn)
begin
sel=sel+1;
if(sel>=4)sel=0;
case(sel)
0:
data=in[15:
12];
1:
data=in[11:
8];
2:
data=in[7:
4];
3:
data=in[3:
0];
endcase
end
always@(posedgeclk_ir)
begin
if(wr==0)add=1;//每当显示1次,地址加1
elseadd=0;