[B.4] Valeurs booléennes, opérateurs booléens et portes logiques

Les valeurs booléennes

Vrai ou faux

Un ordinateur ne manipule que des 0 et des 1 (il y a de l’électricité ou il n’y en a pas). Ces deux valeurs peuvent aussi être vues comme des “valeurs de vérité” :

Ce type de donnée (qui ne peut prendre que ces deux valeurs) est une valeur booléenne (ou un booléen), du nom du mathématicien anglais George Boole (1815-1864). Un booléen tient donc, en théorie, sur un seul bit : c’est le plus petit type de donnée possible.

C’est la réponse naturelle à une question fermée : « l’interrupteur est-il allumé ? », « 3 est-il plus grand que 2 ? », « la porte est-elle ouverte ? »

Deux notations pour la même chose

Électronique / circuits Mathématiques / tables Python
tension haute (5V, ou 3.3V) 1 True
tension basse (0V) 0 False

Dans ce cours nous utiliserons surtout 0 et 1, plus lisibles dans les tableaux.

Opérateurs booléens et portes logiques

Opérateurs et portes

On peut combiner des booléens avec des opérateurs booléens (ou opérateurs logiques) : NON, ET, OU, auxquels on ajoute le OU exclusif.

Exemple : quelle est la réponse à la question : “la porte est-elle fermée ET la lumière allumée ?”

Dans un ordinateur, chaque opérateur est réalisé physiquement par un composant électronique : une porte logique. Elle reçoit un ou deux signaux en entrée et produit un signal en sortie. Un processeur moderne en contient plusieurs milliards. Chaque porte a un symbole utilisé dans les schémas.

Dans un schéma, les entrées sont à gauche, la sortie à droite, et les traits qui les relient sont les fils : ils transportent une valeur, 0 ou 1. Un fil peut se diviser pour alimenter plusieurs portes, mais deux fils ne peuvent jamais arriver sur une même entrée.

Pour décrire complètement un opérateur (ou une porte), il suffit d’énumérer tous les cas possibles dans une table de vérité.

Important

Une table de vérité est un tableau qui donne la valeur de sortie pour chacune des combinaisons possibles des valeurs d’entrée.

Avec n entrées, il y a 2n2^n lignes : 2 lignes pour 1 entrée, 4 lignes pour 2 entrées, 8 lignes pour 3 entrées, 16 pour 4 entrées…

NON (NOT)

Le NON est unaire : il ne prend qu’une entrée, et l’inverse.

Porte NON
a NON a
0 1
1 0

Notations : NON a, not a (Python), a¯\overline{a} ou ¬a\lnot a (maths).

Important

Le petit rond en sortie d’une porte signifie toujours « et on inverse le résultat ».

ET (AND)

Le ET vaut 1 si et seulement si ses deux entrées valent 1 : « il faut le badge et le code ».

Porte ET
a b a ET b
0 0 0
0 1 0
1 0 0
1 1 1

Notations : a ET b, a and b (Python), aba \land b ou aba \cdot b (maths).

Astuce

Le ET se comporte comme une multiplication : aba \cdot b ne vaut 1 que si aa et bb valent 1.

OU (OR)

Le OU vaut 1 dès qu’au moins une des deux entrées vaut 1. Attention : c’est un OU inclusif, il vaut aussi 1 quand les deux valent 1.

Porte OU
a b a OU b
0 0 0
0 1 1
1 0 1
1 1 1

Notations : a OU b, a or b (Python), aba \lor b ou a+ba + b (maths).

OU exclusif (XOR)

Le OU exclusif vaut 1 quand les deux entrées sont différentes. C’est le « ou » du restaurant : fromage ou dessert, mais pas les deux.

Porte XOR

Le symbole est celui du OU, avec une barre supplémentaire à l’arrière.

a b a XOR b
0 0 0
0 1 1
1 0 1
1 1 0

Notations : a XOR b, a != b (Python, il n’y a pas de mot-clé xor), aba \oplus b (maths).

