把每一位都用满!——FPGA“全位宽”思维,硬生生抬高你的动态范围
直觉版比喻:
用 8 位处理 12 位的信号,就像拿窄口水管接大水缸——缸里水再多,流出来也不多。把位宽“卡脖子”就等于把动态范围“卡脖子”。
本文用工程语言聊聊:为什么在 FPGA 里“用满位宽”能显著提升系统动态范围与算法稳健性,怎么设计算子和数据通路避免“被动缩位”,以及在资源、延时与精度之间怎么平衡。配足了公式、数值小例子与代码片段,便于直接套用。
1. 动态范围与位宽的第一性原理
-
量化噪声(均匀量化、满刻度归一的近似):
SNRq≈6.02,N+1.76 dB\mathrm{SNR}_\mathrm{q}\approx 6.02,N + 1.76\ \mathrm{dB}SNRq≈6.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) 次:需要再多 (⌈log2K⌉\lceil \log_2 K \rceil⌈log2K⌉) 位 保证不溢出。
-
结论:一路把位宽保持够宽(保留“增长位”与“保护位”),才能把前端的每一位真正换成系统 SNR/动态范围的提升。
2. 一个 3 步的小故事:同一条 FIR,三种习惯,三种命运
设:12 位 ADC,输入峰值接近满刻度;FIR 长度 (K=32),系数已做 1.15 格式(即幅度 < 1)。
习惯 A:一上来就“图省事”缩成 12 位
-
乘法:(12×16→2812 \times 16 \rightarrow 2812×16→28) 位产物。
-
坏习惯:直接把乘法结果截断回 12 位 再累加。
-
后果:每次乘法都丢 ~16 位有效信息,量化噪声雪崩;32 次累加后动态范围显著劣化且易溢出 → 被迫再缩位 → “二次伤害”。
习惯 B:中间保宽,但累加后立即截断
-
乘法保 28 位,累加需要再加 (⌈log232⌉=5\lceil \log_2 32 \rceil = 5⌈log232⌉=

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



