Booth算法_乘法器实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Booth 乘法器实验报告

一、实验目的

1、理解并掌握乘法器的原理。

2、理解并掌握Booth 算法,及其实现方式。

二、实验原理

1、乘法规律

假定是十进制数的各位要么为0要么为1,例如1000*1001

从上面可以得出乘法的基本规律:

(1)从右到左用乘数的每一位乘以被乘数,每一次乘得的中间结果比上一次的结果往左移一位。

(2)积的位数比被乘数和乘数的位数要多得多。 (3)若十进制各位限制为0或1,则乘法变成

①若乘数位为1,则简单的复制被乘数到合适的位置; ②若乘数位是0,则在合适的位置置0。 2、有符号数乘法—Booth 乘法器 (1)1的分类

Booth 算法的关键在于把1分类为开始、中间、结束3种,如下图

Booth 算法1的分类示意图 (2)算法描述

以前乘法器的第一步是根据乘数的最低位来决定是否将被乘数加到中间结果积,而Booth 算法则是根据乘数的相邻两位来决定操作,第一步根据相邻2位的4种情况来进行加或减操作,第二步仍然是将积寄存器右移。算法描述如下: ①根据当前位和其右边的位,作如下操作 00:0的中间,无任何操作;

01:1的结束,将被乘数加到积的左半部分;

1的结束

被乘数 1 0 0 010 乘数 × 1 0 0 110 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0

积 1 0 0 1 0 0 010

1的中间 1的开始

10:1的开始,积的左半部分减去被乘数; 11:1的中间,无任何操作。

②将积寄存器算术右移一位。

对于Booth算法,举例如下:2

10*-3

10

=-6

10

,或者说是0010

2

*1101

2

=1111 1010

2

运算过程见下表。

Booth算法运算过程

1 1:10->积=积-被乘数

2:积右移一位 0010 1110 1101 0

1111 0110 1

2 1:01->积=积+被乘数

2:积右移一位 0010 0001 0110 1

0000 1011 0

3 1:10->积=积-被乘数

2:积右移一位 0010 1110 1011 0

1111 0101 1

4 1:11->nop

2:积右移一位 0010 1111 0101 1

1111 1010 1

三、实验步骤

1、在PC机上完成ISE的安装。

2、完成工程设计。

3、下载。

四、实验现象

1、Modelsim

按照实例给出仿真结果

2、输入输出规则

(1)输入的4位被乘数md3~md0对应四个开关。

(2)输入的4为乘数mr3~mr0对应四个按键。

(3)乘积product的后两位对应LED点。

3、操作细节

Booth算法实验

重复步骤被乘数(md)积(p)

被乘数(-7)

10

乘数是(6)

10

0 初始值1001 0000 0110 0

1 1:10->积=积-被乘数

2:积右移一位1001 0000 0110 0

0000 0011 0

2 1:01->积=积+被乘数

2:积右移一位 1001 0111 0011 0

0011 1001 1

3 1:10->积=积-被乘数 1001 0011 1001 1

2:积右移一位0001 1100 1

4 1:11->nop

2:积右移一位 1001 1010 1100 1

1101 0110 0

重复步骤被乘数(md)积(p)

被乘数(-4)

10

乘数是(-5)

10

0 初始值 1100 0000 1011 0

1 1:10->积=积-被乘数

2:积右移一位 1100 0100 1011 0

0010 0101 1

2 1:01->积=积+被乘数

2:积右移一位 1100 0010 0101 1

0001 0010 1

3 1:10->积=积-被乘数

2:积右移一位 1100 1101 0010 1

1110 1001 0

4 1:11->nop

2:积右移一位 1100 0010 1001 0

0001 0100 1

五、心得体会

通过这次实验,真正领悟到所谓的“软件思想”与“硬件理念”的不同。脱开VHDL,我们用学过的任意高级语言编程,我们可以对变量循环赋值、可以随赋值随利用,但这些是纯的软件思想,硬件无法立即反应与实现,信号量在赋值方面尤其体现了这一点。实验中,由于积寄存器在一步操作中既要做加减运算,又要右移,反复操作了很多次,却始终无法完成一个信号量在一个进程中完成两个操作,也试验了在两个进程中分别完成,但结果又成了多驱动问题。追究了半天原因,想到了用能“即赋值即使用”的变量来作为“媒介”,用变量来完成加减运算,而积寄存器只需要从“媒介”中右移一位取值,这样可以既运算又完成右移。

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity Booth is

port

( md:in std_logic_vector(3 downto 0);

mr:in std_logic_vector(3 downto 0);

p: buffer std_logic_vector(8 downto 0);

clk:in std_logic;

final:buffer std_logic

);

end entity;

architecture rtl of Booth is

signal count:std_logic_vector(2 downto 0);

相关文档
最新文档