Machine RAM


Partie I
Partie II
Partie III
Partie IV
Partie V


Un article sur la machine RAM a déjà été publié sur Habré.
En général, un article sur une machine RAM est sur Wikipedia.

La machine RAM , mentionnée dans le livre "Compilation and Analysis of Computational Algorithms" auteurs: Aho, Hopcroft, Ulman - possède un ensemble limité d'instructions arithmétiques (addition, soustraction, multiplication, division), une commande de saut inconditionnelle, deux commandes de saut conditionnel. Dans notre cas, à partir d'équipes arithmétiques, il n'y aura que l' addition et la soustraction , les commandes de branchement (transition) seront identiques aux commandes données dans le livre.

La différence entre LIttle Man Computer (que j'ai décrit dans les parties précédentes du cycle) de la machine RAM est le mécanisme qui fournit l'adressage indirect (la capacité de travailler avec un numéro stocké en mémoire comme adresse).

Afin de travailler avec le numéro stocké dans la mémoire en tant qu'adresse, connectez à l'entrée d'adresse de la mémoire de données un multiplexeur MUX qui sélectionne entre l'adresse elle-même (provenant de la mémoire de commande ) et le numéro représentant l'adresse et stocké dans la mémoire de données .



Nous chargerons un numéro de la mémoire dans le registre chaque fois qu'une nouvelle commande est extraite de la mémoire de commande . Lorsque vous changez de multiplexeur MUX, il passe à l'adresse enregistrée dans le registre d'adresses.



Nous chargerons également la charge de l'adresse de commande dans l'accumulateur Acc sous la forme d'un nombre, pour cela, nous augmenterons la profondeur de bits de l'entrée d'adresse du multiplexeur qui sélectionne les données à charger dans la batterie Ass . L'adresse est chargée sur la 4ème entrée du multiplexeur.



Le traitement de la commande se fera en deux étapes. Pour ce faire, connectez deux bascules D à l'horloge, qui se commuteront lorsqu'un signal d'horloge arrivera.



Le 1er cycle charge l'adresse dans le registre d'adresses, le 2ème cycle charge le numéro dans l'accumulateur Acc ou dans la mémoire de données .

Connectez 2 drapeaux à la batterie:

1. Indicateur d' acc. = 0 . Le drapeau est levé si le contenu de Ass est nul.

2. Indicateur Acc> 0 . Le drapeau est levé si le contenu de Ass est supérieur à zéro.


Le résultat est un tel schéma, qui peut être téléchargé à partir d'ici.



La ligne allant à l'entrée permissive de la batterie est nécessaire pour que le circuit ne soit pas buggé.

Nous désactivons certaines commandes et écrivons un programme qui charge la cellule zéro de la mémoire de données à l'adresse stockée dans la cellule zéro. Dans le cycle, nous augmenterons la valeur de la cellule zéro d'une unité. T.O. nous remplirons la mémoire de données avec des numéros de série.

1401 charge dans Acc le numéro 1
1100 ajouter le nombre en Acc au nombre dans la cellule zéro
2000 enregistrer le résultat dans la cellule zéro
2080 charger le numéro depuis Acc à l'adresse référencée par la cellule zéro
0010 saut au début du programme




Nous écrirons un programme résumant nnombres naturels.
Nous écrirons les nombres naturels dans la 1ère cellule et leur somme dans la 0ème cellule.
Tout d'abord, écrivez un programme qui charge les nombres naturels dans la première cellule
1401 charge dans Acc le numéro 1
1101 ajouter le nombre dans Acc au nombre dans la 1ère cellule
2001 enregistrer le résultat dans la 1ère cellule

Dans la cellule 0, nous effectuerons la sommation. Après avoir augmenté le nombre dans la 1ère cellule, vous devez ajouter ce nombre à la 0e cellule.
1300 charge en Acc le nombre de la cellule 0
1101 ajouter le nombre dans Acc au nombre dans la 1ère cellule
2000 enregistrer le résultat dans la 0e cellule
0010 saut au début du programme

Texte intégral du programme
1401
1101
2001
1300
1101
2000
0010

Afin de calculer ntermes de progression arithmétique, il est nécessaire de charger le premier terme dans la cellule 0 a0, dans la première charge cellulaire, la différence de la progression arithmétique d.
Ensuite, vous devez résumer:
1300 charge en Acc le nombre de la cellule 0
1101 ajouter le nombre dans Acc au nombre dans la 1ère cellule
2000 enregistrer le résultat dans la 0e cellule
Ensuite, vous devez reculer de 3 équipes et répéter cet ensemble d'opérations nfois.


L'émulateur d'une machine RAM classique (avec des bandes de lecture / écriture séparées) peut être téléchargé à partir d'ici .



Vérifions le fonctionnement du circuit composé de deux d-triggers. Ce circuit offre un mode à deux horloges.
Écrivons le schéma d'un d-trigger normal (sans reset et enable). Il aura deux ports d'entrée - un port de données et un port d'horloge.
module dff ( input [1:0] key, output led ); wire clk; assign clk = key [0]; //   wire d = key [1]; //   reg q; always @(posedge clk) q <= d; assign led = q; endmodule 


La LED led indique l'état du d-trigger.
Nous connectons deux dff au circuit commun.
L'état du premier d-trigger sera indiqué par la LED q1_led .
L'état du deuxième d-trigger sera indiqué par la LED q2_led .
Nous émettons le signal d'horloge sur une LED q3_led séparée.

 module dff_dff ( input clk, output q1_led, q2_led,q3_led ); assign q3_led = clk; wire d1_in; assign d1_in=~q2_led; dff dff1( .clk(clk), .d(d1_in), .q(q1_led) ); wire d2; assign d2=q1_led; dff dff2( .clk(clk), .d(d2), .q(q2_led) ); endmodule 

Le modèle RTL du module dff_dff ressemble à ceci

Ce circuit ne fonctionnera pas sur toutes les cartes; sur certaines cartes, il est nécessaire d'initialiser des d-flip-flops. Pour la même raison, un tel schéma ne sera pas simulé dans ModelSim.

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


All Articles