Booth算法-乘法器实验报告.doc

上传人:scccc 文档编号:12063635 上传时间:2021-12-01 格式:DOC 页数:7 大小:59KB
返回 下载 相关 举报
Booth算法-乘法器实验报告.doc_第1页
第1页 / 共7页
Booth算法-乘法器实验报告.doc_第2页
第2页 / 共7页
Booth算法-乘法器实验报告.doc_第3页
第3页 / 共7页
Booth算法-乘法器实验报告.doc_第4页
第4页 / 共7页
Booth算法-乘法器实验报告.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《Booth算法-乘法器实验报告.doc》由会员分享,可在线阅读,更多相关《Booth算法-乘法器实验报告.doc(7页珍藏版)》请在三一文库上搜索。

1、Booth乘法器实验报告一、实验目的1、理解并掌握乘法器的原理。2、理解并掌握Booth算法,及其实现方式。二、实验原理1、乘法规律 假定是十进制数的各位要么为0要么为1,例如1000*1001被乘数 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)从右到左用乘数的每一位乘以被乘数,每一次乘得的中间结果比上一次的结果往左移一位。(2)积的位数比被乘数和乘数的位数要多得多。(3)若十进制各位限制为0或1,则乘法变成 若乘数位为1,则简单的复制被乘数到合

2、适的位置; 若乘数位是0,则在合适的位置置0。2、有符号数乘法Booth乘法器(1)1的分类Booth算法的关键在于把1分类为开始、中间、结束3种,如下图1的开始1的中间0 11 11 01的结束Booth算法1的分类示意图(2)算法描述 以前乘法器的第一步是根据乘数的最低位来决定是否将被乘数加到中间结果积,而Booth算法则是根据乘数的相邻两位来决定操作,第一步根据相邻2位的4种情况来进行加或减操作,第二步仍然是将积寄存器右移。算法描述如下:根据当前位和其右边的位,作如下操作 00:0的中间,无任何操作;推荐精选 01:1的结束,将被乘数加到积的左半部分; 10:1的开始,积的左半部分减去被

3、乘数; 11:1的中间,无任何操作。 将积寄存器算术右移一位。对于Booth算法,举例如下:210*-310=-610 ,或者说是00102*11012=1111 10102 。运算过程见下表。Booth算法运算过程重 复 步 骤被 乘 数(md) 积 (p)0初始值 00100000 1101 011:10->积=积-被乘数2:积右移一位 00101110 1101 01111 0110 121:01->积=积+被乘数2:积右移一位 00100001 0110 10000 1011 031:10->积=积-被乘数2:积右移一位 00101110 1011 01111 010

4、1 141:11->nop2:积右移一位 00101111 0101 11111 1010 1三、实验步骤1、在PC机上完成ISE的安装。2、完成工程设计。3、下载。四、实验现象1、Modelsim 按照实例给出仿真结果2、输入输出规则(1)输入的4位被乘数md3md0对应四个开关。(2)输入的4为乘数mr3mr0对应四个按键。(3)乘积product的后两位对应LED点。3、操作细节Booth算法实验重 复 步 骤被 乘 数(md) 积 (p)被 乘 数(-7)10乘数是(6)100初始值10010000 0110 011:10->积=积-被乘数2:积右移一位10010000 0

5、110 00000 0011 021:01->积=积+被乘数2:积右移一位 10010111 0011 00011 1001 1推荐精选31:10->积=积-被乘数2:积右移一位 10010011 1001 10001 1100 141:11->nop2:积右移一位 10011010 1100 11101 0110 0重 复 步 骤被 乘 数(md) 积 (p)被 乘 数(-4)10乘数是(-5)100初始值 11000000 1011 011:10->积=积-被乘数2:积右移一位 11000100 1011 00010 0101 121:01->积=积+被乘数2

6、:积右移一位 11000010 0101 10001 0010 131:10->积=积-被乘数2:积右移一位 11001101 0010 11110 1001 041:11->nop2:积右移一位 11000010 1001 00001 0100 1五、心得体会通过这次实验,真正领悟到所谓的“软件思想”与“硬件理念”的不同。脱开VHDL,我们用学过的任意高级语言编程,我们可以对变量循环赋值、可以随赋值随利用,但这些是纯的软件思想,硬件无法立即反应与实现,信号量在赋值方面尤其体现了这一点。实验中,由于积寄存器在一步操作中既要做加减运算,又要右移,反复操作了很多次,却始终无法完成一个信

7、号量在一个进程中完成两个操作,也试验了在两个进程中分别完成,但结果又成了多驱动问题。追究了半天原因,想到了用能“即赋值即使用”的变量来作为“媒介”,用变量来完成加减运算,而积寄存器只需要从“媒介”中右移一位取值,这样可以既运算又完成右移。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity Booth isport( md:in std_logic_vector(3 downto 0); mr:in std_logic_vector(3 downto 0); p: buffer std_l

8、ogic_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);signal t:std_logic_vector(3 downto 0);shared variable c:std_logic_vector(4 downto 0);shared variable b:std_logic_vector(8 downto 0);begin process(cl

9、k) begin c(0):='0' if(clk'event and clk='1')then b(8 downto 0):=p(8 downto 0); if(count="000")then p(8 downto 5)<="0000"p(4 downto 1)<=mr(3 downto 0);p(0)<='0' b(8 downto 5):="0000"b(4 downto 1):=mr(3 downto 0);b(0):='0' t(3

10、downto 0)<=not md(3 downto 0)+'1' final<='0' elseif(p(1 downto 0)="01")thenb(8 downto 5):=b(8 downto 5)+md(3 downto 0);elsif(p(1 downto 0)="10")thenb(8 downto 5):=b(8 downto 5)+t(3 downto 0);end if; p(8)<=b(8);p(7 downto 0)<=b(8 downto 1); end if;count

11、<=count+'1' if(count="100")then count<="000" final<='1' end if; end if; end process;-process(clk) /it is also can do the same function- begin- c(0):='0'- if(clk'event and clk='1')then- b(8 downto 0):=p(8 downto 0);- case count is- when

12、 "000"=>- p(8 downto 5)<="0000"p(4 downto 1)<=mr(3 downto 0);p(0)<='0'- 推荐精选- b(8 downto 5):="0000"b(4 downto 1):=mr(3 downto 0);b(0):='0'- t(3 downto 0)<=not md(3 downto 0)+'1'- count<="001" - final<='0'- w

13、hen "001"=>- - if(p(1 downto 0)="01")then- b(8 downto 5):=b(8 downto 5)+md(3 downto 0);- elsif(p(1 downto 0)="10")then- b(8 downto 5):=b(8 downto 5)+t(3 downto 0);- end if;- count<="010" - p(8)<=b(8);p(7 downto 0)<=b(8 downto 1); - when "010&q

14、uot;=> - if(p(1 downto 0)="01")then- b(8 downto 5):=b(8 downto 5)+md(3 downto 0);- elsif(p(1 downto 0)="10")then- b(8 downto 5):=b(8 downto 5)+t(3 downto 0); - end if; - p(8)<=b(8);p(7 downto 0)<=b(8 downto 1);- count<="011" - when "011"=>- if(p

15、(1 downto 0)="01")then- b(8 downto 5):=b(8 downto 5)+md(3 downto 0);- elsif(p(1 downto 0)="10")then- b(8 downto 5):=b(8 downto 5)+t(3 downto 0);- end if;- p(8)<=b(8);p(7 downto 0)<=b(8 downto 1);- count<="100" - when "100"=>- if(p(1 downto 0)="

16、;01")then- b(8 downto 5):=b(8 downto 5)+md(3 downto 0);- elsif(p(1 downto 0)="10")then- b(8 downto 5):=b(8 downto 5)+t(3 downto 0);- end if;- count<="000" - final<='1' - p(8)<=b(8);p(7 downto 0)<=b(8 downto 1);- when others=>count<="000" ;- end case;- end if;- end process; end rtl;推荐精选 (注:可编辑下载,若有不当之处,请指正,谢谢!) 推荐精选

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1