FPGA實(shí)現(xiàn)加法和減法運(yùn)算非常簡(jiǎn)單,實(shí)現(xiàn)乘法和除法可以用IP,那實(shí)現(xiàn)對(duì)數(shù)和指數(shù)運(yùn)算該用什么呢?

用 IP Core?
當(dāng)然對(duì)于對(duì)數(shù)和指數(shù)運(yùn)算,F(xiàn)PGA 產(chǎn)商也提供有對(duì)應(yīng)的 IP 。
在 Vivado 里面有個(gè)叫 floating-point 的 IP ,可以用來(lái)實(shí)現(xiàn)對(duì)數(shù)運(yùn)算,而且還是使用浮點(diǎn)數(shù)來(lái)進(jìn)行計(jì)算。如果你在 FPGA 內(nèi)部使用的是定點(diǎn)數(shù),那就需要先將定點(diǎn)數(shù)轉(zhuǎn)為浮點(diǎn)數(shù)。
實(shí)現(xiàn)指數(shù)運(yùn)算,大部分的案例,似乎都是推薦使用 Cordic 這個(gè) IP 來(lái)做。當(dāng)然也可以用這個(gè)算法來(lái)做對(duì)數(shù)運(yùn)算。
雖然這里說(shuō)對(duì)于對(duì)數(shù)和指數(shù)運(yùn)算,F(xiàn)PGA 也可以用IP,不過(guò)大家別覺(jué)得有IP 用就簡(jiǎn)單了。IP 的那些設(shè)置,以及 IP 的輸入數(shù)據(jù)等等,也夠你忙活半天了。IP Core 功能強(qiáng)大的背后,也是需要付出代價(jià)的。
咱們這篇文章來(lái)介紹一種快速實(shí)現(xiàn)對(duì)數(shù)和指數(shù)運(yùn)算的方法:基于查找表來(lái)實(shí)現(xiàn)。
在某些項(xiàng)目中,我們并不需要對(duì)大量數(shù)據(jù)進(jìn)行對(duì)數(shù)和指數(shù)運(yùn)算,亦或是只需要計(jì)算少量數(shù)據(jù)的對(duì)數(shù)和指數(shù)。
在這種情況下,基于查找表來(lái)實(shí)現(xiàn),就顯得非??旖莺秃?jiǎn)便了!
那用查找表的方法怎么來(lái)做呢?
比如,計(jì)算 1 - 255 這 255 個(gè)數(shù)據(jù)的對(duì)數(shù),怎么用查找表的方法來(lái)實(shí)現(xiàn)呢?
先用 Matlab 將 1-255 所有數(shù)據(jù)的對(duì)數(shù)都算出來(lái)。
x = 1:255; y = log(x);
可以看到 y 取值如下圖:

計(jì)算的結(jié)果是有小數(shù)的,F(xiàn)PGA表示小數(shù)不方便,為了保證精度,可以先將小數(shù)的結(jié)果乘上1000,之后再將運(yùn)算后的值除以1000。。當(dāng)然如果你對(duì)結(jié)果的精度要求不高,乘上100也行。
下圖是乘上1000之后取整的結(jié)果:

之后將數(shù)據(jù)提取出來(lái),使用 ROM 來(lái)將這些已經(jīng)算好的數(shù)據(jù)存起來(lái)。便于ROM使用這些數(shù)據(jù),我們可以將這些數(shù)據(jù)轉(zhuǎn)換相對(duì)應(yīng)的 mif 文件或者 coe文件。
將待求對(duì)數(shù)的數(shù)據(jù)當(dāng)成 ROM 的讀地址,ROM 的輸出就是對(duì)數(shù)的結(jié)果了。

如何將對(duì)數(shù)的結(jié)果值轉(zhuǎn)成 coe 文件或者 mif 文件呢?可以參考如下 Matlab 代碼:
% 轉(zhuǎn)成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);
關(guān)于將對(duì)數(shù)的結(jié)果值轉(zhuǎn)成 mif 文件,大家可參照上述代碼自行更改。
關(guān)于上述代碼,可直接將代碼 copy下來(lái)放在 Matlab 中運(yùn)行。
對(duì)于用FPGA實(shí)現(xiàn)指數(shù)運(yùn)算,也可以采用相同的方法,怎么寫(xiě)代碼,就交給大家自己來(lái)完成了!
關(guān)于使用查找表方式來(lái)實(shí)現(xiàn)對(duì)數(shù)運(yùn)算的方法,希望對(duì)大家有所啟示。
編輯:黃飛
電子發(fā)燒友App







































評(píng)論