Partie IPartie IIPartie IIIPartie IVPartie VUn
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
11100 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
nombres 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
11101 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
1401110120011300110120000010Afin de calculer
termes de progression arithmétique, il est nécessaire de charger le premier terme dans la cellule 0
, dans la première charge cellulaire, la différence de la progression arithmétique
.
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
fois.
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.