SC91-A, construction du bloc des registres
L'architecture générale du processeur SC91-A

Etape 8 : Construction du banc de registres

Comme nous l'avons vu précédemment, le banc de registres est constitué de 32 registres de 32 bits chacun. Ce bloc contient trois registres à usage spécifique : R00 à R02. Les registres R03 à R31 sont d'usage général et leur seule utilisation est le chargement - déchargement de données. Les registres d'usage spécifiques intègrent des fonctionnalités étendues.
Le banc de registre, comme nous l'avons vu dans l'architecture générale s'interface au travers de trois bus de sélection des opérandes et du registre de destination. Nous les appèlerons Rnn pour la sélection de la première opérande, Rmm pour la seconde et Rdd pour le choix du registre de destination.
Les données de ces opérandes sont placées sur trois bus de 32 bits : Dnn et Dmm pour les opérandes sources et Ddd pour le résultat du calcul à mémoriser.

Le registre R00 - Pointeur de code

R00 est utilisé pour pointer l'adresse de la prochaine instruction à exécuter. Dans le cas de l'exécution d'une instruction classique ce registre est donc incrémenté à chaque cycle pour pointer la prochaine instruction. Comme nous utilisons des instructions de longeur fixe de 32 bits, l'adresse doit donc pouvoir être incrémentée de 4 octets de façon automatique. Dans le cas d'instructions de saut, L'adresse de la prochaine instruction doit être changée dans le cycle en cours pour que la futur instruction soit prête au début du cycle suivant. Il existe donc un aiguillage permettant de contourner le registre R00 (PCDIR). Lors d'un chargement de R00 par une instruction JB, LOADm, POP... Un cycle supplementaire sera inserrée pour laisser à la mémoire le temps de réponse nécessaire. Les chargements issus du bus de destination sont pilotés par un signal externe PC_R00.

Le registre R01 - Pointeur de pile

R01 est utilisé pour pointer le sommet de pile, c'est à dire l'adresse mémoire où stocker, en pile, la prochaine valeur. La pile étant incrémentale et les valeurs stockées faisant toutes 32 bits, l'adresse est incrémentée de 4 octets à chaque instruction PUSH. Un additionneur spécifique sera donc intégré. Lors d'une instruction POP, le pointeur de pile doit être préalablement décrémenté avant d'effectuer une lecture de fait, un soustracteur sera aussi ajouté de sorte à ce que ce calcul puisse se faire dans le même cycle que la lecture en mémoire. Ce registre est directement renvoyé vers l'ALU, en effet une instruction comme CALLR demande de placer sur un premier bus l'adresse de destination, sur un second l'adresse de la pile et sur un troisième la valeur courante de PC. De ce fait, il est impossible de toujours utiliser Dnn et Dmm comme seuls bus pour toutes les instructions. SP pourra donc être envoyé directement à l'ALU et sera utilisé pour les instructions POP, PUSH, CALL et CALLr.

Le registre R02 - Registre de flag

R02 est utilisé pour mémoriser les flags. Ceux-ci sont calculé à partir des données présentes sur le bus de destination et de la retenue issue de l'ALU. Le calculs des flags sera réalisé en interne dans la bloc de registres. Tous les bits de R02 n'étant pas des flags, lors d'une mise à jour des flags, seuls ceux-ci seront modifiés.

Les registres R03 à R31 - Usage général

Ce groupe de registre a un usage totalement classique : il sont chargés et lu selon les commandes reçues des bus de contrôle Rnn, Rmm et Rdd.

Connexion aux bus Dnn et Dmm

L'aiguillage des regsitres vers les bus Dnn et Dmm peut se faire au travers de multiplexeurs ou de buffers trois état. Cette seconde solution est interressante lorsque le FPGA intègre un buffer pour chacune des bascule, ce qui n'est pas le cas de la cible retenue. C'est donc à l'aide de deux mulitplexeurs 32x32 que l'aiguillage sera réalisé.

Schéma synoptique du bloc de registres

Le diagramme suivant représente l'architecture détaillée du bloc de registre issu de l'analyse ci-dessus :

La banque de registre du SC91-A

Implémentation du banc de registre
Simple-Cpu The Simple CPU project The Simple CPU project
Un projet de disk91
Small CPU project