← Retour au blogUnité arithmétique et logique (UAL)

Fonctionnement d'une ALU : construire une unité arithmétique et logique avec des portes

Construisez une petite ALU avec un additionneur, une logique bit à bit, un décaleur et un multiplexeur de résultat, puis déduisez ses sorties de retenue, zéro, signe et dépassement.

DennyDenny
9 min de lecture
Chalkboard feature illustration for “Fonctionnement d'une ALU : construire une unité arithmétique et logique avec des portes”

En bref : une petite ALU est un chemin de données combinatoire. Des fonctions arithmétiques, logiques et de décalage candidates opèrent sur les mêmes mots d’entrée, puis un multiplexeur choisit le résultat visible. La conception reste incomplète tant que le codage des opérations, la sémantique retenue/emprunt, le comportement en cas de dépassement et la politique d’écriture des indicateurs ne sont pas explicitement définis.

L’unité arithmétique et logique est l’endroit où un processeur transforme les données. ADD et SUB exigent un additionneur ; AND, OR et XOR utilisent des voies de portes parallèles ; les décalages demandent du routage ou un réseau de décalage ; enfin, un multiplexeur de résultat choisit la valeur candidate envoyée vers la destination.

Ce schéma-bloc est assez simple pour être construit sur quatre ou huit bits, mais suffisamment riche pour révéler plusieurs véritables décisions d’ingénierie :

  • Une soustraction signale-t-elle l’emprunt ou l’absence d’emprunt ?
  • Un décalage à droite introduit-il un zéro ou recopie-t-il le bit de signe ?
  • Quelles opérations définissent la sortie de dépassement ?
  • L’ALU mémorise-t-elle elle-même les indicateurs, ou un registre séparé les capture-t-il ?
  • Les fonctions sont-elles calculées en parallèle puis sélectionnées, ou la logique est-elle partagée pour réduire la surface ?

Ce guide développe une architecture pédagogique cohérente d’ALU 4 bits et signale les points où une autre architecture pourrait faire des choix différents.

Commencer par le contrat d’interface

Considérons les vecteurs de bits comme non signés, sauf lorsqu’une opération demande explicitement une interprétation signée :

PortLargeurDirectionSignification
A4entréepremier opérande
B4entréesecond opérande
OP3entréesélection de l’opération
Y4sortierésultat sélectionné
C1sortieretenue pour ADD ; emprunt pour SUB
Z1sortie1 lorsque Y == 0000
N1sortieY[3]
V1sortiedépassement signé pour ADD ou SUB

Voici un codage possible des opérations :

OPFonctionDéfinition
000ADDA+BA+B
001SUBA−BA-B
010ANDA∧BA\land B bit par bit
011ORA∨BA\lor B bit par bit
100XORA⊕BA\oplus B bit par bit
101NOT AA‾\overline A
110décalage logique à gaucheun zéro entre au bit 0
111décalage logique à droiteun zéro entre au bit 3

Il s’agit d’une spécification pédagogique, pas d’un codage normalisé. Les jeux d’instructions réels peuvent confier les décalages, la multiplication, la génération d’adresses ou les comparaisons à d’autres unités d’exécution. Ils peuvent également disposer de plusieurs ALU aux capacités différentes.

L’ALU décrite ici ne contient aucun état interne. Ses sorties se stabilisent après la modification des entrées et la propagation dans le réseau combinatoire. Les registres d’opérandes, de destination et le registre d’indicateurs sont des éléments séquentiels distincts.

Bloc 1 : un additionneur pour l’addition et la soustraction

Un additionneur à propagation de retenue relie quatre étages d’additionneur complet. Pour le bit ii :

Si=Ai⊕Bi′⊕ciS_i=A_i\oplus B'_i\oplus c_i ci+1=AiBi′+Aici+Bi′cic_{i+1}=A_iB'_i+A_ic_i+B'_ic_i

Un bit de commande SUB transforme B et la retenue initiale :

Bi′=Bi⊕SUBB'_i=B_i\oplus SUB c0=SUBc_0=SUB

Quand SUB=0, le réseau calcule A+BA+B. Quand SUB=1, il calcule :

A+B‾+1=A−B(mod24)A+\overline B+1=A-B\pmod {2^4}

La retenue finale de l’additionneur s’interprète différemment selon l’opération :

  • après ADD, c4=1c_4=1 signifie que la somme non signée a dépassé 15 ;
  • après SUB, c4=1c_4=1 signifie qu’aucun emprunt non signé n’a été nécessaire.

L’ALU de DigiSim expose directement la retenue sortante sous la forme C après ADD, mais son complément après SUB :

CSUB=c4‾C_{\text{SUB}}=\overline{c_4}

Ainsi, C=1 après une soustraction signifie qu’un emprunt non signé s’est produit (A<BA<B). Les bits du résultat proviennent toujours de la même somme modulo 242^4 ; seule la polarité de l’indicateur change.

