Trancher et découper les bits : conception de processeur à l'ancienne

Écrire pour Hackaday peut être quelque peu dangereux. Bien sûr, nous n’avons pas souvent à nous cacher d’espions en colère ou de voyous d’entreprise. Mais nous écrivons souvent sur quelque chose et souhaitons ensuite l'acheter. Cher? Difficile à trouver? Pas besoin? Cela n'a pas vraiment d'importance. Ma dernière expérience avec cet effet était due à un article récent que j'ai écrit sur la famille de puces AM2900 bitslice. De nombreux ordinateurs et jeux vidéo vintage en contiennent et, comme je l'ai déjà expliqué, ils sont comme un élément de base que vous utilisez pour construire un processeur doté des capacités dont vous avez besoin. J'en avais entendu parler dans les années 1970, mais je n'avais jamais eu l'occasion de travailler avec eux.

Au moment où j’écrivais, je me demandais s’il restait quelque chose à vendre avec ces chips. Il s’avère que vous pouvez toujours obtenir les jetons – la plupart d’entre eux – assez facilement. Mais j’ai également trouvé une annonce eBay pour un « kit d’apprentissage et d’évaluation » AM2900. Combien de personnes voudraient une telle chose ? Apparemment, j'ai dû miser une bonne somme d'argent pour en prendre possession, mais je l'ai fait. Le tableau semblait n’avoir jamais été utilisé. Il y avait la carte de garantie et tous les documents. Il avait l'air en parfait état. En le mettant sous tension, cela semblait bien fonctionner.

Qu'est-ce que c'est?

Le conseil d’administration n’a guère l’air d’avoir au moins 40 ans.

Le tableau est un peu plus grand qu’une feuille de papier au format lettre. En haut, il y a trois rangées de quatre LED. Le bord inférieur comporte trois rangées de commutateurs. Une banque a trois commutateurs et les deux autres ont chacune quatre commutateurs. Deux autres interrupteurs contrôlent le fonctionnement de la carte et deux interrupteurs à bouton-poussoir momentanés.

Le cœur de l’appareil, cependant, est l’AM2901, une « tranche » de 4 bits. Ce n'est pas vraiment un CPU mais plutôt l'ALU pour un CPU. Il existe également un AM2909, qui contrôle la mémoire du microcode. De plus, on retrouve une petite quantité de mémoire répartie sur plusieurs puces.

Un véritable ordinateur comporterait probablement de nombreuses tranches qui fonctionnent ensemble. Il aurait également beaucoup plus de mémoire pour les microprogrammes, puis plus de mémoire pour stocker le programme lui-même. Le microcode est un programme très simple qui sait exécuter des instructions pour le CPU.

Par exemple, supposons que vous souhaitiez une instruction qui ajoute le registre A au registre B et laisse le résultat dans le registre A. Un programme de microcode imaginaire pourrait ressembler à ceci :

Gate register A onto internal bus X
Gate register B onto internal bus Y
Set ALU to compute X+Y
Gate ALU output to register A

Le microcode récupère normalement également l'instruction suivante.

Le kit ne dispose pas de mémoire de programme et ne dispose que de 16 emplacements de mémoire pour les étapes du microprogramme. Donc, en réalité, vous pouvez probablement simuler une seule instruction et voir comment elle fonctionne. Mais c'est tout. L'exemple que je vais vous montrer est un simple microprogramme qui convertit un nombre BCD 8 bits en nombre binaire équivalent. Autrement dit, 2 et 8 seront convertis en 1 et C (puisque tout est en 4 bits). Même cela prend toute la mémoire dont dispose l'appareil. N'espérez donc pas émuler un VAX 11/730 (qui utilisait d'ailleurs 8 AM2901).

Comment ça fonctionne

La carte n'a pas de microcontrôleur, donc tout est logique ordinaire. Il est configuré pour fonctionner avec des nombres de 4 bits et un mot de microcode de 32 bits. Comme l'espace sur la carte et les LED étaient chers à l'époque, tout fonctionne avec 4 bits à la fois. La banque de commutateurs de droite (la sélection multiplex) vous permet de saisir un nombre binaire de 000 à 111 (0-7), ce qui contrôle la partie 4 bits avec laquelle vous travaillez à un moment donné.

Les LED de gauche affichent un affichage de données. Ce que cela signifie exactement dépend de la position des commutateurs de sélection multiplex. Par exemple, lorsque les commutateurs sont sur 001, les LED de données affichent la sortie de l'ALU. Lorsque les commutateurs sont à 010, les drapeaux de l'ALU (par exemple, carry et zéro) apparaissent.

Les autres LED affichent quatre bits du registre pipeline – l'instruction que la carte est sur le point d'exécuter – et le contenu de la mémoire du microprogramme (encore une fois, les quatre bits sélectionnés).

Lorsque le commutateur Run/Load est réglé sur la position de chargement, vous pouvez saisir une adresse sur les commutateurs de gauche et des bits de données sur les commutateurs du milieu. Ensuite, vous appuyez sur Memory Load. Cela signifie que pour saisir complètement une micro-instruction de 32 bits, vous devez retourner les commutateurs multiplex 8 fois, puis saisir chaque valeur de 4 bits, une à la fois.

Si vous retournez pour exécuter, vous pouvez utiliser le bouton d'étape unique pour exécuter une instruction, ou vous pouvez connecter une horloge externe et l'utiliser.

Tout cela est déroutant à lire, mais la vidéo ci-dessous vous aidera à voir comment fonctionne cet ancien matériel.

Internes

En interne, vous pouvez voir que la mémoire du microprogramme alimente le registre pipeline. L'adresse provient d'un multiplexeur qui peut sélectionner une adresse parmi plusieurs sources. Le registre pipeline fournit 32 bits qui contrôlent tout, depuis l'adresse suivante jusqu'à ce que fait l'ALU.

Schéma fonctionnel de la carte

Il y a une petite PROM qui sert de table de recherche pour contrôler le séquenceur. Cela permet à l'instruction d'utiliser un petit nombre de bits pour contrôler le séquenceur AM2909 afin que vous puissiez sélectionner l'adresse suivante, effectuer des sauts conditionnels, ou même pousser ou faire sauter la pile interne de l'appareil.

Essentiellement, le séquenceur décide quel mot exécuter, l'AM2901 fait la majeure partie de l'exécution, et le reste n'est que mémoire et un peu de logique de colle.

Dans un système réel, vous devez prendre en compte des éléments tels que les drapeaux de report et la détection d'un résultat nul. Cependant, n’avoir qu’une seule tranche rend les choses plus faciles. L'entrée de report fait partie de la micro-instruction, vous décidez donc quand il y a un report et quand il n'y en a pas.

Micro-instructions

Une analyse de la référence des instructions du microcode du manuel

Dans une conception réelle, la taille et le format des micro-instructions dépendaient entièrement de vous. Cependant, puisque nous utilisons la carte d'évaluation, vous devez utiliser ce format (voir la figure ci-dessous). Chaque instruction comportait plusieurs parties principales : un moyen de spécifier quelle instruction se produirait ensuite, une source et une destination ainsi qu'une opération. De plus, il y avait deux champs de registre et un champ de données (tous, bien sûr, quatre bits). Tous les champs ne sont pas utilisés dans tous les cas.

Il s'agit d'un arrangement très flexible car vous pouvez, par exemple, effectuer un ajout, un décalage et un saut conditionnel dans une seule instruction. Cependant, cela peut prendre un certain temps pour s’y habituer. Par exemple, le chargement d'un registre s'effectue généralement à l'aide d'une instruction OU logique avec un zéro constant.

L’autre chose qui est étrange, c’est le pipeline. Parce que tout est réglé au départ, un saut conditionnel ne s'applique pas à la ligne sur laquelle il se trouve mais à la ligne qui le précède. Par exemple (en pseudo-code) :

Goto next, set Q to A+1
If zero goto bump, set B to B+1

Le « si » dans la deuxième ligne se déclenchera sur l’ajout effectué dans la première ligne.

Assembleur

Un petit extrait du tableur « assembleur »

Si vous regardez la vidéo, vous verrez que saisir un programme complet est fastidieux et sujet aux erreurs. Pour vous aider, j'ai créé un « assembleur » à l'aide de Google Sheets. Vous pouvez utiliser des symboles pour les adresses, les registres et les constantes. Dans la plupart des endroits, vous pouvez utiliser une liste déroulante pour choisir parmi les options. Il y a aussi un espace pour les commentaires.

Une fois renseigné, vous pouvez masquer le « code source » en utilisant Ctrl+Alt+Maj+2. Cela vous donne un élément pratique à lire ou à imprimer pour insérer les données dans le tableau. Ctrl+Alt+Maj+1 restaurera l’affichage.

Adresse Bifurquer Suivant MUX DEST SRC PORTER ALU UN B D
0 CONTINUER F->RAM (F) D 0 R OU S !ILSD #Chiffre0
1 CONTINUER F->RAM (F) D 0 R OU S !IMSD #Chiffre1
2 CONTINUER F->Q D 0 R OU S 0
3 CONTINUER 2 – Double 2F, 2Q->RAM,Q 0B R OU S !RES0

Considérez l'extrait du programme de démonstration ci-dessus. La colonne de branchement peut contenir la prochaine adresse à exécuter, mais comme chaque ligne a un continu, l'adresse peut être vide. Le système l'ignorera de toute façon.

À droite se trouvent les colonnes A, B et D. Les colonnes A et B sont des nombres de 0 à 15 signifiant l'un des registres internes de l'ALU. Ici, nous n’utilisons pas A, donc c’est vide. Le champ D est destiné à une constante de quatre bits si vous en avez besoin.

La colonne ALU contient l'opération à exécuter et la colonne SRC contient les entrées de cette fonction. Dans la première ligne, par exemple, nous prenons D et OU avec zéro. Cependant, à l'adresse 3, le OU est compris entre un zéro et le contenu du registre B.

La colonne DEST indique où va le résultat ALU. Dans la plupart de ces lignes, il va vers la RAM, qui est le registre nommé en B. Cependant, à l'adresse 2, le résultat va vers le registre Q, qui est interne à l'AM2901. La destination de l'adresse 3 stocke le résultat après avoir effectué un double décalage (c'est-à-dire 8 bits) vers la gauche.

