シリーズ「コンピュータの記憶のしくみ」 第8回

回路が「場所を指す」とは?

出口が、4 つある

前回の最後に、こう書いた。 欲しいのは、「どこから読むか」「どこへ書くか」を選ぶ仕組みだ。

今回は、それを作る。

まず、覚えておきたいものを用意しよう。 第1回からずっと出てきた、自動販売機である。

自動販売機は、並んでいる商品の値段を覚えている。 ここでは商品を 4 つにして、値段を 4 つのレジスタに入れておく。 第6回と同じく、1 の位を「10 円」と読む名札を貼る。

商品値段レジスタの中身
お茶120 円1100
水100 円1010
コーヒー130 円1101
スポーツドリンク150 円1111

この値段は、シミュレータが直接書き込んでおいた。 書き込む仕組みは、このあと作る。

さて、ボタンが押されたら、その商品の値段を 1 つだけ取り出したい。 ところが、ここで困る。

第5回で見たとおり、読み出しに合図は要らない。 覚えている値は、いつでも出力の線に出つづけている。 4 つのレジスタがあれば、4 つの値が同時に出ている。4 桁ずつで、線は 16 本だ。 値段を見せる窓は 1 つしかないのに、出口が 4 つある。

書くほうも困る。 第5回では、クロックの線を 4 つのフリップフロップに配った。 同じように 4 つのレジスタにクロックを配れば、書き込みの合図で 4 つ全部 が書き換わってしまう。 コーヒーだけ値上げしたいのに、お茶も水も同じ値段になる。

選んだ 1 つだけを読み、選んだ 1 つだけに書きたい。 今回は、まず読むほうから考えよう。

通すか、0 にするか

4 つの出口を、1 つにまとめたい。

ただ線をつなぐだけでは、4 つの値が混ざってしまう。 そこで、選ばなかった 3 つを 0000 にしてしまう。

選んだ値はそのまま通し、選ばなかった値は 0000 にする。 これは前回、掛け算の回路でやったことと同じだ。 見る桁が 1 なら被乗数をそのまま、0 なら 0000 を出す。AND だった。 今回は、見る桁の代わりに「選ぶ」線を AND に入れる。

そのあとで、4 つを OR で合流させる。 選ばなかった 3 つは、どれも 0000 だ。 0000 は、OR で合流させても何も変えない。 選んだ 1 つの値だけが、そのまま出口に出てくる。

選ぶ箱 シミュレータ

左の「選ぶ」を 1 にした番地の値だけが、右下の合流から出てきます

0 番地1100 = 12AND1 番地1010 = 10AND2 番地1101 = 13AND3 番地1111 = 15AND合流(OR)1100 = 12読み出し選ぶ1選ぶ0選ぶ0選ぶ0

太い線は 4 桁の束(どれか 1 桁でも 1 なら緑)。青い箱が、選ばれている番地

読み出し1100= 12(120 円)

0 番地(お茶)だけが AND を通った。ほかの 3 つは 0000 になり、合流しても何も足さない

番地商品中身値段
0(00)お茶1100120 円
1(01)水1010100 円
2(10)コーヒー1101130 円
3(11)スポーツドリンク1111150 円

いまは 0 番地、お茶だけを選んである。 合流から出てくるのは 1100、120 円だ。

左の「選ぶ」を切り替えて、ほかの商品も読んでみてほしい。 太い線は、4 桁の束をまとめて 1 本に描いたものだ。 選んでいない番地の AND から出る束は、0000 なので灰色のままになっている。

この発想には、見覚えがある。 第6回で、自動販売機が勝手にお金を増やしてしまったとき、足すのをやめさせた方法だ。

0 を足せばいい。

あのときは、加算器は止めずに、足す数のほうを 0 にした。 今回も、選ばなかった値を消したわけではない。 回路は 4 つとも合流させている。そのうち 3 つを 0 にしただけだ。 0 は足しても、OR で合流させても、相手を変えない。

では、選ぶスイッチを 2 つ 1 にしたら、どうなるか。 お茶と水を同時に選んでみてほしい。

