booth乘法器实验

booth乘法器实验

在计算两个补码相乘时,可以通过Booth算法来实现定点补码一位乘的功能。布斯(Booth)算法采用相加和相减的操作计算补码数据的乘积,Booth算法对乘数从低位开始判断,根据后两个数据位的情况决定进行加法、减法还是仅仅进行移位操作。讨论当相乘的两个数中有一个或二个为负数的情况,在讨论补码乘法运算时,对被乘数或部分积的处理上与原码乘法有某些类似,差别仅表现在被乘数和部分积的符号位要和数值一起参加运算。

Booth算法中1的分类示意:


Booth算法中1的分类

booth乘法器实验_第1张图片

Booth算法根据乘数的相邻两位来决定操作,第一步根据相邻两位的4种情况来进行加或减操作,第二步仍然是将积寄存器右移。算法描述如下

(1)    根据当前位和其右边的位,做如下操作:

00:0的中间,无任何操作

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

10:1的开始,积的左半部分减去被乘数

11:1的中间,无任何操作

              2)将积寄存器右移一位

 

一.实验现象及结果分析

 

实现4位数的的booth算法(有符号数乘法)

输入输出规则对应如下:

(1)       输入的4位被乘数(multiplicand)md3-md0对应开关SD11-SD8

(2)       输入的4位乘数(multiplier)mr3-mr0对应开关SD7-SD0

(3)       按单脉冲按钮,输入脉冲

(4)       乘积product p8-p0对应灯A8-A0

(5)       当计算结束时,final信号为1,对应灯R7

根据以上操作细节,操作步骤及运算结果如下:

重复

步骤

被乘数md

积p

 

 

被乘数(-7)10

乘数(6)10

0

初始值

1001

0000 0110 0

1

1:00不操作

1001

0000 0110 0

2:右移一位

1001

0000 0011 0

2

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

1001

0111 0011 0

2:右移一位

1001

0011 1001 1

3

1:11不操作

1001

0011 1001 1

2:右移一位

1001

0001 1100 1

4

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

1001

1010 1100 1

2:右移一位

1001

1101 0110 0

 


源代码:

 

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity multiply is

         port

         (

                   clr,clk      :in std_logic;

                   a,b          :in std_logic_vector(3 downto 0);

                   p            :buffer std_logic_vector(8 downto0);

                   final        :out std_logic

                  

         );

end entity multiply;

architecture rtl of multiply is

signal m:std_logic_vector(8 downto0):=a&"00000";

signal boothstep : std_logic_vector(2downto 0):="000";

signal flag:std_logic_vector(1 downto 0);

signal temp:std_logic_vector(8 downto 0);

 

begin

process(flag)is

begin

         if(flag="01")then

                   temp<=p+m;

         elsif(flag="10")then

                   temp<=p-m;

         else

                   temp<=p;

         endif;

end process;

flag<=p(1 downto 0);

process(clk,clr)is

begin

         if(clr='0')then

                   p<="0000"&b&'0';

         elsif(clk'eventand clk='1')then

                   p<=temp(8)&temp(8downto 1);

         endif;

end process;

process(clk)is

begin

         ifclr='0' then

                   final<='0';

                   boothstep<="000";

         elsif(clk'eventand clk='1')then

                   if(boothstep="011")then

                            final<='1';

                            boothstep<="000";

                  else

                            boothstep<=boothstep+'1';

                            final<='0';

                   endif;

         endif;

end process;

end rtl;


你可能感兴趣的:(vhdl)