今回は、今までの論理ゲートやフリップフロップに比べると、ずいぶん馴染み深いメモリを作ってみます。今回もまたシミュレータを使うのですが、さすがに今まで使っていたものでは荷が重いので、参考文献[1]に付いてくる論理回路シミュレータを使っています。デコーダメモリを作ってみる前に、デコーダの動作を見てみます。デコーダは、入力を2進数とみなして、それに対応する出力をONにする回路です。0)ならY2だけがONになる、といった動作をする回路です。下図は、このデコーダを論理ゲートで実現した例です。L)のときはY2だけがHになる、という動作をしていることが分かります。マルチプレクサマルチプレクサは、いくつかのデータ入力の中から、制御入力に従って、出力に出すものを決める回路です。下図に簡単なマルチプレクサの実現例を示します。S2に従って、C1〜C4のどれをYに出力するかが決まります。この動作を見てみると、下図のようになります。L)のときはC2というようになっています。RAMRAM内には大量のデータを保存する場所(セル)があり、デコーダは、アドレスをもとにどのセルにアクセスするかを決めるために用いられます。セル自体は、前回扱ったSRラッチやフリップフロップを用いて実現できます。いくつかのセルの出力から、どれをRAMの出力とするかは、マルチプレクサを用いて決めます。このRAMから読み出されたときだけ出力し、それ以外のときは出力をハイインピーダンスにするために、マルチプレクサの出力を3ステートバッファを通してRAMの出力としています。下図に、今回作成したRAMの回路図を示します。実現は、論理シミュレータで扱える素子数の制約や手間を省くため、デコーダなどを74シリーズから選んでいます。マルチプレクサ(セルの出力を選択)は74153です。これらを含む今回使った素子は、(原理的には)今まで作成してきた回路の組み合わせで実現できるものです。A1)、データ(DI0)、チップセレクト(CS)、Read/Write(RW)があり、出力はデータ(DO0)だけです。CSをHにするとこのRAMが選択されます。CSがLの場合、出力はハイインピーダンスになり、書き込みもできません。CSがHの時、RWをHにするとアドレスで指定したセルの内容をDO0に出力します。RWをLにすると、出力DO0はハイインピーダンスになり、データ入力DI0の内容をアドレスで指定したセルに書き込みます。(クリックすると、拡大図を表示します。)これを実際にシミュレータを使って動かすと、下図のような結果が得られます。この図で、CSは常にH(このRAMが選択されている)です。左から、まず初期状態ではSRフリップフロップの内容が不定なので出力DO0も不定になっています。次にRWをLにすると、DI0の内容(L)が書き込まれます。次にRWをHにすると、書き込んだ内容がDO0に出ています。このとき、DI0をHにしていますが、出力には影響していません。次にアドレスA0をHにして別のセルを選択すると、RWがHなのでセルの内容を読み出そうとしますが、これも不定です。Hを書き込んで読み出すと正しく書けていることが分かります。A0をLに戻すと、はじめに書いたセルの内容Lが読み出せます。以後、A1をHにして同様の操作を行っています。このように、アドレスを指定して書き込んだ内容を、後でそのまま読み出せることが分かり、RAMとして動作することが確認できました。今回は論理回路シミュレータを使って2ビット×4のRAMを作るつもりだったのですが、扱える素子数の上限に達してしまい、残念ながらこの大きさであきらめました。