2011-04-22 4 views
2

J'essaie de convertir un nombre de format binaire IEEE single precision en nombre entier. J'utilise la boucle suivante:verilog IEEE 754 conversion de simple précision en nombre entier

for(i=22;i>=0;i=i-1) 
begin 
    a1=in1[i]*(2**(i-23)); 
end 
a1=a1+1; 
a1=a1*(2**(in1[30:23]-8'b01111111)); 
a1=((-1)**(in1[32]))*a1; 

Je dois faire ceci 7 fois plus dans mon programme. Ma question est s'il y a une bibliothèque pour faire ceci, qui prend une entrée de 32 bits et donne une sortie entière? Si oui, comment puis-je inclure cette fonction dans mon programme? Merci.

Mise à jour: L'extrait ci-dessus fonctionnera correctement?

+0

Il existe un cœur flottant sur les opencores. Avez-vous une cible de synthèse, ou est-ce uniquement pour la simulation? Quel est votre format de sortie? Dans un commentaire ci-dessous, vous dites que vous voulez qu'il soit «exactement le même», ce qui nécessiterait un format de point fixe en utilisant des centaines de bits. – Andy

+0

ceci est pour la simulation seulement. J'essaye d'écrire le code pour l'unité de point flottant de SPU du processeur de Cellule.En fonction de l'instruction, je dois effectuer différentes tâches sur des nombres à virgule flottante. Les nombres sont représentés par 32 bits. Je veux les ajouter, les soustraire ... et les stocker dans un autre champ de 32 bits. Dans l'extrait ci-dessus, j'ai converti in1 en a1. Je dois convertir in2 en a2 de manière similaire et faire a1 + a2 ou a1-a2 ou ... et le stocker en c2. Ensuite, je devrais être capable de le convertir à out1 qui est de 32 bits de large. J'espère que vous l'aurez compris. – Brahadeesh

Répondre

2

Une façon de le faire serait de:

  1. remballer les opérandes au format double précision 64 bits
  2. convertir les valeurs en nombres réels avec $bitstoreal
  3. utilisation Verilog natif flottant mathématiques points pour fonctionner sur les réels
  4. convertir les réels en bits avec $realtobits
  5. convertir le double retour 64 bits au format de précision simple. La valeur doit être écrêtée si elle est en dehors de la plage représentable (il y a des cas "trop ​​loin de zéro" et "trop ​​proche de zéro" qui doivent être verrouillés).

Si vous souhaitez convertir les flottants en point fixe en utilisant la stratégie de la question, gardez à l'esprit que Verilog n'a pas de support de point fixe natif. Vous ne pouvez pas évaluer de manière significative 2^(exposant négatif) comme un entier, vous obtiendrez juste zéro. Soit restructurer l'algorithme de sorte que les exposants soient toujours positifs, soit utiliser les décalages droits (>>) plutôt que la multiplication par une puissance négative de deux.

2

Pour une utilisation de code de comportement soit rtoi de $() ou realtobits $()

real in1; 
integer  a1; 
wire [63:0] b1; 
a1 = $roti(in1); //Truncates fractional part 
b1 = $realtobits(in1); //Probably not what you want 

Vous pouvez utiliser bitstoreal $() si vous avez besoin de jeter un vecteur de bits à un type réel. Donc, si je suis vos commentaires correctement, vous construisez un modèle d'ALU en virgule flottante qui fonctionne sur des valeurs de données 32 bits. Dans ce cas, vous pouvez utiliser réel types de données depuis Verilog peut gérer ce format nativement. Bien sûr, vous ne serez pas en mesure de détecter certaines situations

task [31:0] realAdd(input [31:0] in1, input [31:0] in2, output [31:0] out); 
begin 

real rIn1,rIn2,rOut; 
rIn1 = $bitstoreal(in1); 
rIn2 = $bitstoreal(in2); 
rOut = rIn1 + rIn2; 

out = $realtobits(rOut); 

end 
endtask 

Ces fonctions utilisent tous la double précision de sorte que vous aurez besoin de faire quelques extensions peu trivial pour gérer les entrées de simple précision, et des limites non triviales contrôle/Troncature sur la sortie. Vous pouvez éviter cela en utilisant SystemVerilog, qui a les fonctions $ bitstoshortreal()/$ shortrealtobits() qui fonctionnent sur des valeurs de précision simple.

Si vous voulez du matériel pour cela, Computer Organization & Design a une description d'une implémentation multi-cycle. Comme Andy posté, il pourrait y avoir de meilleures ressources pour votre cas. Ce ne sont pas simples à concevoir.

+0

Je ne veux pas tronquer la partie fractionnaire. Je le veux exactement pareil. Même si la conversion n'est pas possible, je serais heureux si n'importe quelle bibliothèque peut ajouter ou soustraire deux tels nombres de précision simple. – Brahadeesh

Questions connexes