Une alarme sonne seulement si armée
Une porte logique est un petit circuit qui calcule un bit à partir d’autres bits. Tout processeur est fait de millions de portes, et une table de vérité permet de décrire chacune sans rien oublier.
Prenons l’alarme d’une boutique. La sirène sonne si l’alarme est armée et si la porte ou la fenêtre s’ouvre. Vous allez décrire cette règle comme un circuit, la simuler, puis lire sa table.
À la fin de cette leçon
Remarque
Je peux lire une table de vérité et écrire la porte qui la produit.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Bit | une valeur qui vaut 0 ou 1 | |
| Porte logique | un circuit qui calcule un bit à partir d’autres bits | ET, OU |
| Table de vérité | la liste de toutes les entrées possibles avec la sortie de chacune | |
| Module | un circuit décrit en Verilog, avec des entrées et des sorties | |
| Banc de test | un module qui essaie un autre module et affiche ce qui sort | |
| Simulation | faire tourner la description sur un ordinateur, sans rien construire |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une table de vérité liste tous les cas
Une table de vérité donne, pour chaque combinaison des entrées, la sortie du circuit. Avec deux entrées, il y a quatre lignes. Avec trois entrées, il y en a huit.
Chaque entrée en plus double le nombre de lignes. Une table ne laisse donc aucun cas dans l’ombre : c’est sa force.
Exemple travaillé : les trois portes de base
| a | b | a ET b | a OU b | a OU exclusif b |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
En Verilog, une porte est un opérateur
Verilog est un langage de description de matériel. On y écrit un circuit comme un module, avec ses entrées et ses sorties.
Le signe & est le ET, | est le OU, ^ est le OU exclusif et ~ est le NON. La ligne assign branche un fil : la sortie suit toujours ses entrées, à chaque instant.
Le module de l’alarme
module alarme(input porte, input fenetre, input armee, output sirene);
// La sirene sonne si l alarme est armee et si la porte ou la fenetre est ouverte.
assign sirene = armee & (porte | fenetre);
endmodule
Un banc de test essaie toutes les entrées
Un module n’a pas de clavier. Pour le voir marcher, on écrit un banc de test : un module sans entrée ni sortie, qui pilote le premier.
Il compte de 0 à 7 et range chaque nombre dans les trois entrées. Il attend un instant, puis affiche la sortie. Les huit lignes affichées forment la table de vérité de l’alarme.
Aller dans le dossier de travail
cd ~/hdlAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le module alarme.v
printf 'module alarme(input porte, input fenetre, input armee, output sirene);\n assign sirene = armee & (porte | fenetre);\nendmodule\n' > alarme.vAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire son banc de test
printf 'module alarme_tb;\n reg porte, fenetre, armee;\n wire sirene;\n integer i;\n alarme dut(.porte(porte), .fenetre(fenetre), .armee(armee), .sirene(sirene));\n initial for (i = 0; i < 8; i = i + 1) begin\n {armee, porte, fenetre} = i;\n #1 $display("armee=%%b porte=%%b fenetre=%%b -> sirene=%%b", armee, porte, fenetre, sirene);\n end\nendmodule\n' > alarme_tb.vAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compiler les deux fichiers
iverilog -o /tmp/alarme alarme.v alarme_tb.vAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lancer la simulation
vvp /tmp/alarmeAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Erreur fréquente
Attention
Beaucoup de gens pensent que le « ou » de la langue est celui de la porte OU. Dans « fromage ou dessert », on choisit l’un des deux. La porte OU donne aussi 1 quand les deux entrées valent 1. Pour « l’un ou l’autre, pas les deux », il faut le OU exclusif.
Une faute de frappe s’affiche avec sa ligne
Le compilateur lit le fichier avant de simuler. Si une expression est incomplète, il refuse et donne le nom du fichier et le numéro de ligne.
Écrivez un fichier fautif, puis compilez-le. Lisez le message : il vous dit où regarder.
Écrire un module incomplet
printf 'module m;\n wire x = ;\nendmodule\n' > erreur.vAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le compiler
iverilog -o /tmp/erreur erreur.vAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Pour aller plus loin
Écrivez sur papier la table de la porte NON-ET, c’est-à-dire un ET suivi d’un NON. Elle donne 0 seulement quand les deux entrées valent 1.
Changez ensuite la règle de l’alarme : la sirène ne sonne que si la porte et la fenêtre sont ouvertes ensemble. Prédisez la table avant de modifier alarme.v et de relancer.