Architecture de l'interface mémoire
SC91-A, Architecture de l'ALU processeur simple cpu

Etape 13 : Réalisation de l'interface mémoire

L'objectif de l'interface mémoire est de séparrer les problématiques liées à l'accès à la mémoire de celle de l'exécution des instructions. Ce composant va donc se charger d'opérations comme le passage de deux bus : l'un de programme, l'autre de données tels qu'ils existent dans la solution réalisée à une seule zone mémoire. Il gerera en outre d'éventuelles mémoires caches et le décodage d'adresse nécesaires à l'ajout de périphériques sur l'espace d'adressage.
Dans un premier temps, le composant d'interface mémoire reste basique puisqu'il ne réalise aucune des actions décrites ci-dessus. Cependant il effectue une tâche primordiale : faire le lien entre un coeur travaillant avec des mots de 32 bits et des mémoires qui doivent être accessible octet par octet. En effet, dans certain cas, la lecture d'un mot de 16 ou 32 bits peut être réalisée dans un seul mot de 32 bits, mais dans bien d'autres, il peut être nécessaire de lire deux mots de 32 bits pour extraire une donnée de 16 ou 32 bits.
Voici donc le principal rôle de ce composant : adapter les opérations de lecture / écriture en mémoire suivant l'adresse et la taille de l'acces requis.

Les opérations de lecture / écriture pouvant durer plus ou moins longtemps, selon la destination et son type de support (SRAM, DRAM, FLASH), selon le nombre de mot à lire pour composer la donnée requise, le composant d'interface mémoire indiquera au coeur CPU la mise à disposition des données par l'emission d'un signal RDY. Ce signal empèche, dans le sequenceur, le passage à l'instruction suivante, d'une part, et le chargement du registre de destination. Ainsi selon le contexte, le temps d'exécution des instructions utilisant la mémoire pourra être variable.

Schéma synoptique du composant d'interface mémoire

Ce diagramme décrit le bloc d'interface mémoire effectuant l'adaptation des opérations d'accès à la mémoire de données. Outre les coposant combinatoires ici décrit, le bloc intègre un automate de gestion des signaux de sélection.

Bloc d'interface mémoire

Accès aux instructions

L'accès à la mémoire pour lire de nouvelles instructions est plus simple que pour les données puisque toutes les instructions sont alignées sur un mot de 32 bit. Il n'est donc pas nécessaire d'utiliser d'opérations de réalignement. Actuellement, les instructions sont toujours stockées dans une mémoire à part. Cette solution permet de ne pas mélanger les complexités de debuggage du coeur et de débuggage de l'accès mémoire. Chaque chose en son temps...

INTERFACE MEMOIRE : Lecture d'un mot

Lors de la lecture d'un mot, si celui-ci n'est pas inclus dans un mot mémoire de 32 bits, il sera nécessaire de réaliser deux lectures consécutive. C'est pourquoi en sortie de la mémoire nous trouvons un registre i_word2 de 24 bits. En effet, au pire des cas, lors d'un accès à un mot de 32 bits à cheval sur deux mots mémoire, ce n'est bien que des 24 premiers bits dont nous aurons besoin.
Le bloc suivant i_wordo32 recompose un mot de 32 bits à partir du ou des mots lus en mémoire ; il effectue donc les décallages nécessaires, au passage il réalise la transformation des données stockées en Big Endian vers un mot de 32bits.
La dernière opération consiste à mettre en forme le mot ainsi obtenu pour avoir un entier signé de 8, 16 ou 32 bits selon ce que l'instruction aura requis.

INTERFACE MEMOIRE : Ecriture d'un mot

Lors de l'écriture d'un mot, la première opération est une conversion de ce mot en format Big Endian. Ce format n'est en effet pas direct par rapport à l'arrangement des bits dans un mot de 32 bits : les bits ne sont pas rangés dans le même sens que les octets puisque les bits de plus fort poids sont rangés dans l'adresse de plus faible valeur. Ce qui au passage demande une gymnastique intellectuelle un peu rude pour les horaires auxquels j'ai réalisé cela (sic). [ Et qui au passage m'a permis de comprendre pourquoi on avait inventé le Little Endian dont l'usage est pénible pour le programmeur, mais tellement plus simple electroniquement parlant ... ]
Bref, une fois mise au format, la donnée est alors transformée en 2 mots de 32 bits à écrire. Dans le même temps, un second module de calcul détermine quels sont les octets qui devront être écrits au sein de ces deux mots de 32 bits. Ces signaux sont I_WE_w1 et I_WE_w2. La mémoire est donc accessible par des mots de 32 bits mais chaque octet doit bien pouvoir être piloté individuellement sans quoi il serait nécessaire dans de nombreux cas d'effectuer une lecture avant toute écriture !
L'automate du composant mémoire va ensuite contrôler le signal I_SELADDR pour demander l'écriture du premier puis du second mot. Il est toutefois à souligner que l'écriture de 2 mots distincts ne s'effectuer que lorsque l'ecriture est à cheval sur deux mots mémoire.

INTERFACE MEMOIRE : Calcul de l'adresse

La mémoire est composée de mots de 32 bits mais doit être accessible par octet, chaque mot sera donc aligné sur une adresse multiple de 4 ; les deux bits de poids faible sont donc réservés à l'accès octet. Lors d'un accès à cheval sur deux mots, le composant calcule une adresse i_DADDR égale à celle requise modulo 4 ou la suivante (adresse+4 % 4) pour obtenir i_DADDR.

INTERFACE MEMOIRE : Evolution de l'interface

Pour l'instant, aucune mémoire externe n'est interfacée. Il faut voir ce premier élément comme la base d'une mémoire cache à laquelle il faudra ajouter toute la logique permettant la mise à jour d'une mémoire RAM ou SRAM par bloc de mots de 32 bits. Encore une fois, il s'agit d'un élément minimum permettant le débuggage du coeur.

Interface avec la mémoire
Simple-Cpu The Simple CPU project The Simple CPU project
Un projet de disk91
Small CPU project