7.2 シンプルなプロセッサー / 非公式訳

pp.408-413

7.2 シンプルなプロセッサー

図7.2に示したのと同じようなディジタルシステムをもう一例、図7.9に示します。4つのnビットレジスタ(R0R3)がトライステートドライバーを介してバスに接続されています。各レジスタへは、nビットのData入力から外部データがロードできます。このData入力は、Extern制御信号で有効、無効の切り換わるトライステートドライバーを介してバスに接続されています。また加算/減算モジュールも備わっています。加算/減算モジュールのデータ入力の一方へは、バスに接続されたnビットレジスタAからデータが与えられます。もう一方のデータ入力Bはバスに直接接続されています。AddSub信号が0の場合は和(A+B)が生成されます。AddSub信号が1の場合は差(A-B)が生成されます。セクション3.3で解説したとおり、引き算を実行する手段として加算/減算モジュールにはXORゲートが必要です。このXORゲートでBの2の補数を生成します。レジスタGには、加算/減算モジュールの出力が格納されます。レジスタAおよびレジスタGは、AinGinGoutの各信号で制御します。

図7.9のシステムは、制御回路の設計次第でさまざまな機能が実行できます。ここでは例として、表7.1に示す4つの操作が実行できる制御回路を設計します。表の左列には、操作名と各オペランドとを示します。右列には、それぞれの操作で実行される機能を示します。Load操作のところに示したRx ← Dataの意味は、外部Data入力のデータがバスを介して任意のレジスタRx (RxR0R3のいずれか)へ転送されるという意味です。Move操作を実行すると、レジスタRyに格納されているデータがレジスタRxにコピーされます。表に示した角括弧([Rx]など)はレジスタの中身であることを表しています。Load操作もMove操作も、バスを介した転送は1回限りであるため、その操作は1ステップ(1クロックサイクル)だけで完了します。Add操作およびSub操作はどちらも3ステップが必要です。第1ステップでは、Rxの中身がバスを介してレジスタAに転送されます。次のステップでは、Ryの中身がバスに乗ります。加算/減算モジュールによって、要求された処理が実行され、その結果がレジスタGに格納されます。最後、第3ステップでGの中身がRxへ転送されます。

表7.1に示したような操作を実行するディジタルシステムは一般に「プロセッサー」と呼ばれます。どの処理をいつ実行するのかは、制御回路への入力Functionによって指示されます。w入力を1にすると目的の操作が開始され、その操作が完了すると制御回路によってDone出力がアサートされます。

図7.9の制御回路はFSMを使って実現できます。しかし別の手段でも実現できることを示すため、カウンターを用いて制御回路を設計します。この回路は、各操作のステップごとに必要な制御信号を生成する必要があります。一番長い操作(AddSub)には3ステップ(3クロックサイクル)が必要であるため、2ビットカウンターで用が足ります。図7.10に、2-4デコーダーに接続した2ビットアップカウンターを示します。デコーダーについては第4章で解説しました。このデコーダーは、イネーブル(En)入力を常時1に設定して常時有効化しておきます。デコーダー出力のそれぞれが、各操作の1ステップに相当します。何の操作も実行されていないときはカウント値は00であり、したがってこのときはデコーダーのT0出力がアサートされます。各操作の第1ステップのときはカウント値が01であり、このときはT1がアサートされます。Add操作およびSub操作の場合は、第2ステップ、第3ステップのときにT2T3がそれぞれアサートされます。

T0T3の各ステップでは、実行する操作に応じてさまざまな制御信号を生成しなければなりません。それぞれの操作は、図7.11を見ると分かるように、Function入力を構成する6ビットで指定されます。左端の2ビットF = f1f0は、目的の操作を指定する2ビット値として用います。ここでは、LoadMoveAddSubのそれぞれを表すのに、f1f0=00、01、10、11というコードをそれぞれ使います。入力Rx1Rx0Rxオペランドを示す2進数であり、Ry1Ry0Ryオペランドを示します。Function入力は、FRin信号がアサートされたときに6ビットのFunctionレジスタに格納されます。

