Pervenche: processeur à instruction unique

Je veux parler du processeur que j'ai développé en 2016. Il est implémenté en C comme une machine virtuelle. Mon ami Björn a écrit l'assembleur pour lui en F #.

Pervenche est un processeur OISC (un ordinateur à jeu d'instructions), contrairement à RISC et CISC. Il n'a pas de pipelining. En fait, la productivité n'est pas l'objectif principal du projet, il a été créé davantage pour le plaisir et à des fins éducatives.

Mon amie Alena a proposé le nom de pervenche, c'est-à-dire pervenche (cette fleur incroyablement tenace est considérée comme un symbole de vitalité - environ Per.)

Il existe de nombreux types d'instructions pour OISC. Mais à Periwinkle, c'est une déclaration de mouvement. Déplacez simplement le littéral vers un registre ou une valeur d'un registre vers un autre. Opérations logiques et arithmétiques, branchement, etc. réalisée à l'aide de registres.

La longueur de l'instruction Periwinkle est stable de 40 bits. Bus de données 32 bits.



La pervenche a un total de 64 registres.



En voici une description:

Compteur de logiciels (PC)

  • Compteur jusqu'à 32 bits
  • La taille de la mémoire du programme est de 255 mots de 40 bits (dépend de l'implémentation)
  • Le déplacement de -1 vers le registre PC entraîne l'arrêt explicite du compteur

Pile à usage général (STK)
  • Pile pour tout (16 niveaux de profondeur)
  • Aucun signal de débordement et pile incomplète
  • La lecture d'une pile vide renvoie 0
  • Déplacer des valeurs ici est une opération push
  • Déménagement d'ici - opération pop

Générateur de nombres aléatoires (RNG)

  • Lorsqu'il est appelé, génère un nombre aléatoire de 32 bits
  • Déplacer des valeurs ici semble inutile

Ignorer si zéro (SIZ)
  • Ignore l'instruction suivante si vous y déplacez zéro

Ignorer si non nul (SINZ)
  • Ignore l'instruction suivante si vous y déplacez une valeur différente de zéro

Référence (REF)

  • Utilisé pour indiquer une adresse basée sur une valeur déplacée
  • Les grandes valeurs sont tronquées en nombres de 6 bits.

Déréférencement (DEF)
  • Déréférencement après REF

Registres réservés (RSV)
  • S'installer ici n'a pas d'importance. Le registre contiendra toujours zéro.
  • Peut être utilisé pour n'importe quelle tâche lors du transfert d'une machine virtuelle vers un microcontrôleur ou autre chose
  • Pour les registres futurs / supplémentaires
  • Peut être utilisé pour supprimer un élément de la pile à usage général et des registres opérationnels en déplaçant l'élément ici (non recommandé)
  • Lors de la lecture, renvoie 0

Registres à usage général (GPR0-GPR31)

  • Peut contenir des nombres 32 bits

Registre zéro

  • Peut être utilisé pour supprimer un élément de la pile à usage général et des registres opérationnels en déplaçant cet élément ici
  • Renvoie 0 à la lecture

Registre d'état:

  • 0000 0000 0000 0000 0000 0000 000P ZVNC
  • Contient cinq drapeaux (C, N, V, Z, P)
  • Porter
  • Négatif
  • Débordement
  • Zéro
  • Le registre PLUS affecte les drapeaux C, N, V, Z, P
  • Les registres AND, OR, XOR affectent les drapeaux N, Z, P
  • La dernière opération en cours affectera le registre d'état
  • Déplacer le sens ici semble inutile.

Mais comment fonctionnent les registres PLUS, AND, OR, XOR? Ces quatre registres ont une pile particulière, qui est en fait une pile de calcul. Lorsqu'il y a deux nombres dans la pile de calcul, l'opération démarre.



Voici un exemple pour le registre PLUS. Le schéma fonctionne de manière similaire pour les trois autres registres.

Mais comment effectuer des opérations arithmétiques avec seulement quatre opérateurs? Comme je l'ai dit, l'objectif de ce projet est le divertissement et l'éducation. Par conséquent, vous pouvez synthétiser indépendamment les actions manquantes.

La soustraction se fait en ajoutant avec un code supplémentaire qui représente des nombres négatifs. Un code supplémentaire est formé par l'inversion des bits, c'est-à-dire en poussant au nombre 0xFFFFFFFF (2³²-1) via XOR. Et en ajouter un via le registre PLUS. Cependant, l'assembleur prend en charge les nombres négatifs, il n'est donc pas nécessaire de faire tout cela.

La multiplication n'est que de multiples ajouts.

La division est le nombre de fois qu'un seul numéro est placé dans un nombre. Cela peut être calculé par le compteur de soustractions séquentielles.

Le décalage binaire se fait en multipliant par 2 ou en divisant par 2.

Réfléchissez à la façon de synthétiser d'autres opérations vous-même.

Si vous êtes intéressé, voici le dépôt github de certains programmes d'assembleur que j'ai écrit pour Periwinkle. L'instruction de déplacement fonctionne de gauche à droite:

#50 gpr0 //  50(base-10)  gpr0 gpr0 gpr1 //  gpr0  gpr1 

De plus, je vais essayer de télécharger le fichier exécutable de la machine virtuelle Periwinkle VM. Pour quelle plateforme faire la machine virtuelle? (Windows (x86? X86-64?), Linux (x86? X86-64? ARM?, ARM64?, Etc.?), Etc.?) Puisque l'assembleur est écrit en F #, il peut probablement fonctionner partout , vous n'avez besoin que du framework .NET , vous pouvez jeter un œil à Mono .

Si vous connaissez l' architecture de PIC16 , vous remarquerez peut-être des similitudes avec Pervenche (STATUS, SIZ, SINZ, REF, DEF). En effet, cela m'a inspiré à travailler comme la première architecture avec laquelle j'ai commencé à programmer en langage assembleur.

Source: https://habr.com/ru/post/fr480024/


All Articles