RAMマシン


パートI
パートII
パートIII
パートIV
パートv


RAMマシンに関する記事はすでにHabréで公開されています。
一般的に、 RAMマシン に関する記事はウィキペディアにあります。

本「Computation and Analysis of Computational Algorithms」の著者:Aho、Hopcroft、Ulmanに記載されているRAMマシンには、限られた数の算術命令セット(加算、減算、乗算、除算)、無条件ジャンプコマンド、2つの条件付きジャンプコマンドがあります。 私たちの場合、算術チームからは、 加算減算のみがあり、分岐(遷移)コマンドは本で与えられたコマンドと同一です。

LIttle Man Computer (サイクルの前の部分で説明した)とRAMマシンの違いは、間接アドレッシング(メモリに格納された数値をアドレスとして使用する機能)を提供するメカニズムです。

メモリに保存されている番号をアドレスとして使用するために、 MUXマルチプレクサをデータメモリのアドレス入力接続し、アドレス自体( コマンドメモリから来る)とアドレスを表しデータメモリに保存されている番号を選択します。



新しいコマンドがCommand Memoryからフェッチされるたびに、メモリからレジスタに数値をロードします。 MUXマルチプレクサを切り替えると、アドレスレジスタに記録されたアドレスに移動します。



また、コマンドアドレスを数値としてAccバッテリーにロードします。このため、バッテリーAssにロードするデータを選択するマルチプレクサーのアドレス入力のビット深度を増やします。 アドレスは、マルチプレクサの4番目の入力にロードされます。



コマンドの処理は2つの方法で実行されます。 これを行うには、2つのDフリップフロップをクロックに接続します。これにより、クロック信号が到着したときに相互に切り替わります。



1サイクル目はアドレスをアドレスレジスタにロードし、2サイクル目は数値をAccアキュムレータまたはデータメモリにロードします

2つのフラグをバッテリーに接続します。

1.フラグAcc = 0Assの内容がゼロの場合、フラグが立てられます。

2.フラグAcc> 0Assの内容がゼロより大きい場合、フラグが立てられます。


結果はそのようなスキームであり、ここからダウンロードできます。



回路がバギーにならないように、バッテリイネーブル入力へのラインが必要です。

いくつかのコマンドをオフにし、ゼロセルに格納されているアドレスでデータメモリのゼロセルをロードするプログラムを作成します。 サイクルでは、ゼロセルの値を1つ増やします。 T.O. データメモリにシリアル番号を入力します。

Accの 1401のロード番号1
1100は、 Accの数値をゼロセルの数値に加算します
2000は結果をゼロセルに保存します
2080は、 ゼロセルによって参照されるアドレスのAccから数値をロードします
0010プログラムの先頭にジャンプ




要約するプログラムを作成します n自然数。
1番目のセルに自然数を、0番目のセルにそれらの合計を書き込みます。
最初に、最初のセルに自然数をロードするプログラムを作成します
Accの 1401のロード番号1
1101は、 Accの数値を最初のセルの数値に追加します
2001結果を最初のセルに保存します

0番目のセルでは、合計を実行します。 1番目のセルの数値を増やした後、この数値を0番目のセルに追加する必要があります。
セル0からのAccの 1300ロード
1101は、 Accの数値を最初のセルの数値に追加します
2000は0番目のセルに結果を保存します
0010プログラムの先頭にジャンプ

プログラムの全文
1401
1101
2001
1300
1101
2000年
0010

計算するために n等差数列の項では、最初の項を0番目のセルにロードする必要があります a0、最初のセルに算術進行の差をロードします d
次に、要約する必要があります。
セル0から番号にAccで 1300ロード
1101は、 Accの数値を最初のセルの数値に追加します
2000は0番目のセルに結果を保存します
次に、3つのチームに戻って、この一連の操作を繰り返す必要があります n回。


クラシックRAMマシンのエミュレーター(個別の読み取り/書き込みテープ付き)は、ここからダウンロードできます



2つのdトリガーで構成される回路の動作を確認しましょう。 この回路は2クロックモードを提供します。
通常のdトリガーの図を作成してみましょう(リセットおよび有効化なし)。 データポートとクロックポートの2つの入力ポートがあります。
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 


LEDは、dトリガーのステータスを示します。
2つのdffを一般的な回路に接続します。
最初のdトリガーのステータスは、 q1_led LEDによって示されます。
2番目のdトリガーのステータスは、 q2_led LEDによって示されます。
クロック信号を別のq3_led LEDに出力します。

 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 

dff_dffモジュールのRTLモデルは次のようになります

このスキームはすべてのボードで機能するわけではありません;一部のボードでは、d-フリップフロップを初期化する必要があります。 同じ理由で、そのようなスキームはModelSimでシミュレートされません。

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


All Articles