1. 舍入与截尾误差,补码截尾,会有负的直流偏置;
FPGA二进制几种截尾和舍入方法比较:
wire signed [15:0] scaletypeconvert1;
wire signed [37:0] scale1;
1. Round Mode: fix——filter_zero
scaletypeconvert1= $signed({scale1[37:22]} + (scale1[37] & |scale1[21:0]));
2. Round Mode : round——filter_Round
scaletypeconvert1 = (scale1[37:0] + {~scale1[37],{21{scale1[37]}}})>>>22;
3. Round Mode : convergent——filter_near_convergent
scaletypeconvert1 = (scale1[37:0] + {scale1[22],{21{~scale1[22]}}})>>>22;
4. Round Mode : nearest——filter_near
scaletypeconvert1 = (scale1[37:21] + 1)>>>1;
5. Round Mode : floor——filter_floor
scaletypeconvert1 = scale1[37:22];
6. Round Mode : ceil——filter_Ceil
scaletypeconvert1= scale1[37:22] + |scale1[21:0]
虽然在舍入过程中总会损失精度,但是不同的舍入模式还是会引入不同的资源消耗和精度误差,为了给您提供在资源消耗和精度误差之间权衡的灵活性,DSP System Toolbox software 支持以下几种舍入模式:
1.Ceiling ,将计算结果向着正无穷的方向舍入到最近的整数;对应 ceil 函数。
2.Convergent,将计算结果向着最近的整数舍入,如果出现1/2的情况,向着最近的偶数舍入;在DSP System Toolbox中,这是 least biased 的舍入模式;对应 convergent 函数。
3.Floor,等效于 truncation ,将计算结果向着负无穷的方向舍入到最近的整数;对应 floor 函数。
4.Nearest ,将计算结果向着最近的整数舍入,如果出现1/2的情况,向着正无穷的方向舍入到最近的整数;对应 nearest 函数。
5.Round ,将计算结果向着最近的整数舍入,如果出现1/2的情况,对于正数,向着正无穷的方向舍入到最近的整数;对于负数,向着负无穷的方向舍入到最近的整数;对应 round函数。
6.Simplest ,用在 simulink 中,有 simulink 根据情况判断,自动进行舍入。
7.Zero ,将计算结果向着0方向舍入,对应 fix 函数。
需要综合考虑FPGA综合面积和舍入精度。个人用的是near舍入方式,near convergent面积最大,floor、ceil、zero舍入方式会有直流偏置,在进行IIR滤波器设计时特别明显。