出てくるのは 1110。140 円だ。 1100 と 1010 が、合流で混ざった。 140 円の商品は、どこにもない。

この仕組みは、「ちょうど 1 つだけ選ぶ」ことが前提になっている。 2 つ選べば混ざり、1 つも選ばなければ 0000 が出る。

こうして、たくさんの入力から 1 つを選んで出口に通す回路を、マルチプレクサという。 たくさんの線を 1 本にまとめるもの、というくらいの意味だ。

4 本で選ぶのを、やめる

選ぶスイッチは 4 本あった。 「ちょうど 1 本だけ 1」にするのは、押す人の注意しだいだった。

それに、商品が 8 つになれば 8 本、100 あれば 100 本の選ぶ線が要る。

ここで、番地に番号を振っていたことを思い出してほしい。 0 番地から 3 番地まで。0〜3 の数は、2 進数なら 2 桁で書ける。 00、01、10、11 だ。

番号を 2 本の線で渡して、そこから 4 本の選ぶ線を作ればいい。

作り方はこうだ。 0 番地の選ぶ線は、番号が 00 のときだけ 1 になればいい。 つまり「2 の位が 0 で、しかも 1 の位が 0」。NOT と AND で作れる。 ほかの番地も同じだ。

番号1 になる線作り方
000 番地(NOT 2 の位) AND (NOT 1 の位)
011 番地(NOT 2 の位) AND 1 の位
102 番地2 の位 AND (NOT 1 の位)
113 番地2 の位 AND 1 の位

どの番号も、4 行のうちちょうど 1 行にだけ当てはまる。 だから、選ぶ線はいつも 1 本だけ 1 になる。 2 つ選んで混ざることは、もう起きない。

アドレス シミュレータ

左上の 2 つのスイッチが番号(アドレス)。デコーダが、同じ番号の線だけを 1 にします

デコーダ000110110 番地1100 = 12AND1 番地1010 = 10AND2 番地1101 = 13AND3 番地1111 = 15AND合流(OR)1100 = 12アドレス読み出し2 の位01 の位0

デコーダの右の 00〜11 は、その線が 1 になる番号

読み出し1100= 12(120 円)

番号は 00。デコーダは 00 の線だけを 1 にした。読み出しは 0 番地(お茶)の 120 円

番地商品中身値段
0(00)お茶1100120 円
1(01)水1010100 円
2(10)コーヒー1101130 円
3(11)スポーツドリンク1111150 円

左上の 2 つのスイッチが、番号だ。 「1 の位」を 1 にすると 01。左の箱から出る線のうち、01 と書いた線だけが緑になり、水の 100 円が出てくる。 4 通り、全部試してみてほしい。

左の箱は、NOT 2 個と AND 4 個を、表のとおりに組んだものだ。 2 桁に詰めた番号を、4 本の線にほどき直している。 これをデコーダという。デコードは「符号をほどく」という意味だ。

そして、場所を指すこの番号のことを、アドレスという。 日本語では番地とも呼ぶ。住所の番地と同じ言葉だ。

同じ線で、書く

次は、書くほうだ。

デコーダから出る 4 本の線は、どの番地を指しているかを表している。 この線を、書き込みにも使えばいい。

書き込みの合図を、4 つのレジスタに直接は配らない。 番地ごとに、合図と選ぶ線を AND に通してから配る。 合図が届くのは、選ぶ線が 1 の番地、つまりアドレスが指している番地だけになる。

書き込み シミュレータ

選ぶ線と「書き込み」の AND が、指している番地のクロックにだけ合図を届けます

デコーダ00011011書く値1011 = 11AND0 番地1100 = 12ANDAND1 番地1010 = 10ANDAND2 番地1101 = 13ANDAND3 番地1111 = 15AND合流(OR)1100 = 12アドレス読み出し2 の位01 の位0書き込み0

書く値は 4 つの番地すべてに届いている。合図が届くのは、選ぶ線が 1 の番地だけ

読み出し1100= 12(120 円)

アドレスで番地を選び、書く値を選んで「書き込む」を押してください

