可编程逻辑
FPGA实现加法和减法运算非常简单,实现乘法和除法可以用IP,那实现对数和指数运算该用什么呢?
用 IP Core?
当然对于对数和指数运算,FPGA 产商也提供有对应的 IP 。
在 Vivado 里面有个叫 floating-point 的 IP ,可以用来实现对数运算,而且还是使用浮点数来进行计算。如果你在 FPGA 内部使用的是定点数,那就需要先将定点数转为浮点数。
实现指数运算,大部分的案例,似乎都是推荐使用 Cordic 这个 IP 来做。当然也可以用这个算法来做对数运算。
虽然这里说对于对数和指数运算,FPGA 也可以用IP,不过大家别觉得有IP 用就简单了。IP 的那些设置,以及 IP 的输入数据等等,也够你忙活半天了。IP Core 功能强大的背后,也是需要付出代价的。
咱们这篇文章来介绍一种快速实现对数和指数运算的方法:基于查找表来实现。
在某些项目中,我们并不需要对大量数据进行对数和指数运算,亦或是只需要计算少量数据的对数和指数。
在这种情况下,基于查找表来实现,就显得非常快捷和简便了!
那用查找表的方法怎么来做呢?
比如,计算 1 - 255 这 255 个数据的对数,怎么用查找表的方法来实现呢?
先用 Matlab 将 1-255 所有数据的对数都算出来。
x = 1:255; y = log(x);
可以看到 y 取值如下图:
计算的结果是有小数的,FPGA表示小数不方便,为了保证精度,可以先将小数的结果乘上1000,之后再将运算后的值除以1000。。当然如果你对结果的精度要求不高,乘上100也行。
下图是乘上1000之后取整的结果:
之后将数据提取出来,使用 ROM 来将这些已经算好的数据存起来。便于ROM使用这些数据,我们可以将这些数据转换相对应的 mif 文件或者 coe文件。
将待求对数的数据当成 ROM 的读地址,ROM 的输出就是对数的结果了。
如何将对数的结果值转成 coe 文件或者 mif 文件呢?可以参考如下 Matlab 代码:
% 转成coe文件 close all; clear all; clc; x = 1:255; y = log(x); y1 = uint16(y*1000); % 输出 coe 文件 fid = fopen('./log.coe','w+'); fprintf(fid,'; Copyright (C) 2017-Endless, OpenSoc Studio Corporation '); fprintf(fid,'memory_initialization_radix = 16; '); fprintf(fid,'memory_initialization_vector = '); for i = 1 : 255 fprintf(fid,'%d',i-1); fprintf(fid,':'); fprintf(fid,[dec2hex(y1(i)) '; ']); end fprintf(fid,';'); fclose(fid);
关于将对数的结果值转成 mif 文件,大家可参照上述代码自行更改。
关于上述代码,可直接将代码 copy下来放在 Matlab 中运行。
对于用FPGA实现指数运算,也可以采用相同的方法,怎么写代码,就交给大家自己来完成了!
关于使用查找表方式来实现对数运算的方法,希望对大家有所启示。
编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !