在数字电路设计中,加法器与减法器是最基本且应用带有场景的运算模块。addsub
模块是一个适用于广泛场景的加减法实现,支持加法和减法操作,并通过自定义参数提供两种不同的实现方式。以下将对该模块进行分析。
module addsub (sub,a,b,o);
parameter WIDTH = 16;
parameter METHOD = 1;
input sub;
input [WIDTH-1:0] a,b;
output [WIDTH:0] o;
generate
if (METHOD == 0) begin
// generic style
assign o = sub ? (a - b) : (a + b);
end
else if (METHOD == 1) begin
// Hardware implementation with XORs in front of a
// carry chain.
wire [WIDTH+1:0] tmp;
assign tmp = {1'b0,a,sub} + {sub,{WIDTH{sub}} ^ b,sub};
assign o = tmp[WIDTH+1:1];
end
endgenerate
endmodule
模块功能
addsub
模块的核心功能可表示为:
输入与输出
输入:
sub
:控制信号,决定是执行加法(sub=0
)还是减法(sub=1
)。a
和b
:两个操作数,位宽为WIDTH
。
输出:
o
:加法或减法结果,位宽为WIDTH + 1
,以支持可能的进位或借位。
两种实现方式
该模块通过参数 METHOD
决定采用的硬件实现方式:
方法 1:通用实现(METHOD == 0
)
assign o = sub ? (a - b) : (a + b);
- 逻辑说明:
- 通过条件运算符实现。根据
sub
的值选择执行加法或减法。 - 减法通过 Verilog 内置的减法运算符实现。
- 特点:
- 简单直观:该方式依赖于综合工具的优化,逻辑清晰。
- 依赖工具优化:具体的硬件实现由综合工具决定,可能利用加法器链加上补码来实现减法。
- 优缺点:
- 优点:代码简单,易于理解和维护。综合工具可根据具体的 FPGA 或 ASIC 平台进行优化。
- 缺点:对具体硬件平台的适配性可能较弱,性能依赖于综合工具。
方法 2:硬件优化实现(METHOD == 1
)
wire [WIDTH+1:0] tmp;
assign tmp = {1'b0,a,sub} + {sub,{WIDTH{sub}} ^ b,sub};
assign o = tmp[WIDTH+1:1];
- 逻辑说明:
- 硬件路径基于二进制补码的原理
- 减法A−B可以通过A+(∼B+1)实现。
- 将∼B转化为sub对B的按位异或:{WIDTH{sub}} ^ b这里有个基础知识点,即一个数与0异或还是它本身,与1异或就是取反。
- tmp 是一个临时变量,包含:第一部分{1'b0, a, sub}:带符号扩展的A和sub。第二部分{sub, {WIDTH{sub}} ^ b, sub}:对B处理后的值。两部分相加后,结果通过tmp[WIDTH+1:1]输出,去掉不需要的符号位。这里有一个小技巧,当sub为1的时候,注意看第0位是1+1,会进位到第1位一个1,这个1就是B取反加1的1。这样当我们把最终的结果取高位舍去第0位的时候,就实现了A+(∼B+1)。
- 特点:
- 加法链优化
硬件结构中采用统一的加法器链,通过 XOR 和补位实现加减法切换。 - 节省资源
共享一条加法器,同时处理加法和减法。
- 优缺点:
- 优点
- 针对硬件优化,延迟更低,资源使用更高效。
- 可直接映射到 FPGA 或 ASIC 加法器,适合高性能应用。
- 缺点
- 电路复杂度高于
METHOD 0
,可能需要更多的验证和调试。 - 对于非加法链支持的硬件平台,可能不如通用实现高效。
通用路径与硬件优化路径的对比
总结
addsub
模块是一种设计灵活、高效的加减法实现。通过参数化设计和两种实现方式,模块适用于广泛的数字电路应用场景。其硬件优化路径(METHOD 1
)在高性能场景中尤其具有优势。
END
作者:硅谷老李
文章来源:IC加油站
推荐阅读
更多 IC 设计干货请关注IC 设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。