番地商品中身値段
0(00)お茶1100120 円
1(01)水1010100 円
2(10)コーヒー1101130 円
3(11)スポーツドリンク1111150 円
書く値

図の「書き込み」の丸を押すと、1 にしたままにできる(もう一度押すと 0 に落ちる)

右上の「書く値」の束は、4 つの番地すべてに届いている。 けれど、それだけでは何も起きない。 第5回で見たとおり、値 D をどう変えても、合図が来なければフリップフロップは受け取らない。

アドレスを 10 にして、書く値を 140 円にしてから、「書き込む」を押してほしい。

コーヒーだけが 140 円になった。

お茶も水もスポーツドリンクも、合図を受け取っていないので、元の値段のままだ。 ほかの番地にも、いろいろ書き込んでみてほしい。

第5回では、クロックを 4 つに配った。4 つが同じ瞬間に書き込むためだった。 今回は、配る先を選んでいる。

図を見ると、左のデコーダから、行ごとに 1 本ずつ線が横に走っている。 その 1 本が、左の「書き込みの AND」にも、右の「通す AND」にも、下から入っている。 読むときも書くときも、同じ 1 本の線が、その行を選んでいる。

こうして、番号で指した場所に読み書きできるようにした回路を、メモリという。 1 つの番地に置く 4 桁ひとまとまりを、語(ワード)といい、行ごとに走る選ぶ線を語の線という。 本物のメモリの中にも、行ごとに 1 本ずつ、語の線が走っている。

ひとつ、気になった人がいるかもしれない。 第6回では、クロックについて「1 本しかない線を止めるわけにはいかない」と書いて、0 を足すほうを選んだ。

今回も、本線は止めていない。合図は流れつづけていて、その枝を語の線で選んでいるだけだ。 ただ、枝を選ぶことには、落とし穴がある。それは、このあと見る。

入口を、選ぶ

その前に、置いてきた宿題を 2 つ片づけておきたい。

第6回の最後に、アキュムレータの入口が加算器でふさがっていて、覚えている数を取り替えられない、と書いた。 前回は、シフトレジスタの入口が隣の桁でふさがっていて、最初の 4 桁を一度に入れられない、と書いた。 どちらも、「入口の手前で、どちらを通すかを選べればいい」で止めてあった。

これは、今回作った選ぶ箱そのものだ。

選ぶ相手が 2 つなら、番号は 0 と 1 の 2 通り。アドレスは 1 本で足りる。 デコーダも、NOT が 1 個あれば 2 本の選ぶ線になる。

  • アキュムレータ … 番号 0 なら加算器の答えを、1 なら外から来た新しい数を、入口に通す。
  • シフトレジスタ … 番号 0 なら隣の桁の値を、1 なら外から来た 4 桁を、各桁の入口に通す。一度に入れられる。

前回、2 倍と半分を見せるために、つなぐ向きの違うシフトレジスタを 2 つ並べた。 これも、番号 0 なら右隣、1 なら左隣を通すようにすれば、1 つで左右どちらへもずらせる。

「選ぶ」は、読み出しの出口にも、書き込みの合図にも、レジスタの入口にも使える。 そしてどれも、AND と OR と NOT でできている。 「どれかを選ぶ」ことも、計算だったのだ。

番号も、2 進数にすぎない

アドレスの線を増やすと、指せる番地はどう増えるか。

アドレスの本数番地の数
1 本2
2 本4
3 本8
8 本256
16 本65,536
32 本4,294,967,296(約 43 億)

1 本増えるたびに、2 倍になる。 n 桁の 2 進数で書ける数が 2n 通りあるのと、まったく同じ話だ。 アドレスの線は、2 進数の桁そのものだからである。

デコーダの作り方も変わらない。 番号のパターンと一致するときだけ 1 になる AND を、番地の数だけ並べればいい。

コインロッカーを思い浮かべてほしい。 扉に番号が書いてあり、番号さえ分かれば、どの扉にもまっすぐ行ける。 端から順に扉を開けていく必要はない。

