Ce chapitre construit un processeur capable d'exécuter une partie du jeu d'instructions d'un processeur Intel 8080. Nous réutilisons l'unité ALU et la rangée de registres (un banc) des deux chapitres précédents, et quelques composants accessoires. Tout est réuni et coordonné par le décodeur d'instruction qui génère les signaux de contrôle des autres composants.
Le décodeur d'instruction est sans aucun doute le sous-ensemble le plus complexe du processeur. Il est décrit en plusieurs parties dans le livre. Dans cette page web, il est présenté dans seulement deux grands schémas, qui semblent de ce fait impressionnants au premier abord.
Sauf si votre écran est très large, vous devrez sans doute utiliser les commandes de zoom avant et arrière de votre navigateur pour afficher ces schémas en entier.
On commence par choisir un opcode au moyen du rotacteur en haut à gauche. Le mnémonique de l'instruction correspondante est alors rappelé juste au-dessus. Notez que nous ne proposons qu'une partie du jeu d'instructions Intel 8080.
Les trois circuits décodeurs sous le rotacteur alimentent une batterie de portes AND pemettant de trouver la famille d'instructions de l'opcode défini.
Par défaut, il est supposé que l'instruction n'a besoin que d'un seul cycle de chargement et un seul cycle d'exécution. Lorsque ce n'est pas le cas, les portes en bas à gauche déterminent combien d'octets doivent être chargés depuis la mémoire et combien de cycles d'exécution sont requis. En bas, les bascules, le compteur et le décodeur produisent les signaux qui incarnent les trois types de cycles: - cycles de chargement (fetch), - cycles d'incrémentation du pointeur d'instruction PC (Program Counter) et - cycles d'exécution. Une partie du circuit sous le décodeur 4-vers-16 n'a pas le même aspect que dans le livre (p. 387).
En bas, tout à fait à droite, nous trouvons les signaux servant au contrôle de plusieurs composants du processeur. Ces signaux sont les mêmes quelle que soit l'instruction. Ceux des signaux de contrôle qui sont spécifiques à chaque instruction sont pris en charge par la matrice de diodes en haut à droite. Chaque famille d'instructions produit des signaux de contrôle particuliers pour le premier et pour le second cycle d'exécution ainsi que pour les cycles de Pulsation correspondants.
Vous déclenchez successivement des cycles de chargement (fetch) et d'exécution de l'instruction choisie au moyen du bouton d'horloge Clock.
1) En guise d'exemple, réglez le rotacteur sur le code d'instruction C6h, qui est celui de l'addition immédiate ADI. (À tout moment, pour ramener l'ensemble dans l'état initial, utilisez le bouton Reset.)
Les circuits en bas à gauche ont détecté que cette instruction réclamait : - une phase Chargement de 2 octets (fetch) (l'octet du code d'instruction et l'unique octet de donnée à additionner) ; - une phase Exécution de 2 octets. Ces informations ne sont cependant pas exploitées immédiatement. Dans un processeur réel, elles ne seraient évidemment disponibles qu'une fois l'octet de l'instruction rapatrié depuis la mémoire et stocké dans le verrou d'instruction.
Dans la section du bas Décodage de cycle, le Décodeur 4-vers-16 possède des entrées toutes à 0, ce qui signifie que le signal de sortie 0 est à 1, identifiant le Cycle de chargement 1 (fetch). Tout à fait à droite, le signal de validation du pointeur d'instruction Program Counter Enable a provoqué l'envoi du contenu du PC sur le bus d'adresse pour sélectionner un emplacement dans la mémoire RAM. Le signal de validation RAM Data Out Enable autorise l'injection de la valeur lue à cette adresse sur le bus de données. Cela constitue le cycle d'instruction.
2) Appuyez MAIS sans relâcher sur le signal Latch 1 Clock du premier verrou d'instruction à faire stocker l'instruction. Le signal Increment-Decrement Clock fait stocker le contenu du bus d'adresse dans l'Incrémenteur-Décrémenteur.
3) Vous pouvez relâcher le bouton Clock.
4) Actionnez (appuyez/relâchez) le bouton Clock. br> Nous entrons dans le Cycle Incrémentation PC. Le signal Increment Enable autorise le placement sur le bus d'adresse de la valeur du PC après son incrémentation.
5) Maintenez (appuyez sans relâcher) le bouton Clock. Le signal Pulsation force le signal Program Counter Clock à stocker l'adresse une fois incrémentée dans le pointeur d'instruction.
6) Vous pouvez relâcher le bouton Clock.
7) Actionnez (appuyez/relâchez) le bouton Clock. Nous entrons dans le Cycle de chargement 2. Les deux signaux Program Counter Enable et RAM Data Out Enable ont autorisé la diffusion sur le bus de données du prochain octet (l'octet de donnée qui accompagne l'instruction).
8) Une autre action sur le bouton Clock amène le signal Pulsation à faire stocker l'octet dans le Verrou d'instruction 2. Le signal d'horloge Increment-Decrement Clock entraîne le stockage du contenu du pointeur d'instruction PC dans l'Incrémenteur-Décrémenteur.
9) Actionnez le bouton Clock pour entrer dans un autre Cycle d'incrémentation PC.
10) Un autre appui réinjecte la valeur incrémentée dans le PC.
11) Actionnez le bouton Clock pour passer au cycle Exécution Cycle 1. Le processeur est prêt à exécuter l'instruction d'addition. Vous notez en haut que la matrice de diodes sous l'effet du signal Execute Cycle 1 a forcé le signal de validation Inst Latch 2 Enable à faire présenter l'octet de données sur le bus de données.
12) Maintenez (appuyez sans relâcher) le bouton Clock. Pulsation active le signal d'horloge ALU Clock ce qui stocke la valeur dans l'unité ALU.
13) Vous pouvez maintenant relâcher le bouton Clock.
14) Actionnez le bouton Clock (donc sans maintenir). Nous passons au cycle Exécution Cycle 2 dans lequel le signal ALU Enable autorise la mise à disposition du contenu de l'ALU sur le bus de données. C'est la somme de l'accumulateur et de l'octet de données.
15) Maintenez (appuyez sans relâcher) le bouton Clock. Pulsation active le signal d'horloge Acc. Clock ce qui fait stocker la nouvelle valeur dans l'accumulateur.
16) Vous pouvez maintenant relâcher le bouton Clock. L'instruction a été entièrement exécutée.
Si vous continuez à actionner le bouton Clock, vous faites répéter la même instruction. Sur un processeur réel, c'est l'instruction suivante qui serait chargée depuis la mémoire.
Tous les composants de la CPU ont maintenant été réunis et dotés d'un bloc de mémoire à accès direct RAM. Ils sont reliés au bus de données 8 bits (le chemin le moins large), au bus d'adresse (l'autre chemin plus large) et aux signaux de contrôle unitaires (en traits fins). Le Décodeur d'instruction décrit plus haut a été simplifié sous forme d'une grande boîte au centre.
Ce circuit permet de suivre l'exécution d'un programme entier par le processeur. Les octets placés en mémoire au départ incarnent le programme vu dans le chapitre 21 du livre (p. 334). Ce programme additionne deux nombres sur deux octets dont la valeur exprimée en hexadécimal équivaut en décimal à 5000 et 2500.
MEMOIRE 1Ko
Saisir une valeur hexadécimale entre 00 et FF !
Address
DO
DI
Write
Enable
Au fur et à mesure que vous cliquez Clock, le Décodeur d'instruction affiche le nom du cycle et le codop lu. A gauche du Décodeur d'instruction, les signaux contrôlent les Verrous d'instruction, le Pointeur d'instruction PC et l'Incrémenteur-Décrémenteur. A droite du Décodeur d'instruction, ils contrôlent le Banc de registres et l'ALU.
N'oubliez pas que les six signaux S0, S1, S2, D0, D1 et D2 provenant du Décodeur d'instruction et allant dans le Banc de registres (array) peuvent être modifiés par des instructions qui ne concernent pas les Registres. Les signaux Source n'ont de signification que lorsque RA Clock provoque la sauvegarde d'une valeur dans les Registres. De même, les signaux Destination n'ont de sens que lorsque RA Enable provoque l'envoi d'une valeur sur le bus de données.
De même, les trois signaux R0, R1 et R2 provenant du Décodeur d'instruction et allant vers l'ALU n'ont de sens que lorsque ALU Clock demande de stocker une valeur dans l'ALU.
En actionnant le bouton Clock, vous voyez dans le bloc MEMOIRE à gauche quel octet est utilisé. Les deux bus indiquent quelle valeur ils contiennent. Le programme est terminé lorsqu'il a exécuté l'instruction HLT à l'adresse 000Eh. La somme des deux valeurs est disponible aux adresses 0x0010 et 0x0011. Cette valeur est ici égale à 1D4Ch soit 7500 décimal.
Après avoir restauré l'état initial avec Reset, progressez pas à pas avec Clock en cherchant à chaque étape à comprendre les valeurs qui apparaissent dans les bus d'adresse et de données.