Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Portes logiques et tables de vérité

Après cette leçon: Je peux lire une table de vérité et écrire la porte qui la produit.

Leçon de 55 min7 commandesLab Conception numérique : Verilog, VHDL et yosys dans une VM Ubuntu privée

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

MotCe que ça veut direExemple
Bitune valeur qui vaut 0 ou 1
Porte logiqueun circuit qui calcule un bit à partir d’autres bitsET, OU
Table de véritéla liste de toutes les entrées possibles avec la sortie de chacune
Moduleun circuit décrit en Verilog, avec des entrées et des sorties
Banc de testun module qui essaie un autre module et affiche ce qui sort
Simulationfaire 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

aba ET ba OU ba OU exclusif b
00000
01011
10011
11110

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

Code: c
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

Commande
cd ~/hdl

Affiché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

Commande
printf 'module alarme(input porte, input fenetre, input armee, output sirene);\n  assign sirene = armee & (porte | fenetre);\nendmodule\n' > alarme.v

Affiché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

Commande
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.v

Affiché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

Commande
iverilog -o /tmp/alarme alarme.v alarme_tb.v

Affiché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

Commande
vvp /tmp/alarme

Affiché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

Commande
printf 'module m;\n  wire x = ;\nendmodule\n' > erreur.v

Affiché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

Commande
iverilog -o /tmp/erreur erreur.v

Affiché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.

À propos de ce labo et de sa source: Lab Conception numérique : Verilog, VHDL et yosys dans une VM Ubuntu privée

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.