Passer au contenu principal
Logiciel, Matériel

Portes logiques : comprendre AND, OR, XOR, NAND et les circuits numériques

Les portes logiques constituent les briques fondamentales des circuits numériques. Elles prennent une ou plusieurs valeurs logiques en entrée, appliquent une opération booléenne et produisent une sortie.

À partir de mécanismes aussi simples que ET, OU et NON, on peut construire des additionneurs, comparateurs, multiplexeurs, registres, mémoires, unités arithmétiques et finalement des processeurs entiers.

Une porte logique ne « comprend » rien. Elle applique seulement une relation électrique extrêmement précise. Quelques milliards de transistors organisés correctement suffisent ensuite à donner l’impression qu’un ordinateur réfléchit.

Du transistor au 0 et au 1

Une porte logique électronique est généralement construite à partir de transistors. Dans les circuits numériques modernes, la technologie CMOS utilise principalement des transistors MOSFET complémentaires pour réaliser ces fonctions.

Il faut toutefois éviter la simplification :

courant = 1, pas de courant = 0

Les circuits numériques travaillent plutôt avec des niveaux de tension. Une certaine plage est interprétée comme un niveau logique bas, une autre comme un niveau haut. Les valeurs exactes dépendent de la technologie et de la tension d’alimentation.

Entre ces plages peut exister une zone où le niveau n’est pas garanti. Les circuits sont donc conçus avec des marges de bruit afin qu’une petite perturbation électrique ne suffise pas à changer l’interprétation logique.

Autrement dit, le binaire est conceptuellement :

Valeur logique Interprétation
0 Niveau logique bas
1 Niveau logique haut

La physique réelle située derrière ces deux symboles est beaucoup moins binaire qu’eux.

Les principales portes logiques

Pour deux entrées A et B, les portes classiques peuvent être résumées dans une seule table de vérité.

A B AND OR XOR NAND NOR XNOR
0 0 0 0 0 1 1 1
0 1 0 1 1 1 0 0
1 0 0 1 1 1 0 0
1 1 1 1 0 0 0 1

AND — ET

La sortie vaut 1 uniquement lorsque toutes les entrées valent 1.

Expression booléenne :

Y = A AND B

On peut l’interpréter comme :

« Autoriser la sortie seulement si la condition A et la condition B sont vraies. »

OR — OU inclusif

La sortie vaut 1 si au moins une entrée vaut 1. Lorsque A et B valent toutes les deux 1, la sortie reste donc à 1.

C’est pour cette raison qu’il s’agit d’un OU inclusif.

NOT — NON

NOT possède une seule entrée et inverse sa valeur.

A NOT A
0 1
1 0

XOR — OU exclusif

XOR vaut 1 lorsque les deux entrées sont différentes. Pour deux entrées, on peut aussi le voir comme un test d’inégalité :

A XOR B = 1 si A ≠ B

Cette opération est particulièrement importante dans les additionneurs, la parité, les CRC et de nombreuses constructions cryptographiques.

NAND, NOR et XNOR

NAND correspond à NOT AND : seule la combinaison 1,1 produit zéro. NOR correspond à NOT OR : seule la combinaison 0,0 produit un. XNOR inverse XOR et produit donc 1 lorsque les entrées sont égales.

NAND et NOR possèdent une propriété remarquable : chacune est fonctionnellement complète. En combinant uniquement des NAND, ou uniquement des NOR, il est théoriquement possible de reconstruire toutes les autres fonctions booléennes.

De quelques portes à une unité arithmétique

Les portes deviennent réellement intéressantes lorsqu’on les assemble. Prenons l’addition binaire de deux bits.

Un demi-additionneur utilise typiquement :

  • XOR pour calculer le bit de somme ;
  • AND pour calculer la retenue.
A B Somme Retenue
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1

On retrouve exactement :

Somme = A XOR B

Retenue = A AND B

Un additionneur complet ajoute une troisième entrée correspondant à la retenue provenant du bit précédent. Plusieurs additionneurs peuvent ensuite être chaînés pour additionner des nombres sur 8, 16, 32, 64 bits ou davantage.

Les processeurs construisent ainsi des circuits beaucoup plus élaborés permettant :

  • additions et soustractions ;
  • opérations AND, OR, XOR et NOT ;
  • décalages et rotations de bits ;
  • comparaisons ;
  • sélection entre plusieurs données ;
  • calcul d’adresses ;
  • contrôle du flot d’exécution.

Une ALU, ou unité arithmétique et logique, rassemble justement plusieurs de ces fonctions.

Logique combinatoire et logique séquentielle

Les portes précédentes appartiennent à la logique combinatoire : la sortie dépend essentiellement des entrées présentes à cet instant.

Un additionneur ou un multiplexeur en est un bon exemple.

Mais un ordinateur doit aussi se souvenir de ce qui s’est passé auparavant. C’est le domaine de la logique séquentielle.

Type Dépend de Exemples
Combinatoire Entrées actuelles Additionneur, comparateur, multiplexeur, décodeur
Séquentielle Entrées actuelles + état précédent Bascules, registres, compteurs, machines à états

Les bascules et autres éléments de mémorisation permettent de conserver un bit d’état. En les combinant, on peut créer des registres, compteurs et machines à états.

Un registre de 64 bits peut ainsi mémoriser une valeur sur 64 positions binaires, tandis qu’un compteur peut changer d’état à chaque événement d’horloge.

L’horloge

De nombreux circuits séquentiels utilisent un signal d’horloge pour synchroniser leurs changements d’état.

Un processeur annoncé à 4 GHz reçoit ainsi des milliards de cycles d’horloge par seconde. Cela ne signifie toutefois pas qu’il exécute exactement une instruction par cycle : pipelines, exécution superscalaire, caches, prédiction de branchement et autres raffinements rendent cette relation beaucoup plus complexe.

Le processeur moderne n’est donc pas seulement un gigantesque empilement de portes. C’est un gigantesque empilement de portes auquel plusieurs décennies d’ingénierie ont ajouté suffisamment de complexité pour décourager quiconque ouvre le manuel d’architecture après minuit.

Portes logiques et programmation : même algèbre, niveau différent

En programmation, on retrouve directement les concepts booléens.

Par exemple en JavaScript :

if (user.isAdmin && user.isLoggedIn) {
    grantAccess();
}

La condition exprime bien :

isAdmin AND isLoggedIn

Mais cela ne signifie pas qu’une unique porte AND physique est directement réservée à cette ligne de programme.

Le compilateur ou l’interpréteur transforme le code en opérations exécutables par la machine. Le résultat peut faire intervenir des comparaisons, des sauts conditionnels, des registres et plusieurs instructions.

Logique et opérations bit à bit

Il faut aussi distinguer les opérateurs logiques des opérateurs bit à bit.

Concept Exemple courant Fonction
AND logique &&, and Combine des conditions booléennes
OR logique ||, or Vrai si une condition est vraie
NOT logique !, not Inverse une condition
AND bit à bit & Applique AND bit par bit
OR bit à bit | Applique OR bit par bit
XOR bit à bit ^ Applique XOR bit par bit dans de nombreux langages
NOT bit à bit ~ Inverse les bits dans de nombreux langages

Les opérateurs && et || possèdent en outre souvent une propriété appelée évaluation en court-circuit. Si la première partie suffit à déterminer le résultat, la seconde peut ne jamais être évaluée.

Par exemple, dans :

A && B

si A est faux, le programme sait déjà que l’ensemble sera faux. Il peut donc ne pas calculer B.

Trois applications concrètes : réseau, RAID et cryptographie

Adresse IPv4 et masque : AND bit à bit

Pour déterminer l’adresse réseau IPv4, on applique un AND entre l’adresse IP et le masque.

Pour :

192.168.1.45/24

Premier octet Deuxième Troisième Quatrième
IP 11000000 10101000 00000001 00101101
Masque 11111111 11111111 11111111 00000000
AND 11000000 10101000 00000001 00000000

Le résultat est :

192.168.1.0

C’est l’adresse du réseau correspondant au préfixe /24.

L’opération AND ne décide évidemment pas à elle seule si l’imprimante du voisin est joignable : routage, VLAN, firewall et configuration réseau ont encore leur mot à dire. La logique booléenne n’avait pas demandé autant de responsabilités.

RAID 5 et XOR

Dans un RAID 5, la parité d’une stripe peut être calculée par XOR entre les blocs de données.

Exemple simplifié :

Bloc Valeur
A 10110110
B 11001011
A XOR B 01111101

Si B disparaît :

A XOR Parité = B

car XOR possède notamment les propriétés :

X XOR X = 0

X XOR 0 = X

Le RAID 5 réel travaille naturellement sur des blocs beaucoup plus importants, distribue sa parité entre les disques et doit gérer écritures, reconstructions, contrôleurs et erreurs. Mais le principe XOR est bien au cœur du calcul de parité.

Et comme toujours : RAID n’est pas une sauvegarde. XOR peut reconstruire un disque manquant ; il ne ressuscite pas le fichier que l’administrateur a supprimé avec conviction.

XOR et chiffrement

XOR possède une propriété pratique :

(Message XOR Clé) XOR Clé = Message

Par exemple :

Valeur
Message 10101100
Clé 11011010
Chiffré 01110110
Déchiffrement 01110110 XOR 11011010 = 10101100

Mathématiquement, cela fonctionne parfaitement.

Cryptographiquement, en revanche, cette démonstration ne suffit pas à construire un système sûr.

