Skip to content

Niveau 7 · Chapitre 7.5

Registres et matrices mémoire

D’une bascule à des gigaoctets : registres avec chargement et remise à zéro, le banc de registres et ses ports, une mémoire qui fonctionne vraiment, faite de verrous, de décodeurs et de portes de lecture, lignes et colonnes, sélection de puce et validation de sortie, et pourquoi les vraies cellules mémoire utilisent 6 transistors ou un seul.

Le chapitre précédent stockait un bit dans un verrou ou une bascule. Un ordinateur a besoin de milliards de bits, organisés pour que n’importe quel groupe puisse être retrouvé par son numéro. Ce chapitre va d’un simple registre à une mémoire qu’on lit et qu’on écrit par adresse.

Les registres

Un registre de n bits, ce sont n bascules D qui partagent une horloge : à chaque front montant, toutes capturent leur entrée D en même temps. Les vrais registres ajoutent deux contrôles :

  • chargement (ou validation d’écriture) : un multiplexeur devant chaque entrée D choisit entre la nouvelle valeur et la sortie de la bascule elle-même, si bien que le registre ne change que lorsque le chargement vaut 1 ;
  • remise à zéro (clear) : force toutes les bascules à 0, par exemple au démarrage.

Le registre de 8 bits de Tanenbaum a aussi un inverseur sur son entrée d’horloge qui semble inutile, puisque chaque bascule l’inverse à nouveau. Son rôle est électrique : une seule entrée ne peut pas piloter huit bascules à elle seule, et l’inverseur sert d’amplificateur. Les vrais circuits sont pleins de ces tampons.

Le banc de registres

Les registres du CPU — les 16 du x86-64 que nomme le niveau de l’assembleur — sont regroupés dans un banc de registres, qui a des ports :

  • un port de lecture est un gros multiplexeur : le numéro de registre (4 bits) choisit quel registre présente ses 64 bits en sortie. Deux ports de lecture permettent à une instruction de lire ses deux opérandes dans le même cycle ;
  • un port d’écriture est un décodeur : le numéro du registre de destination active l’entrée de chargement d’un seul registre, qui capture le résultat au front d’horloge.

C’est le banc de registres du chapitre sur le chemin de données, vu de l’intérieur. Les cœurs à exécution dans le désordre ont des bancs de centaines de registres physiques avec une douzaine de ports ou plus, ce qui en fait l’une des structures les plus coûteuses de la puce.

Une mémoire adressable

Les registres ne passent pas à l’échelle : chacun a besoin de ses propres fils en entrée et en sortie. Une mémoire partage ses fils entre tous ses mots. On lui donne une adresse et une commande de lecture ou d’écriture, et elle lit ou écrit seulement le mot situé à cette adresse. En voici une complète, de 2 mots de 2 bits, construite avec les mêmes verrous D :

Logic · Une mémoire de 2 mots × 2 bits
auto
0
gate delays
stable after 0
stable
state
loop
critical path
feedback: sequential
27
gates
D = 002 = 0O = 002 = 0
word 0 · bit 1word 0 · bit 0word 1 · bit 1word 1 · bit 0D1D0WEANOT gate: output 1AND gate: output 0AND gate: output 0NOT gate: output 1NOT gate: output 1NAND gate: output 1NAND gate: output 1NAND gate: output 0NAND gate: output 1AND gate: output 0NAND gate: output 1NAND gate: output 1NAND gate: output 0NAND gate: output 1AND gate: output 0NAND gate: output 1NAND gate: output 1NAND gate: output 0NAND gate: output 1AND gate: output 0NAND gate: output 1NAND gate: output 1NAND gate: output 0NAND gate: output 1AND gate: output 0OR gate: output 00O1OR gate: output 00O0
1 0 inputs changed, output switches next delayclick a switch to toggle it

Each box is a D latch holding one bit. The address A picks a word (NOT A selects word 0, A selects word 1). With WE = 1, the selected word's latches open and store D1·D0; the other word is untouched. With WE = 0 nothing changes, and O1·O0 always shows the selected word, read through the AND gates and the ORs. Real memory chips are this, with thousands of rows and columns.

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.

Essayez :

  1. Écrire le mot 0. Réglez A = 0, D1·D0 = 1·0, puis activez et désactivez WE. Seuls les verrous du mot 0 s’ouvrent : les portes de validation combinent WE avec l’adresse décodée.
  2. Écrire le mot 1. Réglez A = 1, D1·D0 = 0·1, et donnez de nouveau une impulsion sur WE.
  3. Lire. Changez D comme vous voulez — rien n’est stocké tant que WE = 0. Basculez A entre 0 et 1 : les sorties O1·O0 affichent 10 pour le mot 0 et 01 pour le mot 1.

Toutes les parties d’une vraie mémoire sont là :

  • un décodeur d’adresse transforme l’adresse en une seule ligne de sélection de mot active (ici simplement NOT A et A) ;
  • la validation d’écriture se combine avec la sélection de mot pour que seuls les verrous du mot adressé s’ouvrent ;
  • en lecture, la sélection de mot ouvre les portes de lecture du mot adressé, et un OR par colonne (ou, dans les vraies puces, une ligne de bit partagée) amène ses bits aux sorties. Les autres mots fournissent des 0.

