在学习FIR滤波器时,遇到饱和、截位,以此记录学习
数据截位中常用的算法是四舍五入,当某个模块的输出为8bit,后一个模块只能接收5bit时,此时就需要对数据进行截位处理,即可对数据进行四舍五入。
assign filter_out = (acc_final[31:0] + {acc_final[16], {15{~acc_final[16]}}})>>>16;
这段代码对最终滤波后的数据进行四舍五入,若acc_final[16]=1时,四舍五入需要进位,则直接加到acc_final[31:0]中(数据进位),再右移16位,表示五入;若acc_final[16]=0时,则不需要进位,则直接加到acc_final[31:0]中(数据不进位),再右移16位,表示四舍。
-
>>
:算术右移(带符号右移)- 当使用
>>
运算符时,如果被移位的值为正数,则在右侧填充0;如果为负数,则在右侧填充1,以保持符号不变。这意味着算术右移会保持操作数的符号位不变。 - 示例:
a >> b
将a
向右移动b
位,空出的位将用a
的符号位填充。
- 当使用
-
>>>
:逻辑右移(无符号右移)>>>
运算符对被移位的值的符号位不起作用,它总是在右侧填充0。这意味着逻辑右移将忽略符号位,将所有位都当作非负数处理。- 示例:
a >>> b
将a
向右移动b
位,并在左侧填充0。
数据饱和:当数据大于我们设定的最大值时,输出数据=最大值;当数据小于所设定的最小值时,输出数据=最小值。
参考: