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でシミュレートされません。



All Articles