相关阅读
数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm=1001.2014.3001.5482
在之前的文章中,进位保留乘法器、华莱士树乘法器、dadda树乘法器等方法都是优化了部分积累加这个过程。还有一些方法能对部分积的产生进行优化,基2布斯编码是由布斯夫妇于1950年发明的,因为其硬件实现简单,所需硅片面积较小,能够显著提高乘法运算的速度,而被广泛采用。
使用基2布斯编码的乘法器,会对乘数进行重新编码,以减少乘法运算中所需的加法次数。除了这一优点,基2布斯编码还可以计算有符号数乘法,这与之前的乘法器不同,如果它们需要计算有符号数,需要将符号位单独异或计算,然后对其绝对值进行无符号数乘法运算,而布斯编码直接使用补码运算,因此不需对符号位单独考虑。
首先推导基2布斯编码的编码规则,对于一个n位补码表示的数X,可以将其写成的形式,其中为各二进制位,最高位是符号位,所以其值为负数。将右式展开,结果如式1所示,最后的起辅助作用,其值为0。
(式1)
接着把除了最高位和最低位外的所有写成,即式2,
(式2)
将括号展开并整理,得到式3,
(式3)
至此得到了基2布斯编码的规律,每一位基2布斯编码即为原来的二进制补码的低一位减本位,所以有三种取值,1、0和-1,这种方式使得可以跳过乘数中的某些连续的1,将多次的部分积累加,减少到较少次数的加减运算,表1总结了基2布斯编码的规则。
表1 补码的布斯编码规则
Xn | Xn-1 | BRCn | 值 | 乘数状态 |
0 | 0 | 0 | 0 | 全0字符串 |
0 | 1 | 1 | +1 | 末尾为1的串 |
1 | 0 | 1 | -1 | 开始为1的串 |
1 | 1 | 0 | 0 | 中间全1的串 |
作为基2布斯编码的一个例子,图1给出了十进制-67编码的例子。如果不使用基2布斯编码,该数作为乘数的普通乘法需要五次加法和一次减法(符号位),使用了基2布斯编码后,只需要进行两次加法和三次减法。对于含有连续1比较多的数来说,这种优化更有效果。
图1 十进制数(-67) 的基2布斯编码
由此可以构建基2布斯编码模块,布斯编码模块对每三位乘数进行布斯编码,因此对于八位的数据宽度,设计需要八个编码模块(加上最低的辅助位),输出为三个信号,分别是表示为表示减操作的Neg信号,表示部分积为零和一倍的Zero和One信号。这些信号将提供给部分积产生模块,随后部分积产生模块将根据这些信息输出正确的部分积。基2布斯编码器具体的Verilog实现如下所示。
module Booth_Encoder(
input [1:0] Code,
output Neg,Zero,One
);
assign Neg = Code[1];
assign Zero = (Code == 2’b00) || (Code == 2'b11);
assign One = !Zero;
endmodule
基2布斯编码器还需要搭配部分积产生模块,才能产生正确的部分积(布斯编码只针对乘数,被乘数用于产生部分积)。最后可以使用之前对部分积累加优化过程中谈到的进位保留加法器和树形结构完成乘法结果的产生。