Le one-time pad est sûr en théorie lorsque la clé est :

  • véritablement aléatoire ;
  • aussi longue que le message ;
  • secrète ;
  • utilisée une seule fois.

Réutiliser la même clé XOR permet notamment de faire disparaître cette clé en XORant deux textes chiffrés :

(M1 XOR K) XOR (M2 XOR K) = M1 XOR M2

La clé s’annule. Ce qui est mathématiquement élégant et opérationnellement regrettable.

Les algorithmes modernes comme AES-GCM ou ChaCha20-Poly1305 utilisent eux aussi des opérations binaires, dont XOR, mais dans des constructions cryptographiques infiniment plus élaborées.

De Morgan, NAND et la construction des circuits

L’algèbre de Boole permet de transformer les expressions logiques sans changer leur résultat. Les lois de De Morgan sont particulièrement célèbres :

NOT (A AND B) = (NOT A) OR (NOT B)

NOT (A OR B) = (NOT A) AND (NOT B)

Elles expliquent en partie pourquoi différentes combinaisons de portes peuvent réaliser la même fonction.

NAND et NOR sont particulièrement intéressantes parce qu’elles sont universelles. Par exemple, une porte NOT peut être construite à partir d’une NAND en reliant ses deux entrées :

NOT A = A NAND A

À partir de cette inversion et d’autres associations, on peut recréer AND, OR, XOR et les autres opérations.

Cette possibilité est importante historiquement et pratiquement : lorsqu’un procédé de fabrication permet de réaliser efficacement un certain type de porte, l’ingénieur peut construire des fonctions beaucoup plus complexes à partir d’un petit nombre de primitives.

La réalité physique : propagation, consommation et fréquence

Dans les diagrammes booléens, une sortie semble changer instantanément dès que ses entrées changent. Dans un véritable circuit, ce n’est jamais tout à fait le cas.

Une porte possède un délai de propagation. Les transistors doivent changer d’état, les capacités électriques internes doivent être chargées ou déchargées et le signal doit parcourir les interconnexions.

Quelques nanosecondes ou picosecondes paraissent insignifiantes, mais lorsque des milliards de transistors doivent coopérer à plusieurs gigahertz, ces délais deviennent fondamentaux.

Les concepteurs doivent notamment gérer :

  • le chemin critique ;
  • les délais de propagation ;
  • la distribution de l’horloge ;
  • la consommation dynamique ;
  • les courants de fuite ;
  • la dissipation thermique ;
  • la stabilité des niveaux logiques.

Dans une approximation CMOS classique, la consommation dynamique augmente notamment avec la fréquence de commutation et avec le carré de la tension d’alimentation. C’est l’une des raisons pour lesquelles augmenter fréquence et tension d’un processeur fait rapidement monter sa consommation et sa température.

Les points essentiels à retenir

Concept À retenir
AND 1 uniquement si toutes les entrées sont à 1
OR 1 si au moins une entrée est à 1
NOT Inverse la valeur logique
XOR 1 lorsque deux entrées sont différentes
XNOR 1 lorsque deux entrées sont identiques
NAND / NOR Portes universelles capables de construire toute fonction booléenne
Logique combinatoire La sortie dépend des entrées actuelles
Logique séquentielle La sortie dépend aussi d’un état mémorisé
ALU Combine des circuits arithmétiques et logiques
Programmation Les opérateurs booléens expriment la même logique, mais ne correspondent pas forcément directement à une porte physique
IPv4 AND permet notamment de calculer l’adresse réseau à partir de l’adresse et du masque
RAID 5 XOR participe au calcul et à la reconstruction de la parité
Cryptographie XOR est une primitive utile, mais XOR avec une clé arbitraire n’est pas un chiffrement moderne sûr

Conclusion : quelques règles simples, des machines extraordinairement complexes

Une porte logique ne sait faire presque rien. AND compare quelques niveaux logiques. NOT en inverse un. XOR détermine si deux valeurs diffèrent.

Mais assemblées par millions puis milliards, ces opérations permettent de construire :

  • additionneurs ;
  • multiplexeurs ;
  • registres ;
  • caches ;
  • contrôleurs ;
  • unités vectorielles ;
  • processeurs complets.

Le chemin peut être résumé ainsi :

transistors → portes → circuits combinatoires et séquentiels → blocs fonctionnels → processeur → logiciel

À une extrémité, quelques électrons se déplacent dans des transistors. À l’autre, un utilisateur regarde une vidéo 4K pendant que son navigateur exécute du JavaScript, que TLS chiffre la connexion et que le système d’exploitation tente discrètement de mettre à jour une imprimante dont personne ne se souvient avoir installé le pilote.

Tout cela repose finalement sur une idée étonnamment simple :

prendre des 0 et des 1, puis décider très rapidement ce qu’ils doivent devenir.