On l’agrandit en ajoutant des lignes (des mots) et des colonnes (des bits). k bits d’adresse sélectionnent un mot parmi 2ᵏ, et un mot peut avoir n’importe quelle largeur.

Lignes et colonnes

Une vraie puce mémoire est une grille carrée : chaque ligne est une ligne de mot (word line), chaque colonne une ligne de bit (bit line), et une cellule se trouve à chaque croisement. L’adresse est coupée en deux :

  • la moitié ligne pilote un décodeur de ligne, qui active une ligne de mot : chaque cellule de cette ligne place son bit sur la ligne de bit de sa colonne ;
  • la moitié colonne pilote un multiplexeur qui choisit, dans cette ligne, les bits réellement demandés.

Une disposition carrée garde les deux décodeurs petits. Une matrice d’un million de bits organisée en 1024 × 1024 demande deux décodeurs de 10 bits au lieu d’un décodeur de 20 bits à un million de sorties.

Les puces DRAM économisent aussi des broches en envoyant les deux moitiés de l’adresse l’une après l’autre sur les mêmes broches. La ligne passe d’abord, mémorisée quand le signal RAS (row address strobe) est activé, puis la colonne, mémorisée par CAS. Une fois une ligne ouverte, lire d’autres colonnes de cette ligne est rapide, ce qui est l’une des raisons pour lesquelles les caches chargent des lignes entières.

Les broches d’une puce mémoire

SignalRôle
adressequel mot (ou, pour la DRAM, la ligne puis la colonne)
donnéesen entrée pour une écriture, en sortie pour une lecture — en général les mêmes broches
CS̅ (chip select)cette puce doit répondre ; les autres puces ignorent le bus
WE̅ (write enable)écrire plutôt que lire
OE̅ (output enable)piloter les broches de données ; sinon elles flottent

La barre signale les signaux actifs à l’état bas : l’action a lieu quand la broche est à 0. Les fiches techniques disent qu’un signal est activé ou désactivé (asserted / negated) plutôt que haut ou bas, parce que la tension qui signifie « oui » dépend de la broche. OE contrôle un tampon de sortie trois états, comme décrit dans la partie sur les bus : quand la puce n’est pas sélectionnée, ou qu’on y écrit, ses broches de données relâchent le bus de données partagé.

Les vraies cellules mémoire

La mémoire à base de verrous ci-dessus utilise plus d’une douzaine de transistors par bit — quatre portes NAND en font déjà 16 — bien trop pour des gigaoctets. Les vraies mémoires utilisent des cellules beaucoup plus petites :

  • SRAM (RAM statique) : deux inverseurs croisés — la même idée de rétroaction qu’un verrou — plus deux transistors d’accès, soit 6 transistors par bit. Elle conserve sa valeur tant qu’elle est alimentée, et elle est rapide. On l’utilise pour les registres et les caches.
  • DRAM (RAM dynamique) : 1 transistor et 1 condensateur par bit. Le bit est une minuscule charge qui fuit : chaque ligne doit être rafraîchie — lue et réécrite — toutes les quelques dizaines de millisecondes. Elle est bien plus dense et moins chère que la SRAM, mais plus lente, et sert de mémoire principale.

Parce que la mémoire est une grille très régulière, elle passe bien à l’échelle. Le nombre de bits par puce a suivi la loi de Moore : l’observation de Gordon Moore, révisée en 1975, selon laquelle le nombre de transistors sur une puce double environ tous les deux ans. (Les « 18 mois » souvent cités, y compris dans le texte de Tanenbaum, sont une variante populaire, pas le chiffre de Moore.) Le fonctionnement des cellules SRAM, DRAM, ROM et flash fera l’objet d’un chapitre ultérieur sur les puces mémoire.

À retenir

  • Un registre, ce sont n bascules qui partagent une horloge, en général avec des contrôles de chargement et de remise à zéro. Le banc de registres ajoute des ports de lecture (multiplexeurs) et d’écriture (décodeurs).
  • Une mémoire partage ses fils entre tous ses mots : un décodeur d’adresse choisit le mot, la validation d’écriture commande le stockage, et des portes de lecture ou des lignes de bit fournissent le mot choisi.
  • Les vraies puces sont des grilles de lignes de mot et de lignes de bit, avec des décodeurs de ligne et de colonne. La DRAM envoie l’adresse de ligne puis celle de colonne (RAS, CAS).
  • Les puces ont des broches de sélection de puce, de validation d’écriture et de validation de sortie, souvent actives à l’état bas. Les sorties trois états permettent à de nombreuses puces de partager un bus de données.
  • Les cellules SRAM utilisent 6 transistors et conservent leur valeur ; les cellules DRAM utilisent 1 transistor et 1 condensateur et doivent être rafraîchies.

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