数字信号截位/位移引入的量化误差优化

当我们进行数字运算(比如右移)的时候,会因为“四舍五入”导致结果出现偏差,但这种运算引入的并不是真的四舍五入,而是满足以下规律:

  • 正数时,右移会自动丢掉小数点的内容,也就是只舍。
  • 负数时,右移会自动-1如果有小数的话,也就是只“入”。

所以,我们可以从这一点入手,将结果改成真正的四舍五入,这样,最终结果的偏移范围将会缩小。具体做法如下:

  • 如要右移4位,那我们要判断低四位是否大于等于4'b1000即要位移的一半,如果大于就给最终结果加一。

解释,当正数时,大于一半的值应该进1,所以加上,小于就不加,默认舍掉
当负数时,数据是补码,大于一半的值实际是绝对值小于一半,应该不进1,但是默认会进1,所以我们同样加1抵消掉。

reg [7:0] mul_re;
wire is_round = mul_re[3:0] >= 4'b1000;
out <= mul_re[7:4] + is_round_i;
posted @ 2025-07-04 16:35  天刚刚破晓  阅读(26)  评论(0)    收藏  举报