Le dépassement n’est pas la retenue

Le dépassement signé concerne la plage du complément à deux allant de −8-8 à +7+7, alors que la retenue concerne la plage non signée de 0 à 15.

Pour l’addition :

Vadd=A3⊕B3‾∧(A3⊕Y3)V_{\text{add}} = \overline{A_3\oplus B_3}\land(A_3\oplus Y_3)

Pour la soustraction :

Vsub=(A3⊕B3)∧(A3⊕Y3)V_{\text{sub}} = (A_3\oplus B_3)\land(A_3\oplus Y_3)

De manière équivalente, pour cet additionneur-soustracteur, V=c3⊕c4V=c_3\oplus c_4. En gardant C et V séparés, les quatre mêmes bits de résultat prennent correctement en charge les interprétations signée et non signée.

Bloc 2 : logique bit à bit parallèle

Chaque voie de bit calcule indépendamment ses fonctions logiques :

ANDi=AiBiAND_i=A_iB_i ORi=Ai+BiOR_i=A_i+B_i XORi=Ai⊕BiXOR_i=A_i\oplus B_i NOTi=Ai‾NOT_i=\overline{A_i}

Dans une implémentation conceptuelle, les quatre bus candidats existent en parallèle. Un outil de synthèse peut partager des termes, mapper les fonctions dans des tables de correspondance ou choisir des cellules standard composées. « Une porte par bit » décrit la structure booléenne, et non un nombre garanti de transistors ou un délai physique.

Les fonctions bit à bit évitent une dépendance de retenue sur tout le mot, mais leur résultat sélectionné traverse néanmoins des portes, du routage et le multiplexeur de sortie. Elles ne sont pas instantanées.

Bloc 3 : décalages

Un décalage logique fixe d’une position peut être exprimé par le câblage :

SHL(A):  Y3=A2, Y2=A1, Y1=A0, Y0=0
SHR(A):  Y3=0,  Y2=A3, Y1=A2, Y0=A1

Le bit éjecté peut être conservé comme candidat pour la retenue si le jeu d’instructions le prévoit :

SHL carry candidate = A3
SHR carry candidate = A0

Un décalage arithmétique à droite ne diffère qu’au sommet : il recopie A3 dans Y3 afin de prolonger le signe. Un décalage d’une distance variable exige un réseau de routage sélectionnable, tel qu’un barrel shifter ; un décalage fixe d’une position n’en a pas besoin.

Bloc 4 : le multiplexeur de résultat

Le multiplexeur de sortie donne son sens à OP. Conceptuellement :

case OP
  000: Y = arithmetic_sum
  001: Y = arithmetic_difference
  010: Y = bitwise_and
  011: Y = bitwise_or
  100: Y = bitwise_xor
  101: Y = bitwise_not_a
  110: Y = shift_left
  111: Y = shift_right

Sur quatre bits, on peut le représenter par un multiplexeur 8 vers 1 pour chaque bit de résultat. Dans une logique programmable, il peut être mappé sur des tables de correspondance et des ressources de routage. Dans un ASIC, il peut devenir des cellules mux, des structures AOI/OAI ou un autre réseau factorisé choisi par la synthèse.

La sélection du résultat appartient au chemin temporel critique :

tALU,max≈max⁡(tcandidate functions)+tresult select+troutingt_{\text{ALU,max}} \approx \max(t_{\text{candidate functions}}) +t_{\text{result select}} +t_{\text{routing}}

Cette expression constitue une estimation de conception et non une équation de validation finale. Le timing physique dépend des cellules, du fan-out, du câblage, de la tension, de la température et de l’implémentation.

Indicateurs du résultat

La valeur Y sélectionnée produit deux candidats indépendants de l’opération :

Z=Y3∨Y2∨Y1∨Y0‾Z=\overline{Y_3\lor Y_2\lor Y_1\lor Y_0} N=Y3N=Y_3

C et V dépendent de l’opération. Voici une politique cohérente pour cette ALU pédagogique :

OpérationCV
ADDretenue finaledépassement de l’addition
SUBemprunt (A<BA<B), complément de la retenue finaledépassement de la soustraction
SHLbit éjecté du MSB0
SHRbit éjecté du LSB0
AND/OR/XOR/NOT00

Une autre architecture pourrait conserver C et V pour les opérations logiques au lieu de les effacer. C’est un choix de jeu d’instructions et de politique de commande. L’ALU combinatoire peut présenter des signaux candidats, tandis qu’un registre d’indicateurs cadencé décide de charger, de conserver ou de mettre à jour sélectivement les bits mémorisés.

L’indicateur de signe N correspond au MSB du résultat. Pris seul, il ne fournit pas un test « inférieur à » signé correct après une soustraction : utilisez N⊕VN\oplus V pour compenser le dépassement signé.

Exemples calculés sur 4 bits

6 - 3

A        = 0110
B        = 0011
~B       = 1100
A + ~B+1 = 1 0011

Le résultat mémorisé est 0011 (3). La retenue sortante directe vaut 1 : aucun emprunt ne s’est donc produit et la sortie C de DigiSim, qui code l’emprunt, vaut 0 :

Y=0011, Z=0, C=0, N=0, V=0

3 - 6

A        = 0011
B        = 0110
A + ~B+1 = 0 1101

1101 vaut 13 en non signé ou -3 en signé. La retenue sortante directe vaut 0 : un emprunt non signé s’est donc produit et C vaut 1 :

Y=1101, Z=0, C=1, N=1, V=0

7 + 1

0111 + 0001 = 1000

Il n’y a pas de retenue non signée, mais +8 ne tient pas dans un complément à deux signé sur 4 bits :

Y=1000, Z=0, C=0, N=1, V=1

15 + 1

1111 + 0001 = 1 0000

Le résultat non signé reboucle et génère une retenue. En arithmétique signée, -1 + 1 = 0 est une opération valide :

Y=0000, Z=1, C=1, N=0, V=0

Ces deux derniers vecteurs prouvent que C et V ne sont pas des alias.

Place de l’ALU dans un processeur

Un petit chemin de données monocycle pourrait suivre cette séquence :

  1. les registres sources présentent A et B ;
  2. l’unité de commande sélectionne OP ;
  3. l’ALU et la logique de génération des indicateurs se stabilisent ;
  4. un registre de destination capture Y sur le front d’horloge actif ;
  5. s’il est activé, le registre d’indicateurs capture les bits d’état sélectionnés.

La fréquence d’horloge maximale dépend du plus long chemin complet de registre à registre, et non de l’ALU seule. Ce chemin peut inclure le délai clock-to-Q du registre, la sélection des opérandes, la logique de l’ALU, le routage du résultat, le temps de setup de la destination, l’incertitude d’horloge et le skew. L’ALU peut être critique, mais dans une autre microarchitecture, l’accès au cache, les réseaux de bypass, le décodage ou une autre logique peuvent dominer.

Optimiser un additionneur n’améliore donc pas automatiquement la fréquence du système dans les mêmes proportions. Cela n’aide que si ce chemin reste limitant après placement et routage, et si la marge récupérée n’est pas consommée ailleurs. Consultez les guides sur le délai de propagation et le skew d’horloge pour replacer ce point dans son contexte temporel complet.

Le 74181 comme référence historique

La famille 74181 sur 4 bits est un exemple utile, car son interface expose la sélection de fonction, la sélection de mode, l’entrée et la sortie de retenue ainsi que les signaux de retenue de groupe. Elle prend en charge un catalogue de fonctions arithmétiques et logiques et peut être assemblée pour former des mots plus larges avec une logique de retenue anticipée.

Il ne faut pas la considérer comme un plan au niveau transistor d’un processeur moderne. Les processeurs actuels peuvent employer plusieurs unités d’exécution entières spécialisées, des chemins de données vectoriels et flottants distincts, une logique de comparaison de branchement distribuée et des structures d’addition propres à leur implémentation. Le motif architectural demeure : transformer des mots opérandes, sélectionner un résultat et produire des informations d’état définies avec précision.

Construire et vérifier la version 4 bits

Utilisez le modèle d’ALU 8 bits de DigiSim comme référence plus large, ou construisez directement l’interface sur quatre bits :

  1. Construisez un additionneur-soustracteur à quatre étages avec B XOR SUB et c0=SUB.
  2. Ajoutez des voies parallèles AND, OR, XOR et NOT.
  3. Câblez les décalages logiques et conservez les bits éjectés si C les utilise.
  4. Sélectionnez le résultat avec un multiplexeur à huit voies sur quatre bits.
  5. Générez Z à partir du résultat sélectionné, et N à partir de son MSB.
  6. Sélectionnez C et V conformément à la table des opérations.
  7. Sondez A, B, OP, Y, C, Z, N et V.

Vérifiez chaque opcode avec des valeurs ordinaires, puis ciblez les cas limites :

  • résultat nul ;
  • mot tout à un plus un ;
  • plus grand positif signé plus un ;
  • plus petit négatif signé moins un ;
  • soustraction avec et sans emprunt ;
  • décalages à gauche et à droite lorsque le bit sortant vaut un ;
  • comportement des indicateurs lors du passage d’une classe d’opérations à une autre.

Un simulateur fonctionnel peut établir la table de vérité et la séquence des commandes. Il ne démontre ni la fréquence maximale d’une puce physique, ni son comportement analogique en métastabilité, ni son timing à travers les variations de fabrication et d’environnement.

Lorsque le chemin de données fonctionne, reliez-le à un registre d’indicateurs de processeur cadencé et à un décodeur de branchement. C’est à ce moment qu’un calcul combinatoire devient un état architectural persistant capable de rediriger le compteur ordinal.

Références

Transformez l’idée en un circuit fonctionnel.