Teil I.Teil IITeil IIITeil ivTeil vEin
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
11100 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
natü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
11101 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
1401110120011300110120000010Um zu berechnen
Für die arithmetische Progression muss der erste Term in die 0. Zelle geladen werden
in der ersten Zellenlast die Differenz der arithmetischen Progression
.
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
mal.
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.