matalb取整函数round、fix、ceil和floor函数在fpga中的实现

matalb取整函数中roundfixceilfloor函数在fpga中的实现

FPGA进行数字信号处理过程中,很多时候需要将一个数的结果中的小数据部分截断掉,也就是数据取整,在matlab中这样的函数有4个:roundfixceilfloor。本文的工作如下:

1、以42进制补码数据5-5为例,说明各个函数在FPGA中的实现方式。

2、fpga在乘法器IP核中的取整方式。

3、用概率的理论分析取整方式,并用展示舍入方式对FPGA实现数字信号处理的的影响。

matlab取整函数在FPGA中实现

一般情况下FPGA取整的方式有2种:

1、直接截断小数位。

2、将小数位的最高位加到整数位,也就是将结果加上0.5再截断小数位。

举例:用4位有符号二进制数据a[3:0]表示FPGA除法运算前的数据,a除以2的结果用out[2:0]表示即用FPGA实现out=a/2

matalb取整函数round、fix、ceil和floor函数在fpga中的实现_第1张图片


matalb4个函数对正负5除以2整取结果如下表:显然上面FPGA取整方式分别对应到floorceil函数。 


matalb取整函数round、fix、ceil和floor函数在fpga中的实现_第2张图片  

Xilinx乘法器IP核中的取整

FPGA实际应用中没有必要将这4种区分这么详细,在Xilinx 提供的乘法器的IP核中提供的取整的方式:直接截断(truncation )和四舍五入(rounding)两种截断方式。

      matalb取整函数round、fix、ceil和floor函数在fpga中的实现_第3张图片 matalb取整函数round、fix、ceil和floor函数在fpga中的实现_第4张图片

直接截断方式与matlab中的floor函数是一致的。

四舍五入方式与round函数有一点不一样,就是对于小数部分正好为0.5的处理:round函数小数部分正好是0.5时会进位,而乘法器的IP取整时,检测到小数部分正好是0.5时是否进位需要看round_cy引脚,round_cy=00.5舍去,round_cy=10.5进位,IP核文档中建议round_cy引脚接一个随机数以实现量化误差无偏。

取整方式对处理结果的影响

当采用截断方式取整时可以认为引入一个均匀分布的量化噪声,其概率密度函数以及其均值和方差为:

           

当采用四舍五入方式取整时,引入噪声的概率密度函数以及其均值和方差:

      

用四舍五入方式得到的是无偏的。

本人用FPGA做了一个以基-16蝶形运算单元为核心的16384点的FFT模块,块浮点方式,输入为随机数。在旋转因子精度足够的情况下,当乘法结果直接截断取整得到的结果与乘法结果用四舍五入方式取整得到的结果,分别与matalbfft函数结果(已经去掉块浮点值)对比如下左图和右图,左图采用了有偏的取整方式在经过大量运算级后量化误差积累就显示了出来。

 matalb取整函数round、fix、ceil和floor函数在fpga中的实现_第5张图片


最后留个疑惑:xilinx用户手册:pg104_cmpy.pdfpage13,这个图中的进位源没有看懂是什么意思,还请大神指教。

  matalb取整函数round、fix、ceil和floor函数在fpga中的实现_第6张图片

第一次写博客,有不足之处还请指教。


你可能感兴趣的:(FPGA)