FPGA里大量DSP算法不会直接用无限精度浮点数。定点实现必须在资源、时钟速度、动态范围和误差之间做取舍。面试时如果只会说“Q格式”,但讲不清乘法位宽增长和截断误差,很容易被继续追问。
以两个16位定点数相乘为例,完整乘积通常需要最多32位来保存。后续如果接口只允许16位,就必须明确保留哪一段、是否舍入、溢出时是回绕还是饱和。每一次缩位宽都可能引入量化误差。
定点实现的四个关键决策
先定义数值格式
明确符号位、整数位和小数位,例如Q格式所表示的范围和最小分辨率。
加法和乘法要做位宽预算
加法可能需要额外进位位;乘法结果位宽通常是两个操作数位宽之和,二进制小数位数也会相加。
截断与舍入误差不同
直接截掉低位简单省资源,但可能带来偏差;round-to-nearest通常误差更均衡,但需要额外逻辑。
溢出策略必须明确
wrap-around在控制或音频算法里可能产生很大的非线性错误;saturation可以限制在最大/最小值,但也增加逻辑。

面试参考回答
我会先用浮点模型确定算法所需动态范围,再给每一级定点信号分配整数位和小数位。做乘法时保留完整中间位宽,等到明确需要缩位宽的位置再决定截断或舍入,并在仿真里统计最大误差和溢出概率。对溢出敏感的控制链路会优先考虑饱和,而不是默认二进制回绕。最后用浮点golden model和RTL定点结果做误差对比,避免只验证几个手工向量。
继续追问
两个Q1.15数相乘后,小数位数怎么变化?
截断为什么可能产生有方向性的偏差?
饱和逻辑和回绕逻辑对资源与时序有什么影响?
常见错误
整个算法统一一个位宽,不做逐级动态范围分析。
乘法后直接取高16位,却说不清二进制小数点在哪里。
只验证“结果大致正确”,没有量化误差指标。

扫码关注






























