2016-11-21 11 views
5

私はFPGA上で動作するニューラルネットワークを構築しており、パズルの最後の部分はハードウェアでシグモイド関数を実行しています。これは、次のいずれかです。システムVerilogの浮動小数点数のe^xを計算しますか?

1/(1 + e^-x) 

または

(atan(x) + 1)/2 

残念ながら、ここでxはfloat値(SystemVerilogの中 real値)です。

これらの機能をSystemVerilogで実装する方法についてのヒントはありますか?

これらの関数の両方が複雑で、フロート値の複雑さが増すため、どこで実装するのかわからないため、これは本当に混乱しています。

+0

あなたはどのFPGAを設計していますか? DSPリソースはありますか? – Hida

+0

FPGA上のDSPブロックを使用してシグモイド関数を計算します。 – noobuntu

+0

レイテンシとスループットの要件は何ですか?それは私がこれをデザインするものに大きな影響を与えます。また、実際の(浮動小数点数)をハードウェアに合成できるFPGAツールには慣れていません(存在する可能性がありますが、それがあればかなり最近のものです)。 – hops

答えて

0

この簡単な方法の1つは、この機能用のメモリ/アレイを作成することです。しかし、このオプションは非常に非効率的である可能性があります。

xは、メモリの入力アドレスでなければならず、その位置の値は関数の出力とすることができます。

あなたの関数の値が以下の通りであるとします。 (これは単なる例です)

x = 0 => f(0) = 1 
x = 1 => f(0) = 2 
x = 2 => f(0) = 3 
x = 3 => f(0) = 4 

出力値を格納する配列を作成することができます。私はちょうどあなたがC. に回路を書き込むことができますVivado HLS、ことで、これを終え

int a[4] = `{1, 2, 3, 4}; 
0

はここに私のCコードです。

#include math.h 

void exp(float a[10],b[10]) 

{ 
    int i; 
    for(i=0;i<10;i++) 
    { 
     b[i] = exp(a[i]); 
    } 
} 

しかし、サイズの決められていない行列を作成することは不可能です。たぶん私にはわからない別の方法があります。

関連する問題