booth算法

booth算法booth 算法 1 booth 算法是什么 2 一个关于 Booth 算法的文章 3 一个关于 Booth 算法的文章 4 乘数按三位一组进行划分 5 Radix 4Booth 乘法器 1 booth 算法是什么 将乘数看作从最低位开始的一串二进制数字 Booth 算法的基本思路是 对于具有连续 0 和 1 的组 需要产生的部分积较少 对于乘数中每个 0 仅需要将前面的累加的部分积向右移动一位 举一个简单的例子 比如说计算 00 在这里首先将乘数 00 改写为 0 00000010

1、booth算法定义

乘数看作从最低位开始的一串二进制数字。Booth算法的基本思路是:对于具有连续0和1的组,需要产生的部分积较少。对于乘数中每个0,仅需要将前面的累加的部分积向右移动一位。
布斯编码采用相加和相减的操作计算补码数据的乘积,可以减少部分积的数目,用来计算有符号乘法,提高乘法运算的速度。

2、二进制乘法过程

3、二进制乘法转换成 booth乘法运算

例如假设有一个8位乘数(Multiplier):0011_1110,它将产生6行非零的部分积。如果把该数字记成另一种形式,0100_00(-1)0(可以验证是同一个数字,-1是负1)

二进制化为十进制 0011_1110 = 0*2^7 + 0*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 0*2^0 = 62 0100_00(-1)0 = 0*2^7 + 1*2^6 + 0*2^5 + 0*2^4 + 0*2^3 + 0*2^2 + (-1)*2^1 + 0*2^0 = 64 -2 = 62:64=2^6 2=2^1 0011_1110 = 0100_00(-1)0 = 2^6-2^1=0100_0000 - 0000_0010 

计算0010_0001×0011_1110,在这里可以首先将乘数0011_1110改写为0100_0000 – 0000_0010,即根据乘法分配律得:

 0010_0001×0011_1110 = 0010_0001×(0100_0000 - 0000_0010) 

此时,对于乘数,我们需要计算6次的部分积,变成了计算两次部分积。

4、Radix-2 Booth乘法器

Radix-2 Booth乘法器,即是基2 Booth乘法器,基为2的一次方。

2 = 2^1 
相邻两个数据位,进行公式(第0位)-(第1位)计算,得到两位的编码(相邻居两位,从后面像前面减) 00 0-0= 0 转化成二进制编码 0 01 1-0= 1 转化成二进制编码 1 10 0-1=-1 转化成二进制编码-1 11 1-1= 0 转化成二进制编码 0 根据两个数据位的编码决定进行加法、减法还是仅仅移位操作。 

5、Radix-4 Booth乘法器

Radix-4 Booth乘法器,即是基4 Booth乘法器。基为2的二次方。

4 = 2^2 
相邻3位数,进行公式-2*(第3位)+(第2位)+(第1位)计算,得到两位的编码(相邻居两位,从后面像前面减) 000 (-2)*0+0+0= 0 转化成二进制编码 00,即 +0 001 (-2)*0+0+1= 1 转化成二进制编码 01,即 +1 010 (-2)*0+1+0= 1 转化成二进制编码 01,即 +1 011 (-2)*0+1+1= 2 转化成二进制编码 10,即 +2 100 (-2)*1+0+0=-2 转化成二进制编码-10,即 -2 101 (-2)*1+0+1=-1 转化成二进制编码-01,即 -1 110 (-2)*1+1+0=-1 转化成二进制编码-01,即 -1 111 (-2)*1+1+1= 0 转化成二进制编码 00,即 -0 

6、Booth乘法器计算实例

在这里插入图片描述
下面展示一些 内联代码片

从二进制看9:(共6步) 9 = 0*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 0*2^1 + 1*2^0 从基29:(共6步) 9 = 0*2^4 + 1*2^4 + (-1)*2^3 + 0*2^2 + 1*2^1 + (-1)*2^0 从基49:(共3步) 9 = 1*4^2 + (-2)*4^1 + 1*4^0 = 1*2^4 + (-2)*2^2 + 1*2^0 

注意:算式绿色部分的计算

(-2)*A*4^1 步骤1 4^1 = 2^2(转化成2的偶次方)表示结果算术左移两位 步骤2 (-2)*A=[(-1)*A]*2^1 步骤2.1 2^1表示在基2中表示结果向左移1位 步骤2.2 (-1)*A表示加上(-A);此例题中A=000111,(-A)=~()+1=+1= 所以将结果11_1001在基2中表示结果向左移1位,得到111_0010,乘积的位数为2*6位,前面符号位补齐 

此处引用 https://zhuanlan.zhihu.com/p/.

例如第2章节的例题:计算0010_0001×0011_1110(即为33×62=2046),分别按照基2和基4展开运算

在这里可以首先将乘数0011_1110按照基2展开为 0011_1110——0 相邻两位 首位分组为 0(0)*2^0 + 1(0)*2^1 + 1(1)*2^2 + 1(1)*2^3 + 1(1)*2^4 + 1(1)*2^5 + 0(1)*2^6 + 0(0)*2^7 括号中的后一位减去前一位 0011_1110 = (0-0)*2^0 + (0-1)*2^1 + (1-1)*2^2 + (1-1)*2^3 + (1-1)*2^4 + (1-1)*2^5 + (1-0)*2^6 + (0-0)*2^7 = (-1)*2^1 + 1*2^6 //= (-2) + 64 = 62 = (-1)*0000_0010 + 0100_0000 0010_0001*0011_1110 = 0010_0001*(0100_0000 - 0000_0010) = 0010_0001*0100_0000 -0010_0001*0000_0010 //进行移位计算,-0010_0001的补码为1101_1111,8*8位宽度为16位,前面符号为补齐 = 00_0010_0001_000000 + 1101_1111*0000_0010 //进行移位计算 = 0000_1000_0100_0000 + 1111_111_1101_1111_0 = 0000_1000_0100_0000 + 1111_1111_1011_1110 = 1_0000_0111_1111_1110 //因为两个8位数相乘,结果为16位,超出位舍去 所以,最后结果为: 111_1111_1110=2046 
在这里可以首先将乘数0011_1110按照基4展开为 0011_1110——0 相邻三位 首位分组为 10(0)*4^0 + 11(1)*4^1 + 11(1)*4^2 + 00(1)*4^3 相邻3位数,进行公式-2*(第3位)+(第2位)+(第1位)计算 0011_1110 = (-2)*4^0 + (-0)*4^1 + (-0)*4^2 + (1)*4^3 = (-2)*4^0 + (1)*4^3 = (-1)*2^1 + 1*2^6 //= (-2) + 64 = 62  = (-1)*0000_0010 + 0100_0000 0010_0001*0011_1110 = 0010_0001*(0100_0000 - 0000_0010) = 0010_0001*0100_0000 -0010_0001*0000_0010 //进行移位计算,-0010_0001的补码为1101_1111,8*8位宽度为16位,前面符号为补齐 = 00_0010_0001_000000 + 1101_1111*0000_0010 //进行移位计算 = 0000_1000_0100_0000 + 1111_111_1101_1111_0 = 0000_1000_0100_0000 + 1111_1111_1011_1110 = 1_0000_0111_1111_1110 //因为两个8位数相乘,结果为16位,超出位舍去 所以,最后结果为: 111_1111_1110=2046 

Verilog编程之乘法器的实现: https://blog.csdn.net/weixin_/article/details/.

备注:该内容为读书笔记,部分内容与图片收集来源于网络,如有侵权或错误,请联系我整改,谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200087.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午11:33
下一篇 2026年3月20日 上午11:34


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号