从硬件电路角度看Verilog有符号运算:加法器、减法器到底怎么实现的?

张开发
2026/4/17 20:24:19 15 分钟阅读

分享文章

从硬件电路角度看Verilog有符号运算:加法器、减法器到底怎么实现的?
从硬件电路角度看Verilog有符号运算加法器、减法器到底怎么实现的在数字电路设计中理解Verilog代码如何映射到实际硬件电路是每个工程师必须掌握的技能。特别是当涉及到有符号数运算时从RTL代码到门级网表的转换过程往往隐藏着许多精妙的硬件实现细节。本文将深入探讨加法器和减法器在硬件层面的实现机制揭示signed关键字如何影响综合工具的选择以及为什么a - b这样的减法操作最终会被综合为一个加法器。1. 补码硬件运算的基石现代数字电路之所以广泛采用补码表示有符号数是因为它完美解决了硬件实现中的三个核心问题统一加减法补码使得加法和减法可以使用相同的硬件电路消除零的歧义补码中零只有一种表示形式全0简化溢出处理最高位的进位可以直接作为溢出标志在Verilog中当声明signed类型时综合工具会自动采用补码表示。例如reg signed [3:0] negative_num -5; // 实际存储1011-5的4位补码补码的硬件优势体现在以下几个方面特性原码实现反码实现补码实现零的表示唯一性否否是加减法电路统一性否部分是溢出检测简易度复杂中等简单硬件资源消耗高中低提示在FPGA设计中补码的硬件效率优势尤为明显这也是Xilinx和Intel(Altera)器件都采用这种表示法的根本原因。2. 加法器的硬件实现细节2.1 基本结构从Ripple Carry到Look AheadVerilog中的运算符在综合时会根据设计约束转换为不同类型的加法器。一个典型的4位行波进位加法器(Ripple Carry Adder)由以下结构组成A[3] B[3] A[2] B[2] A[1] B[1] A[0] B[0] │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │ FA │◄────│ FA │◄────│ FA │◄────│ FA │ └───────┘ └───────┘ └───────┘ └───────┘ ▲ ▲ ▲ ▲ │ │ │ │ Cout Cout Cout Cout对应的Verilog描述虽然简单assign sum a b;但综合工具会根据时序要求选择不同的实现方式低速设计行波进位加法器面积最优中速设计超前进位加法器Carry Look Ahead高速设计并行前缀加法器如Kogge-Stone结构2.2 有符号加法的特殊处理当处理有符号加法时硬件需要特别注意两个关键点符号位扩展确保所有操作数具有相同的位宽溢出判断结果超出表示范围时的处理以下代码展示了正确的有符号加法实现module signed_adder ( input signed [7:0] a, input signed [7:0] b, output signed [8:0] sum // 扩展1位防止溢出 ); assign sum a b; endmodule在硬件实现上有符号和无符号加法器的主要区别在于无符号加法仅需检查最高位进位有符号加法需要判断以下两种溢出情况正数 正数 负数负数 负数 正数3. 减法器的硬件实现加法器的巧妙变形3.1 为什么减法等于加补码硬件设计中减法运算a - b实际上被转换为a (~b 1)。这个转换基于补码的定义使得减法可以复用加法器硬件。综合工具会自动进行这种优化例如reg signed [7:0] a, b; wire signed [8:0] diff; assign diff a - b; // 综合为加法器对应的硬件实现步骤为对b取反按位取反加1通过设置加法器的进位输入与a相加3.2 关键路径分析减法操作的关键路径通常比加法更长因为它需要额外的取反操作。以下是一个典型的时序分析_______ A ─────►│ │ │ 加法器 │◄─── B经过取反 B ───┬─►│ │ │ └───────┘ │ ▲ └─────┘进位输入置1在实际布局布线后减法操作通常会比加法多出以下延迟取反操作~0.2ns28nm工艺进位设置~0.1ns总延迟增加约15-20%4. 综合工具的有符号优化策略4.1 signed关键字的影响signed声明会直接影响综合工具选择何种算术单元。比较以下两种情况// 情况1无符号乘法 reg [3:0] a, b; reg [7:0] c; assign c a * b; // 情况2有符号乘法 reg signed [3:0] a, b; reg signed [7:0] c; assign c a * b;综合报告显示的资源使用对比实现方式LUTs寄存器DSP48E1无符号乘法1680有符号乘法1881注意现代综合工具如Vivado对signed运算的优化非常智能通常会根据上下文选择最优实现。4.2 常见优化技巧资源共享合并连续的加减法操作// 优化前 assign out (a b) - c; // 优化后 assign out a (b - c); // 减少一个加法器常数折叠提前计算常数表达式// 优化前 parameter K 5; assign out in K; // 综合后直接优化为常数加法逻辑位宽优化避免不必要的符号扩展// 次优写法 reg signed [15:0] a; reg signed [7:0] b; assign out a {8{b[7]}, b}; // 手动符号扩展 // 推荐写法 assign out a $signed(b); // 让工具自动处理5. 实战案例分析ALU中的有符号运算让我们解剖一个简单的算术逻辑单元(ALU)设计观察有符号运算的实际硬件实现module alu ( input signed [15:0] a, b, input [2:0] op, output reg signed [15:0] out, output reg overflow ); always (*) begin case(op) 3b000: {overflow, out} a b; // 加法 3b001: {overflow, out} a - b; // 减法 3b010: out a b; // 与 3b011: out a | b; // 或 3b100: out a ^ b; // 异或 default: out 16b0; endcase end endmodule综合后的关键观察点加法/减法共享资源工具会识别和-使用相同的基本电路溢出检测逻辑自动插入溢出判断电路位操作优化逻辑运算直接映射到LUT资源在Xilinx Vivado中的综合结果摘要------------------------------- | 资源类型 | 使用量 | ------------------------------- | LUT6 | 23 | | CARRY4 | 4 | | DSP48E1 | 0 | | 最大频率 | 450MHz | -------------------------------这个案例展示了现代综合工具如何智能地处理有符号运算将高级Verilog描述转换为高效的硬件结构。

更多文章