Skip to content

Niveau 7 · Chapitre 7.3

Multiplexeurs, décodeurs et bus

Les circuits qui aiguillent les bits : multiplexeurs qui choisissent, décodeurs qui sélectionnent, comparateurs, encodeurs — comment un multiplexeur peut calculer n’importe quelle fonction, comment les décodeurs choisissent une puce mémoire ou un registre, et comment les bus partagent leurs fils — sur des circuits en direct.

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 :

Logic · Multiplexeur 2 vers 1
auto
0
gate delays
stable after 0
stable
state
3
critical path
gate delays, worst case
4
gates
D0D1SNOT gate: output 1AND gate: output 0AND gate: output 0OR gate: output 00Y
1 0 inputs changed, output switches next delayclick a switch to toggle it
D0D1SY
0000
0010
0100
0111
1001
1010
1101
1111

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.

Logic · Décodeur 2 vers 4
auto
0
gate delays
stable after 0
stable
state
2
critical path
gate delays, worst case
6
gates
A = 002 = 0
A1A0NOT gate: output 1NOT gate: output 1AND gate: output 1AND gate: output 0AND gate: output 0AND gate: output 01Y00Y10Y20Y3
1 0 inputs changed, output switches next delayclick a switch to toggle it
A1A0Y0Y1Y2Y3
001000
010100
100010
110001

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) :

Logic · Comparateur d’égalité sur 4 bits
auto
0
gate delays
stable after 0
stable
state
2
critical path
gate delays, worst case
5
gates
A = 00002 = 0B = 00002 = 0
A3B3XOR gate: output 0A2B2XOR gate: output 0A1B1XOR gate: output 0A0B0XOR gate: output 0NOR gate: output 11A = B
1 0 inputs changed, output switches next delayclick a switch to toggle it

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.

Dans ce niveau

  1. 7.1Portes et algèbre de Boole
  2. 7.2Additionneurs, ALU et drapeaux
  3. 7.3Multiplexeurs, décodeurs et bus
  4. 7.4Verrous, bascules et horloge
  5. 7.5Registres et matrices mémoire
  6. 7.6Puces SRAM, DRAM, ROM et flashPrévu
  7. 7.7Puces de CPU, broches et boîtiersPrévu
  8. 7.8Chronogrammes de bus, poignées de main et arbitragePrévu
  9. 7.9Bus réels : PCI, PCI Express et USBPrévu
  10. 7.10Circuits d’E/S et décodage d’adressesPrévu