Booth乘法器实验报告.doc
《Booth乘法器实验报告.doc》由会员分享,可在线阅读,更多相关《Booth乘法器实验报告.doc(3页珍藏版)》请在冰豆网上搜索。
运算器部件实验:
Booth乘法器
班级:
软件工程
一、实验目的
理解并掌握乘法器的原理。
二、实验原理
Booth算法是一种十分有效的计算有符号数乘法的算法。
算法的新型之处在于减法也可用于计算乘积。
Booth发现加法和减法可以得到同样的结果。
因为在当时移位比加法快得多,所以Booth发现了这个算法,Booth算法的关键在于把1分类为开始、中间、结束三种,如下图所示
当然一串0或者1的时候不操作,所以Booth算法可以归类为以下四种情况:
Booth算法根据乘数的相邻2位来决定操作,第一步根据相邻2位的4中情况来进行加或减操作,第二部仍然是将积寄存器右移,算法描述如下:
(1)根据当前为和其右边的位,做如下操作:
00:
0的中间,无任何操作;
01:
1的结束,将被乘数加到积的左半部分;
10:
1的开始,积的左半部分减去被乘数;
11:
1的中间,无任何操作。
(2)将积寄存器右移1位。
因为Booth算法是有符号数的乘法,因此积寄存器移位的时候,为了保留符号位,进行算术右移。
同时如果乘数或者被乘数为负数,则其输入为该数的补码,若积为负数,则输出结果同样为该数的补码。
三、实验步骤
(1)打开QuartusII
(2)将子板上的JTAG端口和PC机的并行口用下载电缆连接,打开试验台电源。
(3)执行Tools→Programmer命令,将booth_multiplier.sof下载到FPGA中。
(4)在实验台上通过模式开关选择FPGA-CPU独立调试模式010.
(5)将开关CLKSEL拨到0,将短路子DZ3短接且短路子DZ4断开,使FPGA-CPU所需要的时钟使用正单脉冲时钟。
四、实验现象
实验结果见下表:
重复
步骤
被乘数(md)
积(p)
被乘数是(-7)10
乘数是(8)10
0
初始值
1001
000001100
1
1:
00->nop
1001
000001100
2:
积右移一位
1001
000000110
2
1:
10->积=积-被乘数
1001
011100110
2:
积右移一位
1001
001110011
3
1:
11->nop
1001
001110011
2:
积右移一位
1001
000111001
4
1:
01->积=积+被乘数
1001
101011001
2:
积右移一位
1001
110101100
重复
步骤
被乘数(md)
积(p)
被乘数是(-4)10
乘数是(-5)10
0
初始值
1100
000010110
1
1:
10->积=积-被乘数
1100
010010110
2:
积右移一位
1100
001001011
2
1:
11->nop
1100
001001011
2:
积右移一位
1100
000100101
3
1:
01->积=积+被乘数
1100
110100101
2:
积右移一位
1100
111010010
4
1:
10->积=积-被乘数
1100
001010010
2:
积右移一位
1100
000101001
五、具体代码实现
端口声明:
port
(clk:
instd_logic;
md:
instd_logic_vector(3downto0);
mr:
instd_logic_vector(3downto0);
p:
outstd_logic_vector(8downto0);
final:
outstd_logic);
信号量声明:
signalp_s:
std_logic_vector(8downto0);
signalcounter:
std_logic_vector(3downto0):
="0000";--counter
具体算法实现如下:
process(clk)is
begin
if(clk'eventandclk='1')then--时钟沿到来
if(counter="0000")then
p_s(8downto0)<="0000"&mr(3downto0)&"0";--进行初始化操作
elsif(counter(0)='0')then
p_s(8downto0)<=p_s(8)&p_s(8downto1);--计数为偶数时进行移位操作
elsif(counter(0)='1')then--计数位奇数是进行加或减操作
--由于计算过程中会进行移位操作,所以p_s(1downto0)始终表示当前位和当前位的右边--一位
if(p_s(1downto0)="10")then
p_s(8downto5)<=p_s(8downto5)+((notmd)+"0001");--减法操作
elsif(p_s(1downto0)="01")then
p_s(8downto5)<=p_s(8downto5)+md(3downto0);--加法操作
endif;
endif;
if(counter<"1001")then--计数器counter及final输出的操作
counter<=counter+"0001";
elsif(counter="1001")then
final<='1';
counter<="0000";
else
final<='0';
endif;
p<=p_s;
endif;
endprocess;--进程结束