Booth乘法器实验报告.doc

上传人:b****1 文档编号:229925 上传时间:2022-10-07 格式:DOC 页数:3 大小:74KB
下载 相关 举报
Booth乘法器实验报告.doc_第1页
第1页 / 共3页
Booth乘法器实验报告.doc_第2页
第2页 / 共3页
Booth乘法器实验报告.doc_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Booth乘法器实验报告.doc

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

Booth乘法器实验报告.doc

运算器部件实验:

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;--进程结束

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

当前位置:首页 > 工程科技 > 机械仪表

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

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