De toute évidence, il se passe beaucoup de choses ici. Si vous voulez tout savoir, vous devrez lire les fiches techniques et le manuel de la carte. Je vous les ai laissés sur Hackaday.io. Vous y trouverez également des liens vers l'assembleur et d'autres documents.

Vous n'avez pas de planche ? Aucun problème. Je créerai un émulateur – également basé sur une feuille de calcul – disponible dans le prochain épisode, ainsi que des informations supplémentaires sur les composants internes de la puce. Si vous avez manqué le message qui m'a lancé dans cette voie, vous pouvez revenir en arrière et en savoir plus sur les composants internes et l'historique de l'appareil. Il existe de nombreux émulateurs pour les machines utilisant l'AM2901, bien qu'ils imitent probablement le comportement et non le circuit.

François Zipponi
Je suis François Zipponi, éditorialiste pour le site 10-raisons.fr. J'ai commencé ma carrière de journaliste en 2004, et j'ai travaillé pour plusieurs médias français, dont le Monde et Libération. En 2016, j'ai rejoint 10-raisons.fr, un site innovant proposant des articles sous la forme « 10 raisons de... ». En tant qu'éditorialiste, je me suis engagé à fournir un contenu original et pertinent, abordant des sujets variés tels que la politique, l'économie, les sciences, l'histoire, etc. Je m'efforce de toujours traiter les sujets de façon objective et impartiale. Mes articles sont régulièrement partagés sur les réseaux sociaux et j'interviens dans des conférences et des tables rondes autour des thèmes abordés sur 10-raisons.fr.