Étape 20 : VM 4.3 : If/Else en Verilog
Ce Module de tutoriel est mieux terminé après une solide compréhension du Module 4.2 concernant les déclarations de blocage et non-blocage.If/Else instructions en Verilog sont extrêmement utiles lorsqu’il est utilisé correctement. Tout d’abord jeter un oeil à quelques règles que vous devez suivre pour If/Else instructions en Verilog :
1. tous les If/Else instructions doivent être situées à l’intérieur d’une toujours bloquer
2. toutes les valeurs définies par un If/Else instruction doit être de type reg
3. Si vous affectez plusieurs reg, utilisez « début » et « fin » pour définir la portée de l’If/Else. Qu’une seule déclaration ? Alors ne vous inquiétez pas à ce sujet. Mais de toute façon finir chaque ligne interne d’un If/Else avec un point-virgule (un point-virgule ne suivra jamais une déclaration « commencer » ou « fin »).
4. utiliser des opérateurs de comparaison avec 2 symboles dans des conditions (c'est-à-dire "& &" et « == » et "! =")
Fondamentalement, c’est tout là est à lui. Si votre code vous donne toujours des questions, renvoyer à ces quatre règles et posez-vous la question suivante, « Mon code respecte ces règles? ».
En Verilog, nous arrivons à utiliser des instructions conditionnelles base trois : if, else et else if. Avant d’arriver à utiliser ceux-ci cependant, il faut aller sur la façon d’affecter des valeurs aux Règl.
Nous savons qu’un reg est comme un fil qui peut avoir sa propre source, autrement dit, un fil qui permet de générer sa propre valeur. Nous savons aussi que nous pouvons avoir bus regs et regs unique.
Vous pouvez utiliser un reg comme vous le feriez une variable en C/C++ ; il stocke sa valeur jusqu'à explicitement modifié :
Reg myReg ;
myReg = 1' b1 ; blocage
myReg < = 1' b0 ; non-bloquante
Ceci définit le reg à haute tension logique puis en tension de la logique. Toutefois, les valeurs assignées à regs ne doivent se faire à l’intérieur d’un bloquer toujours à moins que vous ne changera jamais sa valeur. Si vous avez juste besoin, par exemple, un fil logique constante, vous pouvez donner un reg une valeur en dehors de le toujours bloquer.
Assignation (n’égalise au mot-clé assign) une valeur à un reg nécessite le format suivant pour le côté gauche de l’instruction :
< nom du reg >< opérateur equals (= ou < =) >
Et pour le côté droit (la valeur) :
< largeur de bus > ' < type valeur >< valeur >
Ceci est important car la largeur de la reg doit correspondre exactement à la largeur de la valeur. Il y a beaucoup de différents types de valeurs que nous pouvons attribuer à la reg, comme binaire, hexadécimal et décimal (dénommés en Verilog b, h et d respectivement), mais je recommande fortement que ceux qui apprennent à Verilog utilisent des valeurs binaires uniquement. Ils sont facile à travailler et aussi facile à dépanner.
Lorsque vous utilisez des valeurs binaires, vous devez taper sur chaque valeur (1 ou 0) de chaque bit de reg sauf si vous faites le reg ou tout haut ou tout bas.
Exemples :
my_reg < = 4' b0 ; juridiques
my_reg2 < = 3' b010 ; juridiques
my_reg3 < = 4' b01 ; illégal (incompatibilité de largeur ; attend 4 bits)
Ces déclarations seraient lus en anglais comme, par exemple, « quatre bits zéro binaire » ou « trois bits binaire deux ».
Maintenant que nous savons comment assigner une valeur à un reg, regardons comment faire pour utiliser des instructions If/Else en Verilog, commençant par un exemple :
(testMod) module
entrée a,
entrée b,
c sortie
);
Reg Q ; toujours @ (a, b) //if l’état d’un ou des changements aux b ré-exécuter ce code assigner c = Q ; endmodule
commencer
Si (a == b1 1' || b == 1' b0)
Q < = 1' b0 ;
d’autre
Q < = 1' b1 ;
fin
Pouvez-vous retracer grâce à ce code et en déduire comment un If/Else instruction fonctionne en Verilog ?
Que se passe-t-il si nous voulons manipuler plusieurs valeurs si déclenche le « if » (Remarque : Si votre si instruction modifie deux valeurs, votre instruction else doit également modifier deux valeurs afin d’éviter des valeurs flottantes) ?
(testMod) module Reg Q ; toujours @ (a, b) //if l’état d’un ou des changements aux b ré-exécuter ce code assigner les c [0] = Q ; endmodule
entrée a,
entrée b,
sortie c [1:0]
);
Reg T ;
commencer
Si (a == 1' b0)
commencer
Q < = 1' b0 ;
T < = 1' b0 ;
fin
else if (a == b1 1' & & b == 1' b1)
commencer
Q < = 1' b1 ;
T < = 1' b0 ;
fin
d’autre
commencer
Q < = 1' b1 ;
T < = 1' b1 ;
fin
fin
assigner les c [1] = T ;
Je pense que cet exemple liens beaucoup des idées couverts dans cette série de tutoriels ensemble. J’ai également jeté dans une instruction Else If. Sans surprise, il fonctionne comme un C/C++. Assurez-vous juste que les actions de chaque État gère les sorties mêmes (dans ce cas, les deux Q et T ont été traitées dans chaque cas). Noter les mots-clés begin et end dans les endroits qu’intuitivement devrait y avoir des accolades.
C’est tout il y à des déclarations de If/Else If/Else en Verilog. N’oubliez pas de consulter les règles de conception en haut de ce Module tutoriel à des fins de débogage.