Booth压缩+华莱士树Wallace乘法器的通俗理解

1.Booth压缩

目的: 减少乘法器的加法次数
原理: 0111_1100 = (1000_0000 - 0000_0100) 因( 0000_0100 + 0111_1100 = 1000_0000)
^^^ ^^(5个1) = ^ ^(2个1)
M ∗ ( 2 7 + 2 6 + 2 5 + 2 4 + 2 3 ) = M ∗ ( 2 8 − 2 3 ) M*(2^7+2^6+2^5+2^4+2^3)=M*(2^8-2^3) M(27+26+25+24+23)=M(2823)
压缩原则:

01为0111…110段开始, 对应+1

10为0111…110段结束, 对应-1

11为0111…110段中间部分, 对应0

00为0111…110段以外部分, 对应0

2.华莱士树

2.1 概述

简单讲就是, 乘法先看作加法, 就是咱们计算乘法 时候的乘数a与乘数b的每一位相乘, 再相加. 然后把所有要加的数分组, 得到和sum, 还有进位, 然后再把得到的sum和进位一继续与之前没加完的数继续加, 直到只剩两个数, 直接相加得到结果.

目的: (<->传统加法器: 串行, 一次移一位, 慢) 并行, 快

原理: 进位保存加法器(<->全加器: 串行, 一次一位, 利用上位和求现在位) 输入:3位, 输出:2位(和,进位)

​ 并行加法器: 输入:2位, 输出1位(和)

​ 两乘数[size:1], 则乘积[2 * size:1] 因([size:1]的数<2^size①, (2^size) * (2size)<2(2 * size), 即乘积<2^(2 * size),由①: [2 * size:1]可表示乘积)

步骤:

  1. (输入)3位一组->(输出)2位

  2. (输入)3位一组(↑2位+1位)->(输出)2位

  3. 重复2, 直至仅剩2位

  4. (输入)↑2位->(输出)1位

2.2 例示

例1: n=10

10位为1,需相加, 假设进位保存加法器个数无穷大, 每次都可分得(现存位数/3)个组

  1. (输入)3位一组分得3组(3=10/3)->(输出)3组每组少1位, 现存7位(10-3*(3-2)=7)

  2. (输入)3位一组分得2组(2=7/3)->(输出)2组每组少1位, 现存5位(7-2*(3-2)=5)

  3. (输入)3位一组分得1组(1=5/3)->(输出)1组每组少1位, 现存4位(5-1*(3-2)=4)

  4. (输入)3位一组分得1组(1=4/3)->(输出)1组每组少1位, 现存3位(4-1*(3-2)=3)

  5. (输入)3位一组分得1组(1=3/3)->(输出)1组每组少1位, 现存2位(3-1*(3-2)=2)

  6. 仅剩2位: (输入)2位并行加法->(输出)1位

    至此6个单位时间<->传统移位加法器10位相加需10单位时间

例2: n=100

// 简单c语言计算n位加法(华莱士树)次数
int WallaceAddTimes(int n)
{
    int times = 0;
    while (n>2)
    {
        n = n - n/3;
        ++times;
    }
    // ==2时跳出,并行加法器运算
    return times+1;
}
int main()
{
	cout << "100 bits adding in Wallace Tree: times = " //12
         << WallaceAddTimes(100) << endl;
    return 0;
}

大大加快运算速度! (前提, 可同时并行n/3个进位保存加法器)

3.小结

Booth压缩: ↓加法位数(负数补码同样可行)

华莱士树: ↓加法次数(并行)

二者加持, 如有神助 --> 高速加法器

对于verilog实现的传统移位乘法器可以不采用了qwq(虽然反对你, 但允许你的存在, 所以我在这里写一遍你)

module multiplier(
    a,
    b,
    result
);
parameter size = 8;
input [size:1] a,b;
output [2 * size:1] result;

reg [2 * size:1] shift_a, result;
reg [size:1] shift_b;

always @(a or b) begin
    shift_a = a;
    shift_b = b;
    result = 0;
    repeat(size) begin
        if(shift_b[1]) result = result + shift_a;
        shift_a = shift_a << 1;
        shift_b = shift_b >> 1;
    end
end
endmodule
  • 9
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华莱士乘法器是一种常用的乘法器结构,用于对两个二进制数进行乘法运算。在华莱士乘法器中,采用了两位Booth编码和补码的形式来处理部分积。 在处理负数的情况时,华莱士乘法器使用了补码表示。补码是一种用于表示负数的二进制数表示方法,其中负数的补码表示为其绝对值的按位取反后再加1。 华莱士乘法器的设计思想是将乘法操作分解为多个部分积的加法操作。每个部分积都是由两个二进制数的某一位相乘得到的。在华莱士中,每个部分积位的计算都需要使用全加器。 为了提高计算效率,华莱士乘法器采用了一种特殊的结构。在16位乘法中,每个位上至少包含6个全加器,在32位乘法中,全加器个数为14。这样的设计保证了在首位上有足够的空闲进位要求,可以满足减去操作的补码部分积处理。 在具体的实现中,华莱士乘法器采用了17个全加器(实际上可以只设计14个),分为五层。第一层包含6个全加器,第二层包含4个全加器,第三层包含2个全加器,第四层和第五层各包含1个全加器。通过这样的设计,所有减去部分积的操作都可以直接放入进位输入。 根据以上描述,你可以使用Verilog语言来实现华莱士乘法器。在Verilog代码中,你需要定义模块、输入输出端口以及内部信号,并使用适当的语法和结构来描述华莱士乘法器的功能和结构。 请注意,上述描述是对华莱士乘法器的一般概念和设计思想进行的解释,具体的Verilog实现需要根据你的具体需求和设计要求进行相应的调整和实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [verilog语言设计的32位输入使用Booth两位一乘和华莱士的定点补码乘法器(附参考仿真文件)](https://blog.csdn.net/fcb_x/article/details/126841736)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值