図7.11には、FRxRyの各入力にエンコードされた情報をデコードするのに使われる2-4デコーダーも示しました。少しあとに説明しますが、このデコーダーは便宜上示したにすぎません。各デコーダーの出力は、さまざまな制御信号を入力とする単純な論理式で表現できるからです。

図7.10および図7.11の各回路は制御回路の一部です。入力w、およびT0T3I0I3X0X3Y0Y3の各信号を使って、どうやって制御回路の残りの部分を作り出すのかを示します。ExternDoneAinGinGoutAddSubR0inR3inR0outR3outの各出力を生成しなければなりません。さらに、図7.10および図7.11で使用しているClearおよびFRinの各信号も制御回路で生成する必要があります。

ClearおよびFRinの各信号はどの操作でも共通です。Clear信号は、w=0で何の操作も実行されていないときにカウント値を00のままにしておく手段として使われます。また各操作の終了したときにカウント値をクリアして00にする手段としても使われます。したがってそのための論理式は下のとおりです。

     Clear = !wT0 + Done

FRin信号は、wが1に変化したときにFunction入力の値をFunctionレジスタにロードする手段として使われます。したがってその論理式は下のとおりです。

     FRin = wT0

この2つ以外の制御回路出力は、それぞれの操作で実行される個々の手順によって違ってきます。信号ごとに生成しなければならない値を表7.2に示します。この表の各行は具体的な操作です。各列が1ステップに相当します。Extern信号がアサートされるのは、Load操作の第1ステップのときだけです。したがってExtern信号を実現するための論理式は下のとおりです。

     Extern = I0T1

Done信号はLoadMoveの第1ステップでアサートされるほか、AddSubの第3ステップでもアサートされます。したがってその論理式は下のとおりです。

     Done = (I0+I1)・T1+(I2+I3)・T3

AinGinGoutの各信号はAdd操作およびSub操作のときにアサートされます。AinはステップT1のときに、GinはステップT2のときに、GoutはステップT3のときに、それぞれアサートされます。AddSub信号は、Add操作のときは0に、Sub操作のときは1にセットしなければなりません。従ってAinGinGoutAddSubの各信号は下の論理式で表現されます。

     Ain = (I2+I3)・T1
     Gin = (I2+I3)・T2
     Gout = (I2+I3)・T3
     AddSub = I3

R0inR3inの各値は、X0X3の各信号かY0Y3の各信号かいずれかによって決定されます。この処理は、表7.2ではRin = XまたはRin = Yと記述しています。Rin = Xの意味はR0in = X0R1in = X1 ...ということです。同じくR0outR3outの各値はRout = XまたはRout = Yという形で示しています。

まずR0inおよびR0outの各論理式を表7.2から導き出してから、それ以外のレジスタ制御信号を表現する論理式を導き出しましょう。表7.2を見ると、LoadMoveの各操作の第1ステップのとき、およびAddSubの各操作の第3ステップのときに、R0inX0の値にセットされることが分かります。このことから下の論理式が導かれます。

     R0in = (I0+I1)・T1X0+(I2+I3)・T3X0

同様にR0outは、Move操作の第1ステップのときにY0の値にセットされるほか、AddおよびSubの第1ステップのときにはX0に、AddおよびSubの第2ステップのときにはY0にセットされます。このことから下の論理式が導かれます。

     R0out = I1・T1Y0+(I2+I3)・(T1X0+T2Y0`)

R1inおよびR1outを表す論理式は、X0およびY0のところにX1およびY1が入ることを除けばR0inおよびR0outの論理式と同じです。R2inおよびR2outR3inおよびR3outの論理式も同じように導けます。

図7.10および図7.11に示した回路と、これまでに示した論理式で表現される回路とを組み合わせると、図7.9の制御回路が実現されます。

プロセッサーは、広く使われている大変便利な回路です。ここでは、プロセッサー設計の最も基本的な事柄のみ示します。しかしここに示した方法は、最新のマイクロプロセッサーなど実際のプロセッサーの設計にも応用できます。興味があれば、プロセッサー設計についてもっと詳しく書かれた、コンピューターの作り方に関する書籍を読んでください。