计组4位乘法器实验报告.docx

上传人:b****5 文档编号:6076840 上传时间:2023-01-03 格式:DOCX 页数:14 大小:266.60KB
下载 相关 举报
计组4位乘法器实验报告.docx_第1页
第1页 / 共14页
计组4位乘法器实验报告.docx_第2页
第2页 / 共14页
计组4位乘法器实验报告.docx_第3页
第3页 / 共14页
计组4位乘法器实验报告.docx_第4页
第4页 / 共14页
计组4位乘法器实验报告.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

计组4位乘法器实验报告.docx

《计组4位乘法器实验报告.docx》由会员分享,可在线阅读,更多相关《计组4位乘法器实验报告.docx(14页珍藏版)》请在冰豆网上搜索。

计组4位乘法器实验报告.docx

计组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_r

1:

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_r

1:

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语言的不熟练。

在以后的学习中,一定要注意课本知识和实验应用的结合。

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

当前位置:首页 > 解决方案 > 其它

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

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