nombre a virgule en binaire (VHDL)

Electronique numérique / Circuits logiques programmables EPLD, CPLD, FPGA d'Altera ou de Xilinx VHDL, Verilog ou SystemC

Modérateur : Modérateur

Avatar de l’utilisateur
marsu
INSATIABLE
INSATIABLE
Messages : 155
Inscription : 13 juin 2005 10:08
Localisation : Paris
Contact :

nombre a virgule en binaire (VHDL)

Message par marsu »

Bonjour a tous,
J’aimerais concevoir un codeur (arithmétique) en VHDL. Ce codeur me fourni (après codage) un nombre compris entre 0 et 1 et pouvant très bien avoir 25 chiffres après la virgule.
Donc j’aimerai savoir comment représenter ce chiffre en langage binaire…
Merci pour votre aide

JP
Administrateur
Administrateur
Messages : 2323
Inscription : 23 sept. 2003 18:14
Localisation : Strasbourg
Contact :

Message par JP »

Hello,

En nombre à virgule flottante ou norme IEEE-754.

En simple précision tu peux coder un nombre compris entre 2^-126 et ~2^128 sur 32bit, il y a aussi la double précision 2^-1022 à ~2^1024 soit beaucoup plus de 25 chiffres après la virgule :-D

Pour l'utilisation en VHDL, il y a une piste ici :
http://forums.jelectronique.com/ftopic232-0-asc-8.php

a+
JP

Avatar de l’utilisateur
vincevg
ACCRO
ACCRO
Messages : 803
Inscription : 05 mars 2005 16:58
Localisation : SMalville
Contact :

Message par vincevg »

C'est simple les bits à droite de la virgule ont les poids 1/2^1, 1/2^2, 1/2^3 etc...
Vince
http://anyedit.free.fr/
http://electropol.free.fr/

Les amis, ça va, ça vient, mais les ennemis, ça s’accumule.

Avatar de l’utilisateur
marsu
INSATIABLE
INSATIABLE
Messages : 155
Inscription : 13 juin 2005 10:08
Localisation : Paris
Contact :

Message par marsu »

