代码实现中,如何处理FPGA中的定点数?
扫描二维码
随时随地手机看文章
在这篇文章中,小编将对FPGA中的定点数处理方法的相关内容和情况加以介绍以帮助大家增进对它的了解程度,和小编一起来阅读以下内容吧。
一、代码实现时,如何处理FPGA中的定点数
FPGA中最常用的还是定点化数据处理方法,本文对定点化数据处理方法进行简要探讨,并给出必要的代码例子。
1、一般扩位原则:
1) 加减法运算:扩位位宽=ceil(log2(加法个数))
如:两个加法扩1位,三个四个加法扩2位…
2)乘法运算:结果扩位位宽=两个乘数位宽的和
如:15bit数与14bit相乘结果位宽应为29bit。
3)除法运算:结果扩位位宽=被除数位宽与除数位宽的差
符号位扩展:
2、高位截位,分为饱和截位和直接截位:
1)高位直接截位,直接抛掉高位保留低位,在确认信号不会溢出的模块使用直接截位的方法,节省资源;
2)高位饱和截位:对计算后的数据进行判断,如果超出位宽,正数输出为最大值,负数输出为最小值;判断方法就是看高位是否完全相同。
3、低位截位:
1)直接截位:功率计算等统计模块会使用,数字信号处理中不会使用,因为这种方式,频域会出现直流。
2)四舍五入:如下所示,上一篇文章中说了数据的表示(FPGA数字信号处理之数据的表示),看一看到对于补码,verilog中只针对负数的0.5进行特殊处理即可。
代码如下,代码中会判断信号是否是-n.5,进行处理。
3)近似四舍五入,对于真四舍五入来说,对-0.5的判断逻辑较为复杂,而且有的数据处理对-0.5的要求也不高,此时可以采用近似四舍五入的方法,之前的代码中最常出现的就是这种处理方式:
可以看到这种处理方式下-0.5的值是偏大的。
另外,要注意上一篇文章中多次提到的IEEE 754浮点数标准里面,对于浮点数取整的规定如下
1.就近舍入Round to nearest (even)
2. 向零舍入(Truncate)
3.朝正无穷舍入Round up (toward +∞)
4.朝负无穷舍入Round down (toward −∞)
python等默认使用的就是 就近舍入Round to nearest (even) 处理方法,python中的计算结果为:
round(0.5)= 0
round(1.5)=2
这一点大家做算法时要注意一下。
二、FPGA工作原理拓展
FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输入输出模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。 现场可编程门阵列(FPGA)是可编程器件,与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构。FPGA利用小型查找表(16×1RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程。
上述所有信息便是小编这次为大家推荐的内容,希望大家能够喜欢,想了解更多有关它的信息或者其它内容,请关注我们网站哦。