把每一位都用满!——FPGA“全位宽”思维,硬生生抬高你的动态范围

把每一位都用满!——FPGA“全位宽”思维,硬生生抬高你的动态范围

直觉版比喻:
用 8 位处理 12 位的信号,就像拿窄口水管接大水缸——缸里水再多,流出来也不多。把位宽“卡脖子”就等于把动态范围“卡脖子”。

本文用工程语言聊聊:为什么在 FPGA 里“用满位宽”能显著提升系统动态范围与算法稳健性,怎么设计算子和数据通路避免“被动缩位”,以及在资源、延时与精度之间怎么平衡。配足了公式、数值小例子与代码片段,便于直接套用。

1. 动态范围与位宽的第一性原理

  • 量化噪声(均匀量化、满刻度归一的近似):
    SNRq≈6.02,N+1.76 dB\mathrm{SNR}_\mathrm{q}\approx 6.02,N + 1.76\ \mathrm{dB}SNRq6.02,N+1.76 dB
    其中 (N) 为有效位数每多 1 位,SNR 理论上涨 ~6 dB。

  • 满刻度(Full Scale, FS)利用率
    你的整个信号链中,最窄的那一段决定了你真正可用的位数。
    例如:ADC 12 位 → 前端滤波 8 位 → 后续再扩到 16 位也没用,有效动态范围已经被 8 位“卡死”

  • 算子位宽增长规律(无符号,直观规则;有符号同理考虑符号位):

    • 加减:结果位宽最多增长 +1 位(进位/借位)。

    • 乘法:结果位宽为 相加(Na+Nb)(N_a + N_b)(Na+Nb))。

    • 累加 (K) 次:需要再多 (⌈log⁡2K⌉\lceil \log_2 K \rceillog2K) 位 保证不溢出。

结论一路把位宽保持够宽(保留“增长位”与“保护位”),才能把前端的每一位真正换成系统 SNR/动态范围的提升。

2. 一个 3 步的小故事:同一条 FIR,三种习惯,三种命运

设:12 位 ADC,输入峰值接近满刻度;FIR 长度 (K=32),系数已做 1.15 格式(即幅度 < 1)。

习惯 A:一上来就“图省事”缩成 12 位

  • 乘法:(12×16→2812 \times 16 \rightarrow 2812×1628) 位产物。

  • 坏习惯:直接把乘法结果截断回 12 位 再累加。

  • 后果:每次乘法都丢 ~16 位有效信息,量化噪声雪崩;32 次累加后动态范围显著劣化且易溢出 → 被迫再缩位 → “二次伤害”

习惯 B:中间保宽,但累加后立即截断

  • 乘法保 28 位,累加需要再加 (⌈log⁡232⌉=5\lceil \log_2 32 \rceil = 5log232=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值