扉が 1 つだけ開いているコインロッカー

番号が分かれば、まっすぐ行ける

前回のシフトレジスタは、そうではなかった。 10 個先の値が欲しければ、10 回クロックを入れて、手元まで流れてくるのを待つしかなかった。 カセットテープの頭出しだ。

メモリは違う。 0 番地でも 3 番地でも、43 億番地でも、アドレスを置いてデコーダを 1 回通れば、その場所が選ばれる。 どこを読むにも、同じ手間しかかからない。

好きな順番で、どこからでも取り出せること。これをランダムアクセスという。 コンピュータのメモリを RAM と呼ぶのは、Random Access Memory の頭文字である。

カセットテープと違って、レコードは、針を落とす場所を選べば、どの曲からでも聴ける。 メモリは、レコードの側にいる。

レコードに針を落とす手元

どの曲にも、針を落とせる

ここで、アドレスそのものを、もう一度見てほしい。

アドレスは、特別な線ではない。 01 は、ただの 2 桁の 2 進数だ。 それを「1 番地」と読んでいるのは、計算シリーズの第4回から何度も言ってきた、名札のほうである。 回路にとっては、足し算の入力と何も変わらない、0 と 1 の並びにすぎない。

場所を指す番号は、特別なものではなかった。また 2 桁の 2 進数にすぎない。

番号が、切り替わる瞬間

アドレスが、ただの 2 進数のパターンだということ。 それは、いいことばかりではない。

第5回で、0111(7)を 1000(8)に書き換えたとき、途中で 1111(15)が外に出た。 4 つの桁が、同じ瞬間には切り替わらなかったからだ。

アドレスも、2 本の線のパターンである。 同じことが、起きないだろうか。

切り替わり シミュレータ

左下の「書き込み」の丸を押すと、1 にしたままにできます(もう一度押すと 0 に落ちて書き込まれる)

デコーダ00011011書く値1011 = 11AND0 番地1100 = 12ANDAND1 番地1011 = 11ANDAND2 番地1101 = 13ANDAND3 番地1111 = 15AND合流(OR)1011 = 11アドレス読み出し2 の位01 の位1書き込み0

2 の位の線は、デコーダの中で少し遅れて届く(そのまま通すゲート 3 個ぶん)

読み出し1011= 11(110 円)

いまのアドレスは 01。書き込みの丸を押して 1 にしたまま、アドレスを 10 に変えてから 0 に落としてみてください

番地商品中身値段
0(00)お茶1100120 円
1(01)水1011110 円
2(10)コーヒー1101130 円
3(11)スポーツドリンク1111150 円
書く値

図の「書き込み」の丸を押すと、1 にしたままにできる(もう一度押すと 0 に落ちる)

このシミュレータでは、水をもう 110 円に値上げしてある。アドレスは 01、書く値は 110 円のままだ。 続けて、コーヒーも 110 円にしたい。

今度は、左下の「書き込み」の丸を押して、合図を 1 にしたままにしてほしい。 そのまま、アドレスを 10 に変える。 最後に、もう一度丸を押して、合図を 0 に落とす。

アドレスを 01 から 10 にするには、スイッチを 2 つとも押しかえることになる。 けれど、2 つのスイッチを同時に押すことはできない。

「2 の位」から押せば、アドレスは一瞬 11 になる。 「1 の位」から押せば、一瞬 00 になる。

どちらから押しても、コーヒーのほかに、もう 1 つの商品まで 110 円になる。

2 の位から押せば、スポーツドリンクが 150 円から 110 円に。 1 の位から押せば、お茶が 120 円から 110 円に。 アドレスが通りすぎた番地に、書き込みの合図が届いてしまったのだ。

それなら、2 本を同時に切り替えればいいのだろうか。 リセットしてから合図を 1 にして、「2 本を一度に切り替える」を押してみてほしい。

このシミュレータでは、2 の位の線が、デコーダに少し遅れて届くようにしてある。 第5回で見たとおり、線の長さや通る部品の数は、線ごとに違う。同じ瞬間には届かない。

