16位8x8硬件乘法器设计报告Word下载.docx
《16位8x8硬件乘法器设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《16位8x8硬件乘法器设计报告Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
2.2.1
十进制加计数器设计……………………………………5
2.2.2
BCD码转二进制码BCD_B的设计…………………………5
2.2.3
8位移位寄存器reg_8的设计………………………………6
2.2.4
8位加法器adder_8的设计…………………………………7
2.2.5
1位乘法器multi_1的设计…………………………………7
2.2.6
16位移位寄存器reg_16的设计……………………………8
2.2.7
16位二进制转BCD码B_BCD的设计……………………9
2.3.软件设计
2.3.1
设计平台和开发工具………………………………………10
2.3.2
程序流程方框图……………………………………………10
2.3.3
实现功能…………………………………………………..11
2.3.4
8位乘法器的顶层设计…………………………………….11
2.4.系统测试
2.4.1
乘法器使用………………………………………………13
2.4.2
仪器设备…………………………………………………13
2.4.3
测试数据…………………………………………………14
2.5.结论……………………………………………………..14
三.测试结果仿真图…………………………………………….14
四.参考文献………………………………………………………15
五.附录:
设计说明书及使用说明书…………………15
本设计通过对一个8×
8的二进制乘法器的设计,学习利用VHDL语言来描述简单的算法,掌握利用移位相加方法实现乘法运算的基本原理。
在此次设计中该乘法器是由十进制计数器,BCD码(输入)转二进制码,8位寄存器,8位加法器,16位寄存器,8x1乘法器,二进制码转BCD码(输出显示)7个模块构成的以时序方式设计的8位乘法器,采用逐项移位相加的方法来实现相乘。
设计中乘数,被乘数的十位和个位分别采用cnt10(十进制加法器)来输入,经拼接符“&
”拼接成8位BCD码,再由BCD_B(BCD码转二进制码)转化成二进制码后计算,计算结果由B_BCD(二进制转BCD码)转化成BCD码输入到数码管中显示。
此次设计的创新点在于cnt10,BCD_B,B_BCD的设计,使得电路的输入简单,显示方式为十进制,符合人们的习惯。
使用中只要输入乘数,被乘数,按下键3(脉冲)就可以直接得出结果,显示结果稳定。
可以满足两位十进制乘法的计算。
一.设计要求
设计一个十六位(8*8)硬件乘法器(难度系数1.0)
要求:
2位十进制乘法;
能同时显示乘数,被乘数和积的信息(LED数码管)。
二.正文
2.1.1系统设计方案
方案一:
直接生成乘法器,再配合输入,输出电路,构成2位十进制乘法器,该方案简单,原理清晰明了,但占用资源比较多,且不易于了解内部结构,及其乘法原理。
方案二:
移位相加方法实现乘法运算再配合输入,输出电路,构成2位十进制乘法器,该方案原理简单,占用资源少,易于初学者掌握移位相加方法实现乘法运算的原理,但电路模块较多。
方案选择:
由于现在属初学阶段,掌握原理较为重要,故经小组讨论,一致同意采用方案二。
2.1.2系统设计原理
例如:
被乘数(M7M6M5M4M3M2M1M0)和乘数(N7N6N5N4N3N2N1N0)分别为11010101和10010011,其计算过程如下:
下面分解8位乘法器的层次结构,分为以下7个模块:
1.十进制计算模块:
使用4个十进制计数模块,输入乘数的十位个位,被乘数的十位个位。
2.BCD码转二进制模块:
实现将输入的8位BCD码转化成二进制
3.
右移寄存器模块:
这是一个8位右移寄存器,可将乘法运算中的被乘数加载于其中,同时
进行乘法运算的移位操作。
4.加法器模块:
这是一个8位加法器,进行操作数的加法运算。
5.1位乘法器模块:
完成8位与1位的乘法运算。
6.锁存器模块:
这是一个16位锁存器,同时也是一个右移寄存器,在时钟信号的控制下完成输入数值的锁存与移位。
7.二进制转BCD码模块:
将16位寄存器的值(积)转化成BCD码,配合数码管显示
十进制加计数器设计
十进制计数器在每个时钟来临时计数,clk=1时清零,用于输入乘数,被乘数的个位,十位
Libraryieee;
--0到9计数器
Useieee.std_logic_unsigned.all;
Useieee.std_logic_1164.all;
Entitycnt10is
Port(clk,clr:
instd_logic;
q:
outstd_logic_vector(3downto0));
endcnt10;
architecturebehavofcnt10is
begin
process(clk,clr)
variablecqi:
std_logic_vector(3downto0);
ifclr='
1'
thencqi:
="
0000"
;
elsifclk'
eventandclk='
then
ifcqi=9thencqi:
else
cqi:
=cqi+1;
endif;
q<
=cqi;
endprocess;
endbehav;
BCD码转二进制码BCD_B的设计
将十进制计数器产生的十位和个位合并后,为BCD码,而计算时使用二进制码计算,所以采用该模块来转化
--(0到99)BCD码转二进制码
EntityBCD_Bis
Port(a:
instd_logic_vector(7downto0);
outstd_logic_vector(7downto0));
endBCD_B;
architecturebehavofBCD_Bis
signala1,a2,a3,a4,cq:
std_logic_vector(7downto0);
process(a)
a1<
&
a(3downto0);
a2<
a(7downto4);
a3<
=a2(6downto0)&
'
0'
a4<
=a2(4downto0)&
"
000"
cq<
=a4+a3+a1;
=cq;
8位移位寄存器reg_8的设计
8位移位寄存器是在时钟(r8_clk'
eventandr8_clk='
)信号作用下,当r8_load='
时,将8位乘数加载进入;
而当r8_load='
时,对数据进行移位操作,同时定义一个信号reg8用来装载新数据及移位后的操作数,完成这些操作后,寄存器的最低位reg8(0)传送给r8_out输出。
libraryieee;
---8位移位寄存器
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityreg_8is
port(r8_clk,clr,r8_load:
instd_logic;
r8_in:
instd_logic_vector(7downto0);
r8_out:
outstd_logic);
endreg_8;
architecturearc_reg_8ofreg_8is
signalreg8:
std_logic_vector(7downto0);
begin
process(r8_clk,clr,r8_load)
then
reg8<
00000000"
elsifr8_clk'
then
ifr8_load='
=r8_in;
else
reg8(6downto0)<
=reg8(7downto1);
r8_out<
=reg8(0);
endarc_reg_8;
8位加法器adder_8的设计
该加法器由八位二进制加法器组成。
其中设计八位二进制加法器时,为了避免加法运算时产生溢出,故定义了三个信号量ss,aa,bb,将加数a8_a,a8_b分别与0连接后赋值给aa,bb,形成9位二进制数,然后aa,bb相加赋值给ss,最后将ss的低八位赋值给和a8_s,同时将ss的最高位送给a8_out输出。
--8位加法器
entityadder_8is
port(a8_a,a8_b:
a8_s:
outstd_logic_vector(7downto0);
a8_out:
endadder_8;
architecturearc_adder_8ofadder_8is
signalss:
std_logic_vector(8downto0);
signalaa,bb:
aa<
='
a8_a;
bb<
a8_b;
ss<
=aa+bb;
a8_s<
=ss(7downto0);
a8_out<
=ss(8);
endarc_adder_8;
1位乘法器multi_1的设计
利用if语句来完成8位二进制数与1位二进制的乘法运算,最后将结果送到m1_out输出。
即当m1_x为1时,m1_out输出为m