是什么方法呢?
试想一下,所有的除法都可以转换成乘法运算,除一个数相当于乘以这个数的倒数,那这样除法运算也可归结到乘法运算中,只是乘以一个小数。
本文就是分享如何简单的实现一个变量乘以一个小数的方法!
当然加减法在FPGA中是最容易实现的,那么能否用加减法实现一个变量乘以一个小数的运算呢?答案是肯定的。
下面就让我来介绍一下我的实现方法。大家都知道FPGA中对一个变量进行2的整数次幂的操作是最容易实现,那我们就想办法把小数展开成2的“多项式”(加双引号意思可能这么表述不严谨)就行了,正次幂向右移,负次幂向左移,小数肯定可以转换成2的负次幂的多项式之和。为此我用LABVIEW编写了一个转换小程序,下面就举例验证说明一下。
假如要实现result=variable*0.5137,保证精度达到0.0001,其中variable为32位变量,请写出FPGA实现的表达式?
如何解答?思路前文已经阐述了,就是把0.5137转换成2的负次幂的多项式,如何实现,这里请允许我卖一个小关子,我自己已经用LABVIEW完成里这个转换的小程序,看下图:
可以看出在精度0.0001的条件下0.5137约等于2^(-1)+2^(-6)-2^(-9),那么上题的计算就容易多了。
result=variable[31 downto 1]+variable[31 downto 6]-variable[31 downto 9];
这样的式子在FPGA中运算就非常容易了,二进制的移位和加减法运算实现小数的乘除法,你看懂了吗?如果说精度要求更高,要达到0.000001,那么实现的方法也是一样的,看图:
可以看到后面增加了三项,实现起来也是非常简单!这个小方法你有没有学会呢,欢迎来交流。
有朋友可能会说:”那换一个数呢,比如乘3.1415926“。这个数分两部分3和0.1415926,主要是实现0.1415926这个数的展开,再比如要求精度达到0,就是展开多项式的计算之和没有误差,也简单,请看图:
可以看到要实现精度达到0,则要求变量至少有41位,即至少是个41位二进制数的变量才行。如果只是32位的数,那么就要求有一个精度,如图:
只要精度要求达到10^(-10)就已经戳戳有余。
致读者,希望本文分享的方法能对读者有所帮助,也欢迎来讨论,这个软件实现起来也很简单。文中不足之处欢迎批评指正,谢谢。