掌握這種方法,讓你快速實現FPGA指數和對數運算

注:本篇文章由【開源騷客:OpenSoc】公眾號首發,現轉載至頭條號。

FPGA實現加法和減法運算非常簡單,實現乘法和除法可以用IP,那實現對數和指數運算該用什麼呢?

掌握這種方法,讓你快速實現FPGA指數和對數運算

以 e 為底的對數曲線圖

用 IP Core?

當然對於對數和指數運算,FPGA 產商也提供有對應的 IP 。

在 Vivado 裡面有個叫 floating-point 的 IP ,可以用來實現對數運算,而且還是使用浮點數來進行計算。如果你在 FPGA 內部使用的是定點數,那就需要先將定點數轉為浮點數。

實現指數運算,大部分的案例,似乎都是推薦使用 Cordic 這個 IP 來做。當然也可以用這個算法來做對數運算。

雖然這裡說對於對數和指數運算,FPGA 也可以用IP,不過大家別覺得有IP 用就簡單了。IP 的那些設置,以及 IP 的輸入數據等等,也夠你忙活半天了。IP Core 功能強大的背後,也是需要付出代價的。

咱們這篇文章來介紹一種快速實現對數和指數運算的方法:基於查找表來實現

在某些項目中,我們並不需要對大量數據進行對數和指數運算,亦或是隻需要計算少量數據的對數和指數。

在這種情況下,基於查找表來實現,就顯得非常快捷和簡便了!

那用查找表的方法怎麼來做呢?

比如,計算 1 - 255 這 255 個數據以 e 為底的對數,怎麼用查找表的方法來實現呢?

先用 Matlab 將 1-255 所有數據的對數結果都算出來。

x = 1:255;

y = log(x);

可以看到 y 取值如下圖:

掌握這種方法,讓你快速實現FPGA指數和對數運算

計算的結果是有小數的,FPGA表示小數不方便,為了保證精度,可以先將小數的結果乘上1000,之後再將運算後的值除以1000。。當然如果你對結果的精度要求不高,乘上100也行。

下圖是乘上1000之後取整的結果:

掌握這種方法,讓你快速實現FPGA指數和對數運算

之後將數據提取出來,使用 ROM 來將這些已經算好的數據存起來。便於ROM使用這些數據,我們可以將這些數據轉換相對應的 mif 文件或者 coe文件。

將待求對數的數據當成 ROM 的讀地址,ROM 的輸出就是對數乘上1000後的結果了,之後再將運算後的結果除上1000。

掌握這種方法,讓你快速實現FPGA指數和對數運算

如何將對數的結果值轉成 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\n\n');

fprintf(fid,'memory_initialization_radix = 16;\n');

fprintf(fid,'memory_initialization_vector =\n');

for i = 1 : 255

fprintf(fid,'%d',i-1);

fprintf(fid,':');

fprintf(fid,[dec2hex(y1(i)) ';\r\n']);

end

fprintf(fid,';');

fclose(fid);

關於將對數的結果值轉成 mif 文件,大家可參照上述代碼自行更改。

關於上述代碼,可直接將代碼 copy下來放在 Matlab 中運行。

對於用FPGA實現指數運算,也可以採用相同的方法,怎麼寫代碼,就交給大家自己來完成了!

關於使用查找表方式來實現對數運算的方法,希望對大家有所啟示。


分享到:


相關文章: