计组4位乘法器实验报告.docx
《计组4位乘法器实验报告.docx》由会员分享,可在线阅读,更多相关《计组4位乘法器实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
计组4位乘法器实验报告
实验4位乘法器实验报告
姓名:
XXX
学号:
XXX
专业:
计算机科学与技术
课程名称:
计算机组成
同组学生姓名:
无
实验时间:
实验地点:
指导老师:
XXX
一、实验目的和要求
1.熟练掌握乘法器的工作原理和逻辑功能
二、实验内容和原理
实验内容:
根据课本上例3-7的原理,来实现4位移位乘法器的设计。
具体要求:
1.乘数和被乘数都是4位
2.生成的乘积是8位的
3.计算中涉及的所有数都是无符号数
4.需要设计重置功能
5.需要分步计算出结果(4位乘数的运算,需要四步算出结果)
实验原理:
1.乘法器原理图
2.本实验的要求:
1.需要设计按钮和相应开关,来增加乘数和被乘数
2.每按一下M13,给一个时钟,数码管的左边两位显示每一步的乘积
3.4步计算出最终结果后,LED灯亮,按RESET重新开始计算
三、主要仪器设备
1.Spartan-III开发板1套
2.装有ISE的PC机1台
四、操作方法与实验步骤
实验步骤:
1.创建新的工程和新的源文件
2.编写verilog代码(top模块、display模块、乘法运算模块、去抖动模块以及UCF引脚)
3.进行编译
4.进行Debug工作,通过编译。
5..生成FPGA代码,下载到实验板上并调试,看是否与实现了预期功能
操作方法:
TOP:
modulealu_top(clk,switch,o_seg,o_sel);
inputwireclk;
inputwire[4:
0]switch;
outputwire[7:
0]o_seg;//只需七段显示数字,不用小数点
outputwire[3:
0]o_sel;//4个数码管的位选
wire[15:
0]disp_num;
reg[15:
0]i_r,i_s;
wire[15:
0]disp_code;
wireo_zf;//zerodetector
initial
begin
i_r<=16'h1122;//0x1122
i_s<=16'h3344;//0x3344
end
aluM1(i_r,i_s,switch[4:
2],o_zf,disp_code);
displayM3(clk,disp_num,o_seg,o_sel);
assigndisp_num=switch[0]?
disp_code:
(switch[1]?
i_s:
i_r);
endmodule
ALU:
modulealu(i_r,i_s,switch,o_zf,disp_code);
input[15:
0]i_r,i_s;
input[2:
0]switch;
outputrego_zf;//zerodetector
outputreg[15:
0]disp_code;
always@(switch[2:
0])
begin
case(switch)
3'b000:
disp_code<=i_r&i_s;
3'b001:
disp_code<=i_r|i_s;
3'b010:
disp_code<=i_r+i_s;
3'b110:
disp_code<=i_r-i_s;
3'b111:
disp_code<=i_r1:
0;
endcase
if(disp_code==16'b0)
o_zf<=1;
end
endmodule
DISPLAY:
moduledisplay(clk,disp_num,o_seg,o_sel);
inputwireclk;
inputwire[15:
0]disp_num;//显示的数据
outputreg[7:
0]o_seg;//七段,不需要小数点
outputreg[3:
0]o_sel;//4个数码管的位选
reg[3:
0]code=4'b0;
reg[15:
0]count=15'b0;
always@(posedgeclk)
begin
case(count[15:
14])
2'b00:
begin
o_sel<=4'b1110;
code<=disp_num[3:
0];
end
2'b01:
begin
o_sel<=4'b1101;
code<=disp_num[7:
4];
end
2'b10:
begin
o_sel<=4'b1011;
code<=disp_num[11:
8];
end
2'b11:
begin
o_sel<=4'b0111;
code<=disp_num[15:
12];
end
endcase
case(code)
4'b0000:
o_seg<=8'b11000000;
4'b0001:
o_seg<=8'b11111001;
4'b0010:
o_seg<=8'b10100100;
4'b0011:
o_seg<=8'b10110000;
4'b0100:
o_seg<=8'b10011001;
4'b0101:
o_seg<=8'b10010010;
4'b0110:
o_seg<=8'b10000010;
4'b0111:
o_seg<=8'b11111000;
4'b1000:
o_seg<=8'b10000000;
4'b1001:
o_seg<=8'b10010000;
4'b1010:
o_seg<=8'b10001000;
4'b1011:
o_seg<=8'b10000011;
4'b1100:
o_seg<=8'b11000110;
4'b1101:
o_seg<=8'b10100001;
4'b1110:
o_seg<=8'b10000110;
4'b1111:
o_seg<=8'b10001110;
default:
o_seg<=8'b10000000;
endcase
count<=count+1;
end
endmodule
UCF:
Net“clk”loc=”T9”;
Net“o_seg[0]”loc=”E14”;
Net“o_seg[1]”loc=”G13”;
Net“o_seg[2]”loc=”N15”;
Net“o_seg[3]”loc=”P15”;
Net“o_seg[4]”loc=”R16”;
Net“o_seg[5]”loc=”F13”;
Net“o_seg[6]”loc=”N16”;
Net“o_seg[7]”loc=”P16”;
Net“o_sel[0]”loc=”D14”;
Net“o_sel[1]”loc=”G14”;
Net“o_sel[2]”loc=”F14”;
Net“o_sel[3]”loc=”E13”;
Net“switch[0]”loc=”M10”;
Net“switch[1]”loc=”F3”;
Net“switch[2]”loc=”G4”;
Net“switch[3]”loc=”E3”;
Net“switch[4]”loc=”F4”;
2.ALU控制器的实现:
•输入用2+6=8个拨动开关
•ALUop控制模式:
2个拨动开关
•功能域Funct控制模式:
6个拨动开关
•输出用3个LED显示
TOP:
modulealuc_top(clk,switch,o_seg,o_sel);
inputwireclk;
inputwire[7:
0]switch;
outputwire[7:
0]o_seg;//只需七段显示数字,不用小数点
outputwire[3:
0]o_sel;//4个数码管的位选
wire[15:
0]disp_num;
reg[15:
0]i_r,i_s;
wire[15:
0]disp_code;
wire[2:
0]alu;
initial
begin
i_r<=16'h1122;//0x1122
i_s<=16'h3344;//0x3344
end
alucM1(switch[7:
2],alu);
aluM2(i_r,i_s,alu,disp_code);
displayM3(clk,disp_num,o_seg,o_sel);
assigndisp_num=switch[0]?
disp_code:
(switch[1]?
i_r:
i_s);
endmodule
ALU:
modulealu(i_r,i_s,alu,disp_code);
input[15:
0]i_r,i_s;
input[2:
0]alu;
outputreg[15:
0]disp_code;
begin
case(alu)
3'b000:
disp_code<=i_r&i_s;
3'b001:
disp_code<=i_r|i_s;
3'b010:
disp_code<=i_r+i_s;
3'b110:
disp_code<=i_r-i_s;
3'b111:
disp_code<=i_r1:
0;
endcase
end
endmodule
DISPLAY:
moduledisplay(clk,disp_num,o_seg,o_sel);
inputwireclk;
inputwire[15:
0]disp_num;//显示的数据
outputreg[7:
0]o_seg;//七段,不需要小数点
outputreg[3:
0]o_sel;//4个数码管的位选
reg[3:
0]code=4'b0;
reg[15:
0]count=15'b0;
always@(posedgeclk)
begin
case(count[15:
14])
2'b00:
begin
o_sel<=4'b1110;
code<=disp_num[3:
0];
end
2'b01:
begin
o_sel<=4'b1101;
code<=disp_num[7:
4];
end
2'b10:
begin
o_sel<=4'b1011;
code<=disp_num[11:
8];
end
2'b11:
begin
o_sel<=4'b0111;
code<=disp_num[15:
12];
end
endcase
case(code)
4'b0000:
o_seg<=8'b11000000;
4'b0001:
o_seg<=8'b11111001;
4'b0010:
o_seg<=8'b10100100;
4'b0011:
o_seg<=8'b10110000;
4'b0100:
o_seg<=8'b10011001;
4'b0101:
o_seg<=8'b10010010;
4'b0110:
o_seg<=8'b10000010;
4'b0111:
o_seg<=8'b11111000;
4'b1000:
o_seg<=8'b10000000;
4'b1001:
o_seg<=8'b10010000;
4'b1010:
o_seg<=8'b10001000;
4'b1011:
o_seg<=8'b10000011;
4'b1100:
o_seg<=8'b11000110;
4'b1101:
o_seg<=8'b10100001;
4'b1110:
o_seg<=8'b10000110;
4'b1111:
o_seg<=8'b10001110;
default:
o_seg<=8'b10000000;
endcase
count<=count+1;
end
endmodule
ALUC:
modulealuc(inputwire[7:
2]switch,outputreg[2:
0]alu);
always@(switch)
begin
if(switch[2]==0&&switch[3]==0)
alu=3’b010;
elseif(switch[2]==0&&switch[3]==1)
alu=3’b110;
elseif(switch[2]==1&&switch[4]==0&&switch[5]==0&&switch[6]==0&&switch[7]==0)
alu=3’b010;
else
if(switch[2]==1&&switch[4]==0&&switch[5]==0&&switch[6]==1&&switch[7]==0)
alu=3’b110;
else
if(switch[2]==1&&switch[4]==0&&switch[5]==1&&switch[6]=0&&switch[7]==0)
alu=3’b000;
else
if(switch[2]==1&&switch[4]==0&&switch[5]==1&&switch[6]=0&&switch[7]==1)
alu=3’b001;
else
if(switch[2]==1&&switch[4]==1&&switch[5]==0&&switch[6]=1&&switch[7]==1)
alu=3’b111;
end
endmodule
UCF:
Net“clk”loc=”T9”;
Net“o_seg[0]”loc=”E14”;
Net“o_seg[1]”loc=”G13”;
Net“o_seg[2]”loc=”N15”;
Net“o_seg[3]”loc=”P15”;
Net“o_seg[4]”loc=”R16”;
Net“o_seg[5]”loc=”F13”;
Net“o_seg[6]”loc=”N16”;
Net“o_seg[7]”loc=”P16”;
Net“o_sel[0]”loc=”D14”;
Net“o_sel[1]”loc=”G14”;
Net“o_sel[2]”loc=”F14”;
Net“o_sel[3]”loc=”E13”;
Net“switch[0]”loc=”M10”;
Net“switch[1]”loc=”F3”;
Net“switch[2]”loc=”G4”;
Net“switch[3]”loc=”E3”;
Net“switch[4]”loc=”F4”;
Net“switch[5]”loc=”G5”;
Net“switch[6]”loc=”E4”;
Net“switch[7]”loc=”H4”;
五、实验结果与分析
程序运行成功后,将代码下载到实验板spartan3上验证。
1.ALU的实现:
1)拨动SWITCH[1:
0]=00,显示操作数A=1122,SWITCH[1:
0]=01,显示操作数B=3344.
2)拨动switch[0]=1,将显示运算结果如下:
2.ALU控制器的实现:
1)拨动SWITCH[1:
0]=00,显示操作数A=1122,SWITCH[1:
0]=01,显示操作数B=3344.
2)拨动switch[0]=1,将显示运算结果如下:
六、讨论、心得
这次实验,我做好好久,中间一直出错。
现在反思,关键可能是因为我对乘法器的原理掌握不够和对verilog语言的不熟练。
在以后的学习中,一定要注意课本知识和实验应用的结合。