FPGA滤波器几种舍入方式和误差分析及verilog实现

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滤波器设计时特别明显。

你可能感兴趣的:(FPGA)