1 ステップごとに、どの番地を指していたかが下に出る。 01 のあと、しばらく 00 を指している。 合図を 0 に落とすと、やはりお茶が 110 円になる。

同じことを、合図を 0 にしたまま試してほしい。 アドレスが途中で 00 を通っても、何も壊れない。

読むだけなら、途中で一瞬、お茶の値段が出口に出るだけで済む。 第5回の 15 と同じで、見る側が落ち着くまで待てばいい。

けれど、書いているときなら、指していないはずの場所を壊す。

さっき、「枝を選ぶことには、落とし穴がある」と書いた。これがそれだ。 合図の本線を止めずに、枝を語の線で選んでいる。 その語の線が一瞬でも揺れれば、揺れた先の枝にも合図が流れこむ。

落ち着いてから、書く

では、どうすればいいか。

答えは、第5回・第6回と同じところにある。 アドレスが落ち着くまで、書き込みの合図を入れなければいい。

  1. アドレスを変えるのは、書き込みの合図が 0 のあいだだけにする。
  2. アドレスが落ち着いてから、合図を 1 にして、0 に落とす。

さきほどのシミュレータで、この順番を守ってみてほしい。 合図が 0 のあいだなら、スイッチを 1 本ずつ押しても、2 本を一度に切り替えても、何も壊れない。 アドレスが 10 になってから合図を入れれば、コーヒーだけが 110 円になる。

第4回で、閘門のたとえを出した。 2 つの扉を、同時には開けない。前の扉が閉じてから、後ろの扉を開ける。 フリップフロップは、そうやって「受け取る」と「変わる」を、クロックの 1 と 0 に分けていた。

ここでも同じことをしている。 「アドレスを変える」扉と、「書き込む」扉を、同時には開けない。

本物の回路では、これを人の注意ではなく、クロックで守る。 書き込みの合図をクロックと AND して、クロックが 1 のあいだにしか出ないようにする。 アドレスのほうは、クロックが落ちたときにだけ変わるレジスタから出す。 そうすれば、アドレスが揺れるのはいつも、合図の出ていないあいだになる。

第4回のクロックが、ここでもう一度効いている。

番号を、数える

最後に、もう一度アドレスを見てほしい。

アドレスは、ただの 2 進数だった。 ということは、番号そのものを、計算できる。

第6回のカウンタは、クロックが来るたびに 1 ずつ増える 2 進数を出していた。 その出口を、アドレスにつないでみよう。

順に読む シミュレータ

アドレスを、第6回のカウンタ(2 桁)につなぎました。クロックを入れるたびに番号が 1 増えます

デコーダ00011011カウンタ00 = 00 番地1100 = 12AND1 番地1010 = 10AND2 番地1101 = 13AND3 番地1111 = 15AND合流(OR)1100 = 12読み出しクロック0

カウンタは 11 の次に 00 へ戻る(3 桁目は戻る先がない)

読み出し1100= 12(120 円)

番号は 00。0 番地(お茶)の 120 円が読み出されている

「クロックを入れる」を押すたびに、番号が 00、01、10、11 と進む。 そのたびに、お茶、水、コーヒー、スポーツドリンクと、次の番地の値段が読み出される。 11 の次は 00 に戻り、またお茶から。

前回のテープと同じように、置いた値を順番にたどれるようになった。 しかも今度は、番号を足す数を変えれば、1 つ飛ばしにも、好きな場所からにもできる。 テープと違って、戻るのも自由だ。

さて、ここまでで、自動販売機はずいぶんいろいろなことを覚えられるようになった。 入れた金額を足して覚える。商品ごとの値段を、番地を指して読み書きする。

けれど、まだ足りないものがある。

自動販売機が覚えていなければならないのは、金額や値段だけではない。 いまお金を受け付けている段階なのか。ジュースを出している段階なのか。おつりを返している段階なのか。

いま自分がどの段階にいるのかを、誰も覚えていない。

次回は、それを覚えさせてみよう。 記憶のしくみの、最終回である。

参考文献

シリーズ「コンピュータの記憶のしくみ」