vincevg a écrit :C'est simple les bits à droite de la virgule ont les poids 1/2^1, 1/2^2, 1/2^3 etc...
Simple simple.... ben heu je veux bien que tu me codes 0,00001285984716... (mais la il n'y a que 14 chiffres après la virgule..)


Parce que moi j'aimerais aussi que cela soit implémentable sur la carte....
Dernière modification par marsu le 17 juin 2005 12:51, modifié 1 fois.

Avatar de l’utilisateur
marsu
INSATIABLE
INSATIABLE
Messages : 155
Inscription : 13 juin 2005 10:08
Localisation : Paris
Contact :

Message par marsu »

2 réponses que j'ai reçu :
1ère réponse :
Si c'est uniquement pour de la simulation, le type real est prévu pour. Sinon, il existe deux types de représentation : virgule fixe ou virgule flottante.
Le choix dépend largement de l'utilisation et du type de composant dans
lequel sera implanté la fonction.
La manipulation de flottants consomme beaucoup de resources, c'est à
exclure avec un petit composant.
Le format virgule fixe se manipule comme des entiers (il faut juste
faire attention à la position de la virgule).
Le nombres de bits nécessaires dépend de la précision voulue.
25 chiffres après la virgule en décimal demande 84 bits donc 84 bascules
pour stocker une telle valeur.
La 2ème réponse :
De manière feignante, je représenterai ce nombre par un nombre entier
binaire de 84 bits compris donc entre 0 et 2^84 - 1 soit un peu plus de
10^25. Le résultat étant donc à diviser par 10^25, un peu comme les
nombre décimaux codés bianires mais sans être des flottants.
84 bascules D, ca doit bien se trouver dans un gros FPGA.

Avatar de l’utilisateur
vincevg
ACCRO
ACCRO
Messages : 803
Inscription : 05 mars 2005 16:58
Localisation : SMalville
Contact :

Message par vincevg »

Tu prend ton nombre :
et tu le multiples par 2. A chaque étape tu gardes ce qui est à gauche de la virgule (0 ou 1)

(Je prend un exemple simple 0,3)

0,3
x2
___
0,6 Je garde 0
x2
___
1,2 Je garde 1

Je supprime le 1 ce qui me fait 0,2
0,2
x2
____
0,4 Je garde 0
x2
___
0,8 Je garde 0
x2
___
1,6 Je garde 1

Ce qui me donne en binaire 0,01001

Les poids sont les suivants : 0,5/0,25/0,125/0,0625/0,03125

0/ 1 / 0 / 0 / 1
Donc mon nombre décimal correspondant est 0,25 + 0,03125 = 0,28125

9a ne tombe pas juste. Ben oui c'est du binaire alors pour avoir mieux il faut continuer.
Vince
http://anyedit.free.fr/
http://electropol.free.fr/

Les amis, ça va, ça vient, mais les ennemis, ça s’accumule.

Avatar de l’utilisateur
marsu
INSATIABLE
INSATIABLE
Messages : 155
Inscription : 13 juin 2005 10:08
Localisation : Paris
Contact :

Message par marsu »

Merci Vince !!!
Mais comment savoir s'il faut continuer ou pas? il faux "lire" le nombre et donc se n'est pas synthétisable en VHDL....
Tout comme l'utilisation de virgule flottante...
Parce que le problème que j'ai, c'est que le système donc être synthétisable a 100%

Je pense qu'utiliser un coefficient de 10^X m'aiderais mais le nombre de bits monte vite.. Et mon tuteur de stage ne veut pas cette méthode... Lui veux utiliser la "norme" du codeur avec les 2^-X...

:casse:

JP
Administrateur
Administrateur
Messages : 2323
Inscription : 23 sept. 2003 18:14
Localisation : Strasbourg
Contact :

Message par JP »

Et mon tuteur de stage ne veut pas cette méthode... Lui veux utiliser la "norme" du codeur avec les 2^-X...
C'est le même principe :
2^-1=0.5
2^-2=0.25
2^-3=0.125

Ce qui est le codage en virgule fixe, c'est vrai c'est la norme :)
C'est plus simple mais il a des contraintes comme le fait que ça ne soit pas adapté à la multiplication.
Mais comment savoir s'il faut continuer ou pas? il faux "lire" le nombre et donc se n'est pas synthétisable en VHDL....
C'est toi qui te fixes la précision.
25 chiffres après la virgule donc une précision de
2^-x=1*10^-25 x=>84

J'ai pas cherché très loin mais j'ai trouvé quelques réponses en tapant "fixed point vhdl" sous google donc ça doit être synthétisable.

Avatar de l’utilisateur
marsu
INSATIABLE
INSATIABLE
Messages : 155
Inscription : 13 juin 2005 10:08
Localisation : Paris
Contact :

Message par marsu »

Alors pour le fin mot de l'histoire...
Apres plusieurs test, j'ai choisi pour representer un nombre à virgule allant de 0 et 1 a été pour moi de me fixer une "limite" 1.000.000.000 representant 1 donc 500.000.000 0,5 etc...
C'est limiter a 9 chiffre apres la virgule mais c'est bien car ça utilise un "integer" que je convertis en binaire

invité

Message par invité »

Voici comment on représente un nombre à virgule flottante IEEE-754 de longueur 32 bits.

Code : Tout sélectionner

 Format d'un float IEEE-754
 --------------------------------
 | 1 bit |  8 bits  |  23 bits  |
 --------------------------------
     /        /           /
 signe   exposant     mantisse

 Exemple de valeur
      1    10000010     10101000111000010100011
     /        /           /
 signe   exposant     mantisse

 -13.2775
 0xC15470A3
Pour faire quelques tests :
http://babbage.cs.qc.edu/courses/cs341/IEEE-754.html

Répondre