学好FPGA,当然需要一定的基础,在俺看来,最基础的是数学,所以期待初学FPGA的童鞋,能够真正重视数学,把大学数学这门课认真学好。
从FPGA本身来说,无论用在哪个行业、进行什么样的处理,归根结底他其实就做两种运算:一是逻辑运算,二是数学运算,这数学运算的根基除了相应的专业知识以外,便是数学。
举个极其简单的例子,比如两个32bit的数据X[31:0]与Y[31:0]相乘。当然,无论Altera还是Xilinx都有现成的乘法器可以调用, 从实现最简单这一方面来说的话,直接调用现成的IP最简单,可两个32bit的乘法器将耗费大量的资源。我们可以稍微简化如下:
将X[31:0]拆成两部分X1[15:0]和X2[15:0],令X1[15:0]=X[31:16],X2[15:0]=X[15:0],则X1左移16位后与X2相加可以得到X;
同样将Y[31:0]拆成两部分Y1[15:0]和Y2[15:0],令Y1[15:0]=Y[31:16],Y2[15:0]=Y[15:0],则Y1左移16位后与Y2相加可以得到Y;
则X与Y的相乘可以转化为X1和X2分别与Y1和Y2相乘,这样一个32bit*32bit的乘法器用了四个16bit*16bit的乘法器和三个32bit的加法器替代。
有兴趣的童鞋,不妨综合一下看看,这两者的面积区别是多大。
或许上面的这个例子不是很恰当,并不能很充分的说明数学的重要性,那还有一个常见的例子,比如求对数函数ln(x)。
如果x是一个常数或者在有限范围内取值,那么很简单,我们可以使用计算器把所有的值都算好,再根据系统精度的要求直接将ln(x)用所有的常数替代,比如ln2就可以使用0.69来代替(假设精度只要求精确到小数点后两位),将这些常数存到查找表中去;
如果x是一个变量,如果其取值时变,此时如何计算?考虑到FPGA尤其适合于乘加运算,因此我们便可以考虑将其展开成幂级数的形式。
像上面的这些简单例子,如果数学功底比较好,可以很容易想到办法就把问题解决,相反,如果需要用到两ln(x)的时候,我们不记得还有幂级数展开这一手段,怎么办?
我们毕业开始工作,并不是每家公司都会配有专门的算法工程师,来进行信号处理过程中的每一步运算过程的分解;单就这一点,我们就应该好好把数学学好,这样在以后的工作中,碰到类似的数学处理过程时,才能够做到游刃有余。