Astuce

Le XOR est un « détecteur de différence », mais aussi l’addition binaire d’un bit : 0+0=00+0=0, 0+1=10+1=1, 1+0=11+0=1, 1+1=101+1=10 dont on ne garde que le chiffre des unités, 0. Nous y reviendrons avec le demi-additionneur.

Opérateurs dérivés : NAND, NOR

On rencontre souvent les versions niées de ET et OU, plus simples à fabriquer avec des transistors. Leur symbole est celui du ET ou du OU, suivi du petit rond :

Porte NAND Porte NOR

a b a NAND b a NOR b
0 0 1 1
0 1 1 0
1 0 1 0
1 1 0 0
Culture

La porte NAND est universelle : avec uniquement des portes NAND, on peut reconstruire NON, ET, OU, XOR… et donc n’importe quel circuit logique. Idem pour NOR.

Récapitulatif des symboles

Symboles des portes logiques

Simulation

Nous utiliserons un simulateur de circuits logiques (depuis Capytale) : on y place des entrées, des portes, une sortie, puis on bascule les entrées pour observer la sortie.

Méthode

Le simulateur permet de vérifier une table de vérité, pas de la remplacer : en devoir, il faut savoir la construire à la main.

Combinaison de portes logiques

Principe

Dès qu’on assemble plusieurs portes, la sortie de l’une devient l’entrée d’une autre. Pour comprendre ce que fait le circuit, on établit sa table de vérité.

Méthode

Pour dresser la table de vérité d’un circuit :

  1. compter les entrées (n) et dessiner un tableau de 2n2^n lignes,
  2. écrire toutes les combinaisons d’entrées, dans l’ordre, en comptant en binaire de 0 à 2n12^n - 1 (c’est le plus sûr moyen de n’en oublier aucune),
  3. ajouter une colonne intermédiaire par porte, dans l’ordre où le signal les traverse (de la gauche vers la droite du schéma),
  4. remplir chaque colonne ligne par ligne, en n’utilisant que les colonnes déjà remplies,
  5. la ou les dernières colonnes sont la ou les sorties

Les colonnes intermédiaires sont le point essentiel : on ne cherche jamais à deviner la sortie directement, on avance porte par porte.

Exemple détaillé

Circuit 1 du cours

Ce circuit a 3 entrées et 3 portes :

E2 alimente deux portes : le fil se divise. Avec 3 entrées, la table a 23=82^3 = 8 lignes :

E1 E2 E3 A = E1 ET E2 B = E2 OU E3 S = A XOR B
0 0 0 0 0 0
0 0 1 0 1 1
0 1 0 0 1 1
0 1 1 0 1 1
1 0 0 0 0 0
1 0 1 0 1 1
1 1 0 1 1 0
1 1 1 1 1 0

La sortie vaut donc 1 dans 5 cas sur 8.

Exercice

Dressez, sur le même modèle (avec les colonnes intermédiaires), la table de vérité des circuits 2 et 3 de la feuille Exos portes logiques.

Expressions booléennes

Écrire un circuit sous forme d’expression

Plutôt qu’un schéma, on peut écrire une expression booléenne : une formule qui combine des variables booléennes avec NON, ET, OU et XOR. Le circuit 1 précédent s’écrit :

S=(E1 ET E2) XOR (E2 OU E3)S = (E_1 \text{ ET } E_2) \text{ XOR } (E_2 \text{ OU } E_3)

Schéma et expression sont deux écritures du même objet ; il faut savoir passer de l’une à l’autre :

Règles de priorité

Comme en mathématiques (2+3×4=142 + 3 \times 4 = 14 et non 20), les opérateurs booléens ont des priorités :

Important

Par ordre de priorité décroissante :

  1. les parenthèses,
  2. NON,
  3. ET,
  4. OU (et XOR).

À priorité égale, on évalue de gauche à droite.

