RAM-Maschine


Teil I.
Teil II
Teil III
Teil iv
Teil v


Ein Artikel über die RAM-Maschine wurde bereits auf Habré veröffentlicht.
Im Allgemeinen ist ein Artikel über eine RAM-Maschine auf Wikipedia.

Die RAM-Maschine , die im Buch "Compilation and Analysis of Computational Algorithms" erwähnt wird: Aho, Hopcroft, Ulman - verfügt über einen begrenzten Satz arithmetischer Anweisungen (Addition, Subtraktion, Multiplikation, Division), einen bedingungslosen Sprungbefehl und zwei bedingte Sprungbefehle. In unserem Fall gibt es bei arithmetischen Teams nur Addition und Subtraktion . Die Verzweigungsbefehle (Übergangsbefehle) sind mit den im Buch angegebenen Befehlen identisch.

Der Unterschied zwischen LIttle Man Computer (den ich in den vorherigen Abschnitten des Zyklus beschrieben habe) und der RAM-Maschine ist der Mechanismus, der eine indirekte Adressierung ermöglicht (die Fähigkeit, mit einer im Speicher als Adresse gespeicherten Nummer zu arbeiten).

Um mit der im Speicher als Adresse gespeicherten Nummer zu arbeiten, verbinden Sie einen MUX-Multiplexer mit dem Adresseingang des Datenspeichers , der zwischen der Adresse selbst (aus dem Befehlsspeicher ) und der Nummer, die die Adresse darstellt und im Datenspeicher gespeichert ist, auswählt.



Wir werden jedes Mal eine Nummer aus dem Speicher in das Register laden, wenn ein neuer Befehl aus dem Befehlsspeicher abgerufen wird. Wenn Sie den MUX-Multiplexer umschalten , wird er an die im Adressregister aufgezeichnete Adresse weitergeleitet.



Wir laden auch das Laden der Befehlsadresse als Zahl in den Acc- Akkumulator. Dazu erhöhen wir die Bittiefe des Adresseingangs des Multiplexers, der die Daten auswählt, die in die Ass- Batterie geladen werden sollen. Die Adresse wird am 4. Eingang des Multiplexers geladen.



Die Verarbeitung des Befehls erfolgt in zwei Schritten. Verbinden Sie dazu zwei D-Flip-Flops mit der Uhr, die sich gegenseitig umschalten, wenn ein Taktsignal eintrifft.



Der 1. Zyklus lädt die Adresse in das Adressregister, der 2. Zyklus lädt die Nummer in den Akkumulator oder in den Datenspeicher .

Verbinden Sie 2 Flaggen mit der Batterie:

1. Flag Acc = 0 . Das Flag wird gehisst, wenn der Inhalt von Ass Null ist.

2. Markieren Sie Acc> 0 . Das Flag wird gesetzt, wenn der Inhalt von Ass größer als Null ist.


Das Ergebnis ist ein solches Schema, das hier heruntergeladen werden kann.



Die Leitung zum zulässigen Eingang der Batterie wird benötigt, damit die Schaltung nicht fehlerhaft ist.

Wir schalten einige Befehle aus und schreiben ein Programm, das die Nullzelle des Datenspeichers an die in der Nullzelle gespeicherte Adresse lädt. Im Zyklus erhöhen wir den Wert der Nullzelle um eins. T.O. Wir werden den Datenspeicher mit Seriennummern füllen.

1401 laden in Acc die Nummer 1
1100 addieren Sie die Nummer in Acc zur Nummer in der Nullzelle
2000 Speichern Sie das Ergebnis in der Nullzelle
2080 Laden Sie die Nummer von Acc an die Adresse, auf die die Nullzelle verweist
0010 zum Programmanfang springen




Wir werden ein zusammenfassendes Programm schreiben nnatürliche Zahlen.
Wir werden natürliche Zahlen in die 1. Zelle und ihre Summe in die 0. Zelle schreiben.
Schreiben Sie zunächst ein Programm, das natürliche Zahlen in die erste Zelle lädt
1401 laden in Acc die Nummer 1
1101 addiere die Nummer in Acc zur Nummer in der 1. Zelle
2001 Speichern Sie das Ergebnis in der 1. Zelle

In der 0. Zelle führen wir die Summierung durch. Nachdem Sie die Zahl in der 1. Zelle erhöht haben, müssen Sie diese Zahl zur 0. Zelle hinzufügen.
1300 lade in Acc die Nummer aus Zelle 0
1101 addiere die Nummer in Acc zur Nummer in der 1. Zelle
2000 Speichern Sie das Ergebnis in der 0. Zelle
0010 zum Programmanfang springen

Volltext des Programms
1401
1101
2001
1300
1101
2000
0010

Um zu berechnen nFür die arithmetische Progression muss der erste Term in die 0. Zelle geladen werden a0in der ersten Zellenlast die Differenz der arithmetischen Progression d.
Als nächstes müssen Sie zusammenfassen:
1300 lade in Acc die Nummer aus Zelle 0
1101 addiere die Nummer in Acc zur Nummer in der 1. Zelle
2000 Speichern Sie das Ergebnis in der 0. Zelle
Als nächstes müssen Sie 3 Teams zurückspringen und diese Operationen wiederholen nmal.


Der Emulator einer klassischen RAM-Maschine (mit separaten Lese- / Schreibbändern) kann hier heruntergeladen werden .



Lassen Sie uns überprüfen, wie die aus zwei D-Triggern bestehende Schaltung funktioniert. Diese Schaltung bietet einen Zwei-Takt-Modus.
Schreiben wir das Schema eines regulären D-Triggers (ohne Zurücksetzen und Aktivieren). Es wird zwei Eingangsports haben - einen Datenport und einen Clock-Port.
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 


Die LED-LED zeigt den Status des D-Triggers an.
Wir verbinden zwei dffs mit dem gemeinsamen Stromkreis.
Der Status des ersten D-Triggers wird durch die LED q1_led angezeigt.
Der Status des zweiten D-Triggers wird durch die LED q2_led angezeigt.
Wir geben das Taktsignal an eine separate q3_led LED aus.

 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 

Das RTL-Modell des Moduls dff_dff sieht folgendermaßen aus

Diese Schaltung funktioniert nicht auf allen Karten, auf einigen Karten müssen D-Flip-Flops initialisiert werden. Aus dem gleichen Grund wird ein solches Schema in ModelSim nicht simuliert.

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


All Articles