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的结束,将被乘数加到积的左半部分;0111101的结束被乘数100010乘数×1001101000000000001000积1001000101的中间1的开始10:1的开始,积的左半部分减去被乘数;11:1的中间,无任何操作。②将积寄存器算术右移一位。对于Booth算法,举例如下:210*-310=-610,或者说是00102*11012=111110102。运算过程见下表。Booth算法运算过程重复步骤被乘数(md)积(p)0初始值001000001101011:10-积=积-被乘数2:积右移一位001011101101011110110121:01-积=积+被乘数2:积右移一位001000010110100001011031:10-积=积-被乘数2:积右移一位001011101011011110101141:11-nop2:积右移一位0010111101011111110101三、实验步骤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)100初始值100100000110011:10-积=积-被乘数2:积右移一位100100000110000000011021:01-积=积+被乘数2:积右移一位100101110011000111001131:10-积=积-被乘数10010011100112:积右移一位00011100141:11-nop2:积右移一位1001101011001110101100重复步骤被乘数(md)积(p)被乘数(-4)10乘数是(-5)100初始值110000001011011:10-积=积-被乘数2:积右移一位110001001011000100101121:01-积=积+被乘数2:积右移一位110000100101100010010131:10-积=积-被乘数2:积右移一位110011010010111101001041:11-nop2:积右移一位1100001010010000101001五、心得体会通过这次实验,真正领悟到所谓的“软件思想”与“硬件理念”的不同。脱开VHDL,我们用学过的任意高级语言编程,我们可以对变量循环赋值、可以随赋值随利用,但这些是纯的软件思想,硬件无法立即反应与实现,信号量在赋值方面尤其体现了这一点。实验中,由于积寄存器在一步操作中既要做加减运算,又要右移,反复操作了很多次,却始终无法完成一个信号量在一个进程中完成两个操作,也试验了在两个进程中分别完成,但结果又成了多驱动问题。追究了半天原因,想到了用能“即赋值即使用”的变量来作为“媒介”,用变量来完成加减运算,而积寄存器只需要从“媒介”中右移一位取值,这样可以既运算又完成右移。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityBoothisport(md:instd_logic_vector(3downto0);mr:instd_logic_vector(3downto0);p:bufferstd_logic_vector(8downto0);clk:instd_logic;final:bufferstd_logic);endentity;architecturertlofBoothissignalcount:std_logic_vector(2downto0);signalt:std_logic_vector(3downto0);sharedvariablec:std_logic_vector(4downto0);sharedvariableb:std_logic_vector(8downto0);beginprocess(clk)beginc(0):='0';if(clk'eventandclk='1')thenb(8downto0):=p(8downto0);if(count=000)thenp(8downto5)=0000;p(4downto1)=mr(3downto0);p(0)='0';b(8downto5):=0000;b(4downto1):=mr(3downto0);b(0):='0';t(3downto0)=notmd(3downto0)+'1';final='0';elseif(p(1downto0)=01)thenb(8downto5):=b(8downto5)+md(3downto0);elsif(p(1downto0)=10)thenb(8downto5):=b(8downto5)+t(3downto0);endif;p(8)=b(8);p(7downto0)=b(8downto1);endif;count=count+'1';if(count=100)thencount=000;final='1';endif;endif;endprocess;--process(clk)/itisalsocandothesamefunction--begin--c(0):='0';--if(clk'eventandclk='1')then--b(8downto0):=p(8downto0);--casecountis--when000=--p(8downto5)=0000;p(4downto1)=mr(3downto0);p(0)='0';----b(8downto5):=0000;b(4downto1):=mr(3downto0);b(0):='0';--t(3downto0)=notmd(3downto0)+'1';--count=001;--final='0';--when001=----if(p(1downto0)=01)then--b(8downto5):=b(8downto5)+md(3downto0);--elsif(p(1downto0)=10)then--b(8downto5):=b(8downto5)+t(3downto0);--endif;--count=010;--p(8)=b(8);p(7downto0)=b(8downto1);--when010=--if(p(1downto0)=01)then--b(8downto5):=b(8downto5)+md(3downto0);--elsif(p(1downto0)=10)then--b(8downto5):=b(8downto5)+t(3downto0);--endif;--p(8)=b(8);p(7downto0)=b(8downto1);--count=011;--when011=--if(p(1downto0)=01)then--b(8downto5):=b(8downto5)+md(3downto0);--elsif(p(1downto0)=10)then--b(8downto5):=b(8downto5)+t(3downto0);--endif;--p(8)=b(8);p(7downto0)=b(8downto1);--count=100;--when100=--if(p(1downto0)=01)then--b(8downto5):=b(8downto5)+md(3downto0);--elsif(p(1downto0)=10)then--b(8downto5):=b(8downto5)+t(3downto0);--endif;--count=000;--final='1';--p(8)=b(8);p(7downto0)=b(8downto1);--whenothers=count=000;--endcase;--endif;--endprocess;endrtl;