FPGA中非2的整数次方的除法和小数乘法实现方法

        前阵子在处理图像处理相关的问题时,遇到了需要进行非2的整数倍的除法以及小数乘法问题,查阅网上的资料解决后,特意写本篇文章做一个小的总结。

        之前的程序中写了一个pixel/3的式子,在编译后出现了不可综合的错误,很明显就是这个式子的问题,因为这个写法是无法综合的。

        我们知道,在FPGA中,如果需要对一个数进行2的整数次方的除法,可以通过“>>”右移的方法来实现,例如一个数除以8可以通过将它右移3位来实现。那么如果这个除数不是2的1整数次方应该怎么做呢,在FPGA中是没有办法直接实现这个操作的,所以我们需要通过循环减法来实现。具体实现的方法是将被除数与除数进行比较,当被除数大于除数时,我们让商加一,同时将被除数减去除数,不断循环此操作,直到被除数小于除数,此时被除数剩下的值就是余数,而此时得到的商的累加和就是除法结果的商。举个简单的例子:16/3的结果是5余1,被除数是16,除数是3;首先将商的初始值设为0,第一次将被除数与除数比较,16>3,所以商加一,此时的商为1,而被除数减去除数后等于16-3=13;第二次将13与3比较,同样将商加一,被除数减去除数3,得到此时商为2,被除数剩10;接着再比较,10>3得到商为3,被除数剩余7;接下来以此类推,第四次商为3,被除数剩余4,第五次商为5,被除数剩余1,此时被除数小于除数,得到的5就是商,余数就是1。

        接下来我们来谈一谈小数乘法的问题,verilog并不能直接实现小数的乘法。所以我们需要考虑一个精度,先将小数进行放大,放大倍数是2的整数次方倍,然后将这个放大后的小数与乘数相乘,得到的结果再除以放大倍数,这个操作可以通过右移的方法来实现。同样举例来说明:20*0.3=6。先将0.3乘以2的8次方,也就是0.3*128=38.4约等于38,然后我们用20*38=760,接着将760右移8位,也就是760/128=5.9375,这样就得到了计算结果6的近似值。如果精度要求比较高,可以选择更大的放大倍数,例如放大1024倍得到的结果约等于5.996。

        这样我们就可以在FPGA中计算一些无法综合的乘除法运算了。

猜你喜欢

转载自blog.csdn.net/qq_57541474/article/details/128973207