【【verilog典型电路设计之Wallace 树乘法器】】

本文详细介绍了Verilog语言中Wallace树乘法器的设计,包括FA(全加器)和HA(半加器)的作用,以及如何通过全加器和半加器构建一个多级的压缩乘法结构。测试bench示例展示了如何在Verilog中实现和测试这个乘法器模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

verilog典型电路设计之Wallace 树乘法器

Wallace 树乘法器
是一种我们在集成电路学习中应用非常广泛的设计 其中由两部分组成 一个是FA和HA
FA是full add 全加器 HA 是half 半加器
加法从数据最密集的地方开始,不断地反复使用全加器半加器来覆盖“树” 。 这一级全加器 是一个3输入2输出的器件,因此全加器又称为3-2压缩器。通过全加器将树的深度不断缩减,最终缩减为一个深度为2的树。最后一级则采用一个简单的两输入加法器组成。
在这里插入图片描述
在这里插入图片描述
我们所非常熟知的常规算法是印象里 几个数加起来 一种做法是把其中的一个个数添加,依次相乘 然后慢慢算出它最终的结果 还有一种做法是我们按照常规的竖式加算的方法 我们按照小学教的
在这里插入图片描述
借用一下上次的图 我们会很清晰的发现 乘算之后会得到4个这种暂态的数
好因为这是4位数乘4位数 要是我们把想法扩大 把目标放在更大的数乘更大的数呢 我们会遇到 更大层次的数相乘 那么就会余下好几层的数乘 我们先引入 全加器的概念将三位数压缩成2位
我就以上面的数相加进行举例
比如说1 2 3 4 组数字 我挑选 1 2 3 组我现在想把他压缩成2位 就是
在这里插入图片描述
就是我们将三位数字可以拆解成1个十位 1个个位 就像是1+1+1=11
0+0+1=01 这就是全加器的实现 我们可以把 三个数字 变成 两个数字

而对于半加器来说是 只有两位数相加才会得到结果的
就好比最大的 1+1 =10
这里所有的加数都是以二进制的形式存在的
下面是wallace的verilog代码

module wallace(x,y,out);
parameter size=4;
input [size-1:0] x,y;
output [2*size-1:0] out;
wire [size*size-1:0] a;
wire [1:0] b0,b1,c0,c1,c2,c3;
wire [5:0] add_a,add_b;
wire [6:0] add_out;
wire [2*size-1:0] out;
assign a={x[3][3][2],x[2],x[1],x[3],x[1],x[0][3][2],x[1][0][2][1][0][O]}&
{y[3].y[2].y[3].y[2],y[3].y[1].y[2].y[3].y[0].y[1].y[1],.y[2],.y[0].y[0].y[1].y[0]};
 multiplierhadd U1(.x(a[8]),.y(a[9]),.out(b0));
hadd U2(.x(a[11]),y(a[12]),.out(b1));
hadd U3(.x(a[4]),-y(a[5]),.out(c0));
fadd U4(.x(a[6]),-y(a[7]),z(b0[0]),.out(c1));
fadd U5(.x(a[13]),-y(a[14]),z(b0[1]),.out(c2));
fadd U6(.x(b1[0])..y(a[10]),z(b1[1]),.out(c3));
assign add_a={c3[1],c2[1],c1[1],cO[1],a[3],a[1l;lladderassign add_b={a[15],c3[0],c2[0],c1[0],c0[0],a[2]};
assign add_out=add_a+add_b;
assign out={add_out,a[0]};
endmodule
module fadd(x,y, z, out);
output [1:0]out;
input x,y,z;
assign out=x+y+z;
endmodule
module hadd(x, y, out);
output [1:0]out;
input x,y;
assign out=x+y;
endmodule

下面是wallace的testbench

module wallace_tb;
reg [3:0] x, y;
wire [7:0] out;
wallace m(.x(x),.y(y),.out(out));
initial
begin
x=3;y=4;
#20 x=2; y=3;
#20 x=6; y=8;
end
endmodule
### 实现 Wallace 乘法器 Wallace 乘法器是一种高效的硬件架构,用于加速多数乘法运算。它通过逐步压缩部分积的数来降低最终加法操作的复杂度[^1]。 #### 基本原理 在实现 Wallace 乘法器时,主要依赖于全加器 (FA, Full Adder) 和半加器 (HA, Half Adder),这些逻辑单元被用来逐层减少部分积的数量。具体来说: - **全加器 (FA)** 能够处理三个输入并生成一个和以及进输出。 - **半加器 (HA)** 则仅能处理两个输入,并同样生成一个和与进输出。 每一轮的部分积压缩会将三比特的数据缩减为两比特(一和与一),从而逐渐减少每一列中的比特数量直到可以由单个加法器完成最后一步计算。 #### 设计流程 以下是基于数字电路的设计方法概述: 1. 首先生成所有的部分积; 2. 使用 FA 或者 HA 对齐相同权重的置上的多个比特进行相加; 3. 不断重复上述过程直至剩余少量行可以直接送入最后一级的大规模加法器中完成求和; 对于编程模拟而言,则可以通过软件算法模仿这一物理层面的操作顺序。下面给出一段伪代码表示该机制的一个简化版本: ```python def wallace_tree_multiplier(A_bits, B_bits): partial_products = [] # Generate all possible products between bits of A and B. for i in range(len(A_bits)): for j in range(len(B_bits)): product_bit = A_bits[i] & B_bits[j] weight = i + j # Weighted position based on bit positions. partial_products.append((product_bit << weight)) compressed_results = compress_partial_products(partial_products) final_sum = sum(compressed_results) return final_sum def compress_partial_products(products_list): while max_count_in_same_weight(products_list) > 2: new_products = [] temp_storage = {} for value in products_list: key = get_weight(value) if not key in temp_storage: temp_storage[key] = [] temp_storage[key].append(value) for k,vlist in temp_storage.items(): if len(vlist)==1: new_products += vlist elif len(vlist)>2: fa_result = full_adder(*vlist[:3]) new_products.extend(fa_result['outputs']) remaining_values=vlist[3:] if remaining_values: new_products+=remaining_values products_list=new_products return products_list # Helper functions would be defined here... ``` 此代码仅为概念展示用途,在实际应用前需进一步完善细节如定义辅助函数 `full_adder`, `get_weight` 及其他必要的错误检查功能等。 #### 流水线技术的应用 由于 Wallace 具有天然分阶段的特点,因此非常适合引入流水线设计以提高整体性能。这不仅能够增加系统的吞吐量还能改善关键路径延迟问题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值