Pour retenir : ET se comporte comme la multiplication, OU comme l’addition — et la multiplication est prioritaire.

Exemple
  • a OU b ET c se lit a OU (b ET c)
  • NON a ET b se lit (NON a) ET b — et pas NON (a ET b), qui est un NAND !

La table de vérité montre la différence :

a b (NON a) ET b NON (a ET b)
0 0 0 1
0 1 1 1
1 0 0 1
1 1 0 0

Les deux colonnes sont différentes : les parenthèses comptent.

Conseil

En cas de doute, mettez des parenthèses : c’est toujours correct, et plus lisible.

Dresser la table d’une expression

Même méthode que pour un circuit : une colonne intermédiaire par opérateur, en respectant les priorités.

Exemple : table de vérité de S=(a ET b¯) OU (a¯ ET b)S = (a \text{ ET } \overline{b}) \text{ OU } (\overline{a} \text{ ET } b) :

a b a¯\overline{a} b¯\overline{b} a ET b¯a \text{ ET } \overline{b} a¯ ET b\overline{a} \text{ ET } b S
0 0 1 1 0 0 0
0 1 1 0 0 1 1
1 0 0 1 1 0 1
1 1 0 0 0 0 0

La colonne S est celle du XOR : nous venons de reconstruire un OU exclusif avec des NON, des ET et un OU.

Important

Deux expressions sont équivalentes si elles ont la même table de vérité. C’est le seul critère, peu importe leur écriture ou leur nombre de portes.

Quelques équivalences utiles (pour info)

Elles permettent de simplifier une expression, donc de fabriquer le circuit avec moins de portes :

Règle Écriture
élément neutre a ET 1 = a ; a OU 0 = a
élément absorbant a ET 0 = 0 ; a OU 1 = 1
idempotence a ET a = a ; a OU a = a
complément a ET (NON a) = 0 ; a OU (NON a) = 1
double négation NON (NON a) = a
lois de De Morgan NON (a ET b) = (NON a) OU (NON b)
NON (a OU b) = (NON a) ET (NON b)

Application : le demi-additionneur

Le problème

Comment faire faire une addition binaire à un circuit ? Commençons par le plus simple : additionner deux bits E1 et E2. Reprenons la table d’addition binaire vue au chapitre B.1 :

Le dernier cas est la clé : le résultat ne tient pas sur un bit. Il faut donc deux sorties :

La table de vérité

E1 E2 Résultat de l’addition Retenue R Somme S
0 0 00 0 0
0 1 01 0 1
1 0 01 0 1
1 1 10 1 0

Regardons chaque colonne de sortie séparément :

Important

R=E1 ET E2S=E1 XOR E2R = E_1 \text{ ET } E_2 \qquad S = E_1 \text{ XOR } E_2

Deux portes suffisent donc à additionner deux bits. Ce circuit s’appelle le demi-additionneur (half adder).

Le schéma

Demi-additionneur

E1 et E2 alimentent chacune les deux portes : les fils se divisent.

Exercice

Construisez ce circuit dans le simulateur, et vérifiez les 4 lignes de sa table de vérité en basculant les entrées.

Pourquoi « demi » ?

Parce qu’il ne fait que la moitié du travail : quand on additionne deux nombres de plusieurs bits, chaque colonne doit additionner trois bits, les deux bits du rang plus la retenue de la colonne précédente.

 1 1 1 1      <- retenues
   1 0 1 1
 + 0 1 1 1
 ---------
 1 0 0 1 0

Le circuit qui additionne trois bits (deux bits + une retenue entrante) s’appelle l’additionneur complet (full adder), et se fabrique… avec deux demi-additionneurs et une porte OU. Bout à bout, 8, 32 ou 64 additionneurs complets forment l’unité de calcul d’un processeur.

À retenir

L’addition a été entièrement ramenée à de la logique booléenne. C’est le principe fondamental de l’ordinateur : tout ce qu’il calcule est fait avec des portes logiques.