Dans les chapitres précédents, nous avons vu ce qu'il y a à l'intérieur des diverses mémoires. Nous avons abordé des généralités qui valent aussi bien pour des mémoires ROM, RAM, de masse, ou autres. Et il va de soi qu'après avoir vu les généralités, nous allons passer sur les spécificités de chaque type de mémoire. Nous allons d'abord étudier les mémoires ROM, pour une raison simple : l'intérieur de ces mémoires est très simple. Il faut dire qu'il s'agit de mémoires de faible capacité, dont les besoins en termes de performance sont souvent assez frustres, les seules ROM à haute performance étant les mémoires Flash. En conséquence, elles intègrent peu d'optimisations qui complexifient leur micro-architecture.
Rappelons qu'il existe plusieurs types de mémoires ROM :
Toutes ces mémoires ROM ont un contrôleur mémoire limité à son plus simple appareil : un simple décodeur pour gérer les adresses. Les circuits d'interface avec la mémoire sont aussi très simples et se limitent le plus souvent à un petit circuit combinatoire. Le plan mémoire est des plus classiques et ce chapitre ne l'abordera pas, pour ne pas répéter ce qui a été vu dans les chapitres précédents. Seuls les cellules mémoires se démarquent un petit peu, celles-ci étant assez spécifiques sur les mémoires ROM. Les cellules mémoires ROM varient grandement selon le type de mémoire, ce qui explique les différences entre types de ROM.
Les mémoires ROM.
Les mémoires ROM les plus simples sont de loin les "Mask ROM", qui sont fournies avec leur contenu directement intégré dans la ROM lors de sa fabrication. Ces mémoires ROM sont accessibles uniquement en lecture, mais pas en écriture, sans compter qu'elles ne sont pas reprogrammables. Il est possible de les fabriquer avec plusieurs méthodes différentes, que nous n'allons pas toutes présenter. La plus simple est de loin de prendre une mémoire FROM et de la programmer avec les données voulues. Et c'est d'ailleurs ainsi que procèdent certains fabricants. Mais cette méthode n'est pas très intéressante : le constructeur ne produit alors pas vraiment une "vraie" Mask ROM. À la place, nous allons vous parler des autres méthodes, plus intéressantes à étudier et aussi plus économes en circuits.
Les "Mask ROM" sont fabriquées en combinant un décodeur avec un OU câblé.
Les ROM sont techniquement des circuits combinatoires : leur sortie (la donnée lue) ne dépend que de l'entrée (l'adresse). Et en conséquence, pour chaque mémoire ROM, il existe un circuit combinatoire équivalent. Prenons un circuit qui, pour chaque entrée formula_1, renvoie le résultat formula_2 : celui-ci est équivalent à une ROM dont le byte d'adresse formula_1 contient la donnée formula_2. Et réciproquement : une telle ROM est équivalente au circuit précédent. En clair, on peut créer un circuit combinatoire quelconque en utilisant une ROM, ce qui est très utilisé dans certains circuits que nous verrons dans quelques chapitres. Cependant, cela ne signifie pas que chaque circuit combinatoire soit une mémoire ROM : une vraie ROM contient un plan mémoire, un décodeur, de même que les circuits d'interface avec le bus, des "bitlines", et j'en passe.
On peut créer une simili-ROM avec un décodeur et des portes OU.
Il existe une sorte d'intermédiaire entre une ROM véritable et un circuit combinatoire optimisé. Rappelons que tout circuit combinatoire est composé de trois couches de portes logiques : une couche de portes NON, une autre de portes ET, et une dernière couche de portes OU. Les deux couches de portes NON et ET calculent des minterms, et la couche de porte OU effectue un OU entre ces minterms. On peut remplacer les deux premières couches par un décodeur, comme nous l'avions vu dans le chapitre sur les circuits de sélection. En effet, par définition, un décodeur est un circuit qui fournit tous les minterms que l'on peut obtenir à partir de l'entrée. Il reste à faire un OU entre les sorties adéquates du décodeur pour obtenir le circuit voulu.
Un tel circuit commence à ressembler à une mémoire, bien que ce soit encore imparfait. On trouve bien un décodeur, comme dans toute mémoire, mais le plan mémoire n'existe pas vraiment car les portes OU ne sont pas des cellules mémoires en elles-mêmes. Néanmoins, ce circuit sert de base aux véritables mémoires ROM, qui s'obtient à partir du circuit précédent.
Le OU câblé.
Les mémoires ROM sont conçues en remplaçant les portes OU normales par un autre circuit équivalent, qui se comporte comme une porte OU, qui porte le nom de OU câblé ("wired OR"). Le circuit est illustré ci-contre. L'idée est qu'il y a un OU cablé par "bitline". Les entrées de la porte OU sont reliées à la "bitline", elle-même relié à la masse à travers une résistance. Mais entre la "bitline" et les entrées, se trouve un petit circuit qui garantit que le montage fonctionne.
Tout ce qu'il faut savoir est que ce circuit se comporte comme suit : soit il recopie la tension d'entrée sur sa sortie, soit il déconnecte la sortie de l'entrée. Le choix entre les deux dépend de la tension qu'on envoie sur l'entrée : un 0 en entrée du circuit entraine une déconnexion et un 1 connecte entrée et sortie. Par contre, si la tension d'entrée est un 0, alors il se déconnecte. Si toutes les entrées sont à 0, alors tous les circuits sont déconnectés et la sortie est connectée à la masse à travers la résistance : elle est à 0. Mais si une seule entrée est à 1, alors le 1 d'entrée et recopié sur le fil, et sert de tension d'alimentation au circuit, ce qui met la sortie à 1.
Les petits circuits en avant des entrées peuvent se fabriquer de plusieurs manières. La première utilise tout simplement une diode, la seconde utilise un transistor. La première méthode donne les ROM à diode, alors que la seconde donne des ROM à transistors MOS.
Les ROM à diodes.
Les ROM à diodes sont des mémoires ROM fabriquées en combinant un décodeur avec des diodes et des "bitlines". Ici, les cellules mémoires sont composées soit de diodes, soit de rien : les cellules qui mémorisent un 1 sont composées d'une diode, alors que les autres sont simplement vides. Plus précisément, les diodes sont le circuit pour le OU câblé, qui se met entre les entrées du OU et la "bitline".
Rappelons que le plan mémoire est composé des "bitlines" et aussi "row lines" provenant du décodeur, et que les diodes/cellules mémoires se trouvent à l'intersection des "bitlines" et des "row lines". Pour les cellules à 1, la diode connecte la bitline avec le signal row line : cela permet mettre la bitline à 1 quand elle est sélectionnée et de ne pas y toucher sinon. Pour les cellules à zéro, la bitline n'est pas connectée avec le signal row line et est naturellement à 0. Cela permet de mettre la bitline à 1 ou 0 selon le bit mémorisé, mais uniquement quand la ligne est sélectionnée. Si la ligne n'est pas sélectionnée, les diodes (ou leur absence) localisées sur la ligne n'ont aucun effet : aucun courant ne les traverse. Mais quand la ligne est sélectionnée, le signal row line est à 1, ce qui met la bitline, la diode et le bit de sortie à 1. Sauf pour les cellules à zéro, qui restent à zéro vu que la diode ne connecte pas le signal aux bitlines.
Les ROM à transistors MOS.
Les ROM de type MOS fonctionnent comme les ROM à diodes, si ce n'est que les diodes sont remplacées par des transistors MOS. De plus, là où on mettait une diode pour les cellules à mettre à 1, c'est l'inverse sur les ROM MOS. Ici, les cellules mémoires qui mémorisent un zéro contiennent un transistor MOS qui connecte la bitline et le signal "row line", alors que les autres ne connectent pas la bitline avec ce signal. Pour être précis, c'est un transistor NMOS qui est utilisé, à savoir qu'il se ferme quand on met un 0 sur sa base, et s'ouvre si on lui envoie un 1. Le transistor MOS est utilisé comme interrupteur commandé par le signal "row line" : le transistor fonctionne comme un interrupteur ouvert si ce signal vaut zéro, et comme un interrupteur fermé s'il vaut 1.
Maintenant, regardons ce qui se passe quand le décodeur sélectionne une cellule mémoire dont le contenu est 1, puis une autre qui stocke un 0. Dans tous les cas, les cellules mémoire non-sélectionnées se comporteront comme un simple fil : soit il s'agit de cellules vides, soit ce sont des transistors MOS fermés ("row line" à 0). Selon la valeur de la cellule sélectionnée, la bitline sera directement connectée à la tension d'alimentation, ce qui donne un 1 en sortie, ou en sera déconnectée donnant un 0.
Si la cellule mémoire sélectionnée est vide, le signal "row line" et la bitline ne sont pas connectées : la bitline est connectée à la tension d'alimentation.
Si la cellule mémoire contient un transistor MOS, celui-ci s'ouvrira : la bitline ne sera pas connectée à la tension d'alimentation et sera donc mise à 0. Les deux cas sont illustrés dans les schémas ci-dessous.
Les mémoires PROM.
L'intérieur d'une mémoire FROM est similaire à celui d'une mémoire ROM simple, sauf que les diodes/transistors (ou leur absence) sont remplacées par un autre dispositif. Précisément, chaque cellule mémoire est composé d'une sorte d'interrupteur qu'on ne peut configurer qu'une seule fois. Celui est localisé à l'intersection d'une bitline et d'un signal row line, et connecte ces deux fils. Lors de la programmation, ce connecteur est soit grillé (ce qui déconnecte les deux fils), soit laissé intact. Pour faire un parallèle avec une ROM à diode, ce connecteur fonctionne comme une diode quand il est laissé intact, mais comme l'absence de diode quand il est grillé.
Suivant la mémoire, ce connecteur peut être un transistor, ou un fusible. Dans le premier cas, chaque transistor fonctionne soit comme un interrupteur ouvert, soit comme un interrupteur fermé. Un 1 correspond à un transistor laissé intact, qui fonctionne comme un interrupteur ouvert. Par contre, un 0 correspond à un transistor grillé, qui se comporte comme un interrupteur fermé. Dans le cas avec les fusibles, chaque bit est stocké en utilisant un fusible : un 1 est codé par un fusible intact, et le zéro par un fusible grillé. Une fois le fusible claqué, on ne peut pas revenir en arrière : la mémoire est programmée définitivement.
Programmer une PROM consiste à faire claquer certains fusibles/transistors en les soumettant à une tension très élevée. Pour cela, le contrôleur mémoire balaye chaque ligne une par une, ce qui permet de programmer la ROM ligne par ligne, byte par byte. Lorsqu'une ligne est sélectionnée, on place une tension très importante sur les bitlines voulues. Les fusibles de la ligne connectés à ces bitlines sont alors grillés, ce qui les met à 0. Les autres bitlines sont soumises à une tension normale, ce qui est insuffisant pour griller les fusibles. En choisissant bien les bitlines en surtension pour chaque ligne, on arrive à programmer la mémoire FROM comme souhaité.
Les mémoires EPROM et EEPROM.
Les mémoires EPROM et EEPROM, y compris la mémoire Flash, sont fabriquées avec des transistors à grille flottante, que nous avons déjà abordés il y a quelques chapitres. Je vous renvoie au chapitre sur les cellules mémoire pour plus d'informations à ce sujet. La grille de ces transistors est connectée à la "row line", ce qui permet de commander leur ouverture, le drain et la source sont connectés à une "bitline".
Les mémoires EPROM.
Avant de pouvoir (re-)programmer une mémoire EPROM ou EEPROM, il faut effacer son contenu. Sur les EPROM, l'effacement se fait en exposant les transistors à grille flottante à des ultraviolets. Divers phénomènes physiques vont alors décharger les transistors, mettant l'ensemble de la mémoire à 0. Pour pouvoir exposer le plan mémoire aux UV, toutes les mémoires EPROM ont une petite fenêtre transparente, qui expose le plan mémoire. Il suffit d'éclairer cette fenêtre aux UV pour effacer la mémoire. Pour éviter un effacement accidentel de la mémoire, cette fenêtre est d'ordinaire recouverte par un film plastique qui ne laisse pas passer les UV.
Les mémoires EEPROM et Flash.
Les mémoires Flash et les mémoires EEPROM se ressemblent beaucoup, suffisamment pour que la différence entre les deux est assez subtile. Pour simplifier, on peut dire que les EEPROM effectuent les effacements/écritures byte par byte, alors que les Flash les font par paquets de plusieurs bytes. Là où on peut effacer/programmer un byte individuel sur une EEPROM, ce n'est pas possible sur une mémoire Flash. Sur une mémoire Flash, on est obligé d'effacer/programmer un bloc entier de la mémoire, le bloc faisant plus de 512 bytes. C’est une simplification, qui cache le fait que la distinction entre EEPROM et Flash n'est pas très claire. Dans les faits, on considère que le terme EEPROM est à réserver aux mémoires dont les unités d'effacement/programmation sont petites (elles ne font que quelques bytes, pas plus), alors que les Flash ont des unités beaucoup plus larges.
Les différences entre EEPROM, Flash NOR et Flash NAND.
Dans ce cours, nous ferons la distinction entre EEPROM et Flash sur le critère suivant : l'effacement peut se faire byte par byte sur une EEPROM, alors qu'il se fait par blocs entiers sur une Flash. Quant à la reprogrammation, tout dépend du type de mémoire. Sur les EEPROM, elle a forcément lieu byte par byte, comme l'effacement. Mais sur les mémoires Flash, elle peut se faire soit byte par byte, soit par paquets de plusieurs centaines de bytes. Cela permet de distinguer deux sous-types de mémoires Flash : les mémoires Flash de type NOR et les Flash de type NAND. Nous verrons ci-dessous d'où proviennent ces termes, mais laissons cela de côté pour le moment. Sur les Flash de type NOR, on doit effacer la mémoire par "blocs", mais on peut reprogrammer les bytes uns par uns, indépendamment les uns des autres. Par contre, sur les Flash de type NAND, effacement et reprogrammation se font par paquets de plusieurs centaines de bytes. Pire : les blocs pour l'effacement n'ont pas la même taille que pour la reprogrammation : environ 512 à 8192 octets pour la reprogrammation, plus de 64 kibioctets pour l'effacement. Par exemple, il est possible de lire un octet individuel, d'écrire par paquets de 512 octets et d'effacer des paquets de 4096 octets. Sur les Flash NAND, l'unité d'effacement s'appelle un "bloc" (comme pour les Flash NOR), alors que l'unité de reprogrammation s'appelle une "page mémoire".
Les avantages et inconvénients de chaque type d'EEPROM.
En termes d’avantages et d'inconvénients, les différents types de Flash sont assez distincts. Les Flash NOR ont meilleur un temps de lecture que les Flash NAND, alors que c'est l'inverse pour la reprogrammation et l'effacement. Pour faire simple, l'écriture est assez lente sur les Flash NOR. En termes de capacité mémoire, les Flash NAND ont l'avantage, ce qui les rend mieux adaptées pour du stockage de masse. Leur conception réduit de loin le nombre d'interconnexions internes, ce qui augmente fortement la densité de ces mémoires.
Les différents types de Flash/EEPROM sont utilisées dans des scénarios très différents. Les Flash NAND sont idéales pour des accès séquentiels, comme on en trouve dans des accès à des fichiers. Par contre, les EEPROM et les Flash de type NOR sont idéales pour des accès aléatoires. En conséquence, les Flash NAND sont idéales comme mémoire de masse, alors que les Flash NOR/EEPROM sont idéales pour stocker des programmes de petite taille, comme des Firmware ou des BIOS. C'est la raison pour laquelle les Flash NAND sont utilisées dans les disques de type SSD, alors que les autres sont utilisées comme de petites mémoires mortes.
La micro-architecture des mémoires FLASH simples.
Les mémoires Flash sont fabriquées avec des transistors à grille flottante, comme pour les mémoires EEPROM. Du point de vue de la micro-architecture, il n'y a pas de différence notable entre EEPROM et mémoire Flash. La seule exception tient dans le plan mémoire et notamment dans la manière dont les cellules mémoires sont reliées aux "bitlines" (les fils sur lesquels on connecte les cellules mémoires pour lire et écrire dedans). Mais la manière utilisée n'est pas la même entre les Flash NAND et les Flash NOR.
Le tout est illustré dans le schéma qui suit, dans lequel on voit que chaque cellule d'une Flash NOR est connectée à la "bitline" directement, alors que les Flash NAND placent les cellules en série. De ce fait, les Flash NAND ont beaucoup moins de fils et de connexions, ce qui dégage de la place. Pas étonnant que ces dernières aient une densité mémoire plus importante que pour les Flash NOR (on peut mettre plus de cellules mémoire par unité de surface). Cette différence n'a strictement rien à voir avec ce qui a été dit plus haut. Peu importe que chaque cellule soit connectée à la "bitline" ou que les transistors soient en série, on peut toujours lire et reprogrammer chaque cellule indépendamment des autres.