# Microprogrammation

La microprogrammation est une technique de réalisation du séquenceur d'un processeur, utilisé dans la technologie CISC, dans laquelle le comportement du séquenceur est décrit par le contenu d'une mémoire. Ce contenu est appelé microprogramme ou microcode. Il peut être vu comme un programme destiné à une machine très simple appelée micro-séquenceur ; le processeur final est alors considéré comme une machine virtuelle simulée par le micro-séquenceur. Par opposition la technologie RISC ne contient pas de microcode.
La réalisation microprogrammée des séquenceurs s'oppose à leur réalisation câblée. A priori plus onéreuse au départ, sa souplesse facilite l'évolution des modèles.

## Principe

Le séquenceur d'un processeur est un automate fini qui contrôle le fonctionnement du chemin de données : notamment l'unité arithmétique et logique (UAL), les registres, etc.
Une approche consiste à réaliser cet automate à l'aide d'un circuit logique combinatoire, qui prend en entrée l'état du chemin de données ainsi que des signaux d'horloge, et fournit en sortie les signaux de commande à destination du chemin de données. Ce circuit logique est réalisé à l'aide d'un ensemble de portes logiques. Cette technique est dite du séquenceur câblé.
On peut cependant remarquer qu'un circuit logique combinatoire peut être réalisé à l'aide d'une mémoire utilisée en lecture (typiquement une mémoire morte), à laquelle les signaux d'entrée sont fournis en tant qu'adresses, et dont les mots fournis en sortie sont interprétés comme des signaux de sortie. Il est donc possible de remplacer le circuit combinatoire ci-dessus par une mémoire : c'est l'idée qui se trouve à la base de la microprogrammation. Les cases successives de la mémoire sont vues comme des instructions élémentaires ou micro-instructions ; leur ensemble constitue le microprogramme ou microcode.
Il est possible de complexifier ce schéma simpliste en ajoutant la possibilité d'effectuer des sauts entre micro-instructions. De plus, on introduit en général un registre contenant l'adresse de la prochaine micro-instruction à traiter : le micro-compteur ordinal. Il existe donc une logique simple — et câblée — chargée de dérouler le microprogramme : on l'appelle le micro-séquenceur.
Le code machine — les instructions, que l'on peut qualifier de macro-instructions pour bien les distinguer des micro-instructions — sont donc interprétées par le micro-séquenceur qui exécute le microcode. Plusieurs micro-instructions sont exécutées pour réaliser une (macro)-instruction.
Il y a deux techniques d'implémentation du microcode :
* Le microcode horizontal, qui utilise un nombre très grand de bits pour contrôler tous les éléments du processeur. Sur l'IBM 360 modèle 30 par exemple, une micro-instruction fait 60 bits.
* Le microcode vertical, qui occupe beaucoup moins de bits car il contient une partie spécifiant l'unité à contrôler, et une autre qui sera la commande envoyée à cette unité.
Les architectures basées sur des microprocesseurs en tranches sont microcodées.

## Avantages et inconvénients des machines microcodées

* Les avantages sont (entre autres) :
** évolutivité du jeu d'instructions
** simplicité du design
** correction possible des erreurs de conception matérielle par modification du microcode
* Les inconvénients sont (entre autres) :
** possibilités de bugs dans le microcode
** lenteur de la machine (plusieurs cycles d'horloge pour exécuter une instruction en code machine (ou son équivalent en assembleur)).

## Exemple d'ordinateurs microcodés

* DEC PDP-10, VAX (16 Kmots de 42 bits)…
* IBM 360 et 370 : les modèles de base étaient microprogrammés ; les modèles haut de gamme avaient un séquenceur câblé (IBM 360 modèles 44, 75, 91, 95, et 195)
* Burroughs 1600
* Cii Mitra 15
* Télémécanique T 1600
* Motorola 68000
* Intel 8080, 8086…
* Zilog Z80
* System i (AS/400)