赞
踩
用FPGA进行数字信号处理过程中,很多时候需要将一个数的结果中的小数据部分截断掉,也就是数据取整,在matlab中这样的函数有4个:round、fix、ceil和floor。本文的工作如下:
1、以4位2进制补码数据5和-5为例,说明各个函数在FPGA中的实现方式。
2、fpga在乘法器IP核中的取整方式。
3、用概率的理论分析取整方式,并用展示舍入方式对FPGA实现数字信号处理的的影响。
一般情况下FPGA取整的方式有2种:
1、直接截断小数位。
2、将小数位的最高位加到整数位,也就是将结果加上0.5再截断小数位。
举例:用4位有符号二进制数据a[3:0]表示FPGA除法运算前的数据,a除以2的结果用out[2:0]表示即用FPGA实现out=a/2。
matalb中4个函数对正负5除以2整取结果如下表:显然上面FPGA取整方式分别对应到floor和ceil函数。
在FPGA实际应用中没有必要将这4种区分这么详细,在Xilinx 提供的乘法器的IP核中提供的取整的方式:直接截断(truncation )和四舍五入(rounding)两种截断方式。
直接截断方式与matlab中的floor函数是一致的。
四舍五入方式与round函数有一点不一样,就是对于小数部分正好为0.5的处理:round函数小数部分正好是0.5时会进位,而乘法器的IP取整时,检测到小数部分正好是0.5时是否进位需要看round_cy引脚,round_cy=0则0.5舍去,round_cy=1则0.5进位,IP核文档中建议round_cy引脚接一个随机数以实现量化误差无偏。
当采用截断方式取整时可以认为引入一个均匀分布的量化噪声,其概率密度函数以及其均值和方差为:
当采用四舍五入方式取整时,引入噪声的概率密度函数以及其均值和方差:
用四舍五入方式得到的是无偏的。
本人用FPGA做了一个以基-16蝶形运算单元为核心的16384点的FFT模块,块浮点方式,输入为随机数。在旋转因子精度足够的情况下,当乘法结果直接截断取整得到的结果与乘法结果用四舍五入方式取整得到的结果,分别与matalb中fft函数结果(已经去掉块浮点值)对比如下左图和右图,左图采用了有偏的取整方式在经过大量运算级后量化误差积累就显示了出来。
最后留个疑惑:xilinx用户手册:pg104_cmpy.pdf中page13,这个图中的进位源没有看懂是什么意思,还请大神指教。
第一次写博客,有不足之处还请指教。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。