2016-11-21 3 views
5

Je construis un réseau de neurones fonctionnant sur un FPGA, et la dernière pièce du puzzle exécute une fonction sigmoïde dans le matériel. C'est:Calculer e^x pour les valeurs flottantes dans System Verilog?

1/(1 + e^-x) 

ou

(atan(x) + 1)/2 

Malheureusement, x est une valeur flottante ici (une valeur real dans SystemVerilog).

Existe-t-il des conseils sur l'implémentation de l'une de ces fonctions dans SystemVerilog?

Cela m'embrouille vraiment car ces deux fonctions sont complexes et je ne sais même pas par où commencer à les implémenter en raison de la complexité supplémentaire des valeurs flottantes.

+0

Pour quels FPGA concevez-vous? A-t-il des ressources DSP? – Hida

+0

Utilisez un bloc DSP sur votre FPGA pour calculer la fonction sigmoïde. – noobuntu

+0

Quelles sont les exigences de latence et de débit? Cela influencerait fortement tout ce que je concevrais pour cela. De plus, je ne connais pas d'outil FPGA capable de synthétiser un réel (float) en matériel (il peut exister, mais c'est assez récent si c'est le cas). – hops

Répondre

0

Un moyen plus simple pour cela est de créer une mémoire/matrice pour cette fonction. Cependant, cette option peut être très inefficace.

x doit être l'adresse d'entrée pour la mémoire et la valeur à cet emplacement peut être la sortie de la fonction. Supposons que la valeur de votre fonction soit la suivante. (Ceci est juste un exemple)

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

Vous pouvez donc créer un tableau pour cela, qui a stocké les valeurs de sortie.

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

Je viens de terminer ce par Vivado HLS, qui vous permet d'écrire des circuits en C. Voici mon code C.

#include math.h 

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

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

Mais il est difficile de créer une matrice non dimensionnée. Peut-être qu'il y a un autre moyen que je ne connais pas.