L’additionneur calcule. La plupart des autres circuits d’un CPU aiguillent : ils choisissent une valeur parmi plusieurs, transforment un nombre en signal « sélectionner celui-ci », ou vérifient si deux valeurs sont égales. Ce sont tous des circuits combinatoires — leurs sorties ne dépendent que de leurs entrées actuelles, sans mémoire. La mémoire arrive au chapitre suivant.
Le multiplexeur : choisir une entrée
Un multiplexeur (mux) a plusieurs entrées de données, une sortie, et des lignes de sélection qui indiquent quelle entrée passe. Le plus petit a deux entrées de données et une ligne de sélection :
| D0 | D1 | S | Y |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 |
| 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 |
Y = S ? D1 : D0. The select line opens exactly one AND gate; the OR merges the two paths. This is the hardware form of an if/else. Try D0 = D1 = 1 and flip S from 1 to 0: the inverter adds one delay, so for an instant neither AND is open and Y glitches to 0.
Unit-delay model: every gate takes one step to react. With auto off, toggle switches and press step to watch the change travel gate by gate.
Y = S ? D1 : D0. La ligne de sélection ouvre exactement l’une des deux portes AND, et le OR fusionne les deux chemins. C’est la forme matérielle du if/else, ou de l’opérateur ?: du C. Le cmov du x86 est essentiellement un multiplexeur dont la ligne de sélection vient des drapeaux.
Il montre aussi un vrai piège matériel. Mettez D0 = D1 = 1 : Y devrait rester à 1 quelle que soit la valeur de S. Désactivez maintenant auto, faites passer S de 1 à 0 et avancez pas à pas. L’inverseur sur la ligne de sélection ajoute un délai de porte : pendant un instant, aucune porte AND n’est ouverte et Y glitche à 0 avant de revenir à 1. Ces parasites sont sans danger dans une conception cadencée, où les valeurs ne sont capturées qu’une fois stabilisées, mais c’est pour cela que le timing de chaque chemin compte.
Les multiplexeurs plus larges suivent le même principe : 2ⁿ entrées de données demandent n lignes de sélection. Un mux 4 vers 1 peut se construire avec trois mux 2 vers 1 en arbre, ou avec quatre portes AND, chacune ouverte par une combinaison des lignes de sélection, reliées à un OR.
Les multiplexeurs sont partout dans un CPU :
- le mux de sortie de l’ALU choisit le résultat de l’opération demandée ;
- le chemin de données utilise des mux pour choisir quel registre alimente chaque entrée de l’ALU, et où vont les résultats ;
- le forwarding d’un pipeline est un mux devant chaque entrée de l’ALU, qui choisit entre le banc de registres et un résultat plus récent.
Un multiplexeur peut tout calculer
Reliez les entrées de données d’un mux 8 vers 1 à des 0 et des 1 fixes, et utilisez les lignes de sélection comme trois variables : le mux sort ce que vous avez câblé sur l’entrée dont le numéro est formé par ces trois bits. Câblez l’entrée i à la ligne i d’une table de vérité, et le mux est cette fonction. Pour la fonction majorité du chapitre sur les portes, D0…D7 = 0, 0, 0, 1, 0, 1, 1, 1.
C’est exactement ainsi que fonctionnent les FPGA. Leur élément de base est une table de correspondance (LUT, lookup table) : une petite mémoire qui contient une table de vérité, lue à travers un multiplexeur piloté par les entrées. En chargeant des tables différentes, la même puce devient n’importe quel circuit.
Le circuit inverse, le démultiplexeur, envoie une entrée vers l’une de plusieurs sorties, choisie par les lignes de sélection.
Le décodeur : transformer un nombre en sélection
Un décodeur reçoit un nombre de n bits et met exactement une de ses 2ⁿ sorties à 1 : la sortie k pour l’entrée k.
| A1 | A0 | Y0 | Y1 | Y2 | Y3 |
|---|---|---|---|---|---|
| 0 | 0 | 1 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 0 | 0 |
| 1 | 0 | 0 | 0 | 1 | 0 |
| 1 | 1 | 0 | 0 | 0 | 1 |
Exactly one output is 1: output number A. The true and inverted input rails feed one AND per combination. Address decoders like this select one memory row or one register out of many.
Unit-delay model: every gate takes one step to react. With auto off, toggle switches and press step to watch the change travel gate by gate.
Chaque sortie est une porte AND activée par une combinaison des entrées (et de leurs inverses). Les décodeurs sont la façon dont un CPU sélectionne des choses par leur numéro :
- la mémoire : les bits de poids fort d’une adresse choisissent quelle puce ou quel banc répond, et les décodeurs de la puce choisissent la ligne ;
- les registres : le numéro de registre de 4 bits d’une instruction sélectionne l’un des 16 registres. Le chapitre sur le chemin de données a montré qu’encoder la source d’un bus en un petit nombre, puis le décoder, garantit qu’un seul registre alimente le bus ;
- le décodage des instructions : l’opcode est transformé en lignes de contrôle de l’opération à effectuer.
Le circuit opposé, l’encodeur, sort le numéro de l’entrée qui vaut 1. Un encodeur de priorité sort le numéro de l’entrée la plus haute à 1 quand plusieurs le sont. C’est ainsi qu’un CPU choisit l’interruption la plus urgente, et c’est le circuit derrière des instructions comme bsr et lzcnt.
Le comparateur
Vérifier l’égalité de deux nombres demande un XOR par paire de bits (1 là où ils diffèrent) et un NOR final (1 seulement si aucun bit ne diffère) :
Each XOR outputs 1 where the two bits differ; the NOR outputs 1 only if no bit differs. Wider comparators just add XORs. Checking A − B for zero with the ALU (what cmp does) gives the same answer through ZF.
Unit-delay model: every gate takes one step to react. With auto off, toggle switches and press step to watch the change travel gate by gate.
Donnez la même valeur à A et à B et A = B s’allume. Changez un seul bit et il s’éteint. Le cmp d’un CPU arrive à la même réponse par un autre chemin : il soustrait dans l’ALU et teste si le résultat est nul, ce qui donne ZF, et il obtient en même temps inférieur et supérieur grâce aux autres drapeaux.
Les bus : partager des fils
Un bus est un ensemble de fils partagés par plusieurs sources. La règle est qu’une seule source peut le piloter à la fois : deux sorties qui imposent des valeurs différentes sur le même fil créent un court-circuit. Il y a deux façons de faire respecter cette règle :
- Un multiplexeur : chaque source entre dans un mux, et les lignes de sélection choisissent laquelle atteint le bus. À l’intérieur des puces modernes, les bus sont construits ainsi.
- Des tampons trois états : chaque source se connecte à travers un tampon qui sort 0, 1, ou un troisième état, la haute impédance, qui la déconnecte électriquement. Un décodeur active exactement un tampon à la fois. C’est ainsi qu’on construisait traditionnellement les bus externes à nombreux périphériques, et c’est ainsi que les broches de données d’une puce mémoire relâchent le bus quand la puce n’est pas sélectionnée.
Dans les deux cas, un décodeur et quelques lignes de sélection décident qui parle, et le bus système du niveau de la microarchitecture n’est que cette idée à plus grande échelle.
À retenir
- Les circuits combinatoires ont des sorties qui ne dépendent que de leurs entrées actuelles.
- Un multiplexeur choisit une entrée parmi 2ⁿ avec n lignes de sélection. C’est le
?:matériel, et câblé sur une table de vérité, il calcule n’importe quelle fonction — le principe des LUT des FPGA. - Un décodeur transforme un nombre de n bits en une ligne active parmi 2ⁿ. Il sélectionne puces mémoire, registres et opérations.
- Un comparateur teste l’égalité avec des XOR et un NOR. Le CPU obtient en général la même réponse grâce au ZF de l’ALU.
- Un bus est un câblage partagé, piloté par une seule source à la fois, choisie par un multiplexeur ou par des tampons trois états activés par un décodeur.