LOGIQUE PROGRAMMABLE EN VERILOG
Chapitre 1. Introduction
Chapitre 2. Traitement combinatoire et syntaxe du langage
2.1. Le module
2.2. Les entrées - sorties
2.3. Les niveaux logiques
2.4. Le corps du programme
2.5. Les opérations logiques binaires
2.6. Les opérations logiques unaires
2.7. Les opérations arithmétiques
2.8. Les bus
2.9. La déclaration de paramètre
2.10. La concaténation
2.11. Exemple: l'additionneur 1 bit complet
2.12. Taille et codage des nombres
2.13. Extension des modules
2.14. Avantages et Inconvénients des différentes approches sur un exemple
2.15. Exercices
2.16. Solution des exercices
Chapitre 3. L'usage de l'outil QUARTUS II
Chapitre 4. Description comportementale
Chapitre 5. Projets : énoncés
Chapitre 6. Projets : vers la solution
Page d'accueil Table des matières Niveau supérieur Page précédente Bas de la page Page suivante

2.12. Taille et codage des nombres

Le langage permet de définir la taille de codage d’une valeur en précisant cette taille avant la valeur et séparée par une apostrophe (). Par défaut cette taille est de 32 bits.

Il est ainsi possible de limiter la taille des nombres lors des calculs, et ainsi de contrôler et limiter les warnings générés.

Il permet de définir le codage (base d’écriture) et reconnaît:

  • le binaire (b),
  • l’octal (O),
  • le décimal (d),
  • l’hexadécimal (h).

L’absence de symbole définit le type décimal.

Remarque : le souligné (_) tout comme l’espace est un élément pouvant être inséré pour faciliter la lecture d’une valeur.


Ainsi :

  • 7‘b10 est la représentation du nombre binaire 10 codé sur 7 bits
    soit en mémoire :
    0000010
  • 10 représentera la valeur décimale 10 codée sur 32 bits
    soit en mémoire :
    00000000_00000000_00000000_00001010
  • 16’h10 représentera la valeur hexadécimale 10 codée sur 16 bits
    soit en mémoire :
    00000000_00010000
  • ‘h1acd représentera la valeur hexadécimale 1acd codée sur 32 bits
    soit en mémoire :
    00000000_00000000_00011010_11001101
  • 8'd260 représentera la valeur décimale 260 sur 8 bits, soit en mémoire après la limitation à 8 bits :
    0000_0100


En reprenant l'exemple de l'additionneur complet 1 bit :

assign {R1, S1} = A1 + B1 + R0 + 0 ;

Cette ligne génère un warning indiquant la troncature du résultat de 32 à 2 bits

assign {R1, S1} = A1 + B1 + R0 + 2‘d0 ;

Cette ligne ne génère aucun message d'erreur à la compilation.

Un contrôle de la taille implique des troncatures imposées : il faudra toujours dimensionner à la bonne taille les résultats intermédiaires.

 

Ceci n’est parfois pas un apport et gène notamment dans la lisibilité du traitement.

De même : les nombres négatifs sont connus et pourront être codés (-10, -125 …). Même si les bus sont des variables non signées, il est possible de faire apparaître des nombres signés en faisant précéder le signe - devant le nombre.

output [7 :0] S ;

assign S = -1 ; // est valide

assign S = -8'd1 ; // est valide et identique

assign S = 255 ; // est valide et identique

assign S = 8'd-1 ; // est invalide

Attention aux tests qui peuvent ne pas donner les résultats attendus quand on manipule des nombres signés et non signés. 

Le langage connaît les nombres signés. Ils se déclarent sous la forme du mot integer et sont des variables 32 bits.

Exemple :

integer x ;

x = 3*x /12 + 2**4 ;

 

 
Page d'accueil Table des matières Niveau supérieur Page précédente Haut de la page Page suivante