myFPGA.com.cnFPGA 技术与产业观察
← 返回栏目

FPGA 定点数与位宽入门:符号、舍入和溢出

myfpga.com.cn 编辑部 · 2026-10-05

FPGA 的寄存器保存位串,位串代表什么数值由设计约定。开始写运算逻辑前,先为每条数据记录:是否有符号、总位宽、小数位数、允许范围,以及缩窄时的处理方式。

有符号数:同一位串可以有不同解释

本文用二进制补码表示有符号整数。W 位无符号数范围为 0 … 2^W-1;W 位补码范围为 -2^(W-1) … 2^(W-1)-1。例如 1111 按 4 位无符号解释是 15,按 4 位补码解释是 -1。

扩位时,无符号数在高位补 0,补码有符号数复制符号位:1111 扩为 11111111 仍是 -1。比较、移位和混合运算都要检查操作数的类型,不要仅凭信号名或最高位认定工具会按有符号数处理。

定点小数:把整数按比例解释

这里明确使用 (W, F):W 为包含符号位的总位宽,F 为小数位数;真实值等于补码整数 raw / 2^F。这样可以避免不同 Q 格式记法对整数位是否包含符号位的歧义。

以有符号 (8, 4) 为例:

原始位串 补码整数 raw 数值 raw/16
00011000 24 1.5
11011100 -36 -2.25

其步长为 1/16,范围为 -8 … 7.9375。小数点并不作为单独硬件存储,而是接口与运算中的缩放约定。增加 F 会细化步长;固定 W 时,也会缩小可表示的数值范围。

位宽先增长,再决定缩窄

下面是保留完整结果的通用预算,不是 HDL 表达式自动扩位规则:

例如 (8,4) 的 1.5 与 -2.25 相乘,原始整数为 24 × (-36) = -864。保留为 (16,8) 后,数值为 -864/256 = -3.375。若输出仍采用 (8,4),需要明确如何丢弃低位并检查范围。

4 位有符号的 7+3 则需要 5 位保存。简短 SystemVerilog 示例先把输入扩位,再做加法:

logic signed [3:0] a, b;
logic signed [4:0] a_ext, b_ext, sum;
assign a_ext = {a[3], a};
assign b_ext = {b[3], b};
assign sum = a_ext + b_ext;  // a=7、b=3 时,sum=01010,即 10

这只是位宽示例,没有时钟、握手或完整模块。中间表达式、拼接、常量和赋值的宽度/符号规则需按所用 HDL 核对;HLS 类型也有自己的规则,见 AMD 的定点表达式说明。不要把数学上的完整位宽当作工具必然保留的结果。

量化与舍入:先约定负数行为

量化是将数值映射到有限的离散刻度;减少小数位时,需要选择取整规则。例如把 1.375 转成 F=2 的刻度(步长 0.25),向零取整得到 1.25;取最近值并在中点选择偶数刻度整数,得到 1.5。

对 -1.375,向零取整是 -1.25;直接丢弃补码低位、保留符号的算术右移则对应向负无穷取整,得到 -1.5。二者不能混称为“截断”。最近值舍入还需约定中点规则;常见模式可参阅 AMD 的量化模式说明。

最近值舍入在未溢出时,单次误差不超过半个目标步长;多级运算还要评估误差累积。舍入产生的进位也需要保留,不能在检查溢出前丢掉。

溢出:回绕、饱和或报告错误

若把 7+3=10 只保留为 4 位补码,低四位是 1010,解释为 -6,这就是该示例的回绕。饱和策略则将结果限制到 4 位补码上限 7;另一种做法是保留更宽结果或输出溢出标志,由上层处理。

回绕不等于饱和。限制幅度、检测越界和舍入都可能增加逻辑,模式区别见 AMD 的定点类型说明。设计时先在宽结果上完成规定的舍入与范围判断,再生成目标格式,避免先截掉高位而失去溢出证据。

这些数值概念与厂商无关;运算映射到 LUT、DSP 或其他资源、可用位宽及寄存器选项则与器件和工具有关。用边界值、正负数、中点舍入和累加最坏情况验证数值,再查看资源及时序报告。

延伸阅读

信息来源