原创 《CPU设计实战》-(3) booth乘法器

2021-7-14 11:31 3061 12 12 分类: FPGA/CPLD 文集: 技术书籍读后感
感谢“面包板社区”,给了我这个评测的机会,让我可以接触到龙芯团队的成果。
回顾一下,
================================================
我们目前还是停留在 第五章: 在流水线中添加运算类指令
================================================
Booth 算法实质是:如何从 二进制数 的 “形式” 得到其 “数值” 的另外一种方法
比如  0101 这个"数",如何得到其"值"?
1) 经典的“按其位的权 累加”的方法: 
 计算过程= ( 1 * 2^0 ) + ( 0 * 2~1 ) + ( 1 * 2^2) + ( 0 * 2^3 )
  总共要加 4 次,每个位置的 0,1 都需要参加计算
2) Booth 的简化方法: 多看2个位置: -1位,4位, 这两位的数据当然都是0,
 计算过程= ( -1 * 2^0 ) + ( 1 * 2~1 ) + ( -1 * 2^2) + ( 1 * 2^3 )
 虽然要看6个位置,累加最多只需 4 次,这个例子里没有连续的0或1可以跳过,计算次数也没有变少了,优点并没有展现出来。
而一般的数字组成,总会有大量的0和1的重复序列,Booth就可以节省很多的计算。
比如:8位 1111_1111 :传统算法要加 8次; Booth算法立刻得出:1*2^8 -1   (这也解释了 -1的几何意义)
再如:8位 1111_0000 :传统算法要加 8次; Booth算法立刻得出:2^8 -2^4

所以, Booth 天生和 乘法 非常亲近; 而和 加法 的距离比较远。
-------------------------------------------------------------------------------
Booth 权重算法 和 Booth 乘法器, 究竟还是不一样的:
-------------------------------------------------------------------------------
本书 P140: 5.2.2 , 电路级实现“乘法器”: 

乘数A和B,全部使用补码表示,进行经典的乘法计算,发现:
A补码 * B补码  !== [A*B] 补码
而是:
 [A*B] 补码  == A补码 * B'  ;  其中 B' =[最高位取反 ,其他位不变]

这个事实说明什么?
可以继续对 B' 进行处理:以32位举例
B' = [-Y31 ,Y30, Y29,  ... ,Y1, Y0]
B’ =  -Y31 * 2^31  + Y30 * 2^30 + Y29 * 2^29 +  ... + Y1* 2^1 + Y0 *2^0 
让单数位置的数值为了0,仅仅保留双数位
注意:  -Y31 * 2^31 ==  -2*31 * 2^30, 余例仿此。
B' = (Y29+Y30-2*Y31) *2^30 + (Y27+Y28-2*Y29) *2^28 + ...
B' = [0, (Y29+Y30-2*Y31), 0, (Y27+Y28-2*Y29), ....0,(Y-1+Y0-2*Y2) ]

原来 32位乘法运算:要进行32次乘法和移位,最后展开变成64位,在64个位置要 32个数字累加(带进位),总之比较复杂,运算资源也很大;
现在,运算次数可以减少1半,只要 16 位乘法运算即可
----------------------------------------------------
说实话, 我看不出 这种 Booth乘法器, 和 Booth 权重算法 有什么关系吗?

作者: 乖乖兔爸爸, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-1729144.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
我要评论
0
12
关闭 站长推荐上一条 /2 下一条