シリーズ「コンピュータの記憶のしくみ」 第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 にした番地の値だけが、右下の合流から出てきます
太い線は 4 桁の束(どれか 1 桁でも 1 なら緑)。青い箱が、選ばれている番地
0 番地(お茶)だけが AND を通った。ほかの 3 つは 0000 になり、合流しても何も足さない
| 番地 | 商品 | 中身 | 値段 |
|---|---|---|---|
| 0(00) | お茶 | 1100 | 120 円 |
| 1(01) | 水 | 1010 | 100 円 |
| 2(10) | コーヒー | 1101 | 130 円 |
| 3(11) | スポーツドリンク | 1111 | 150 円 |
いまは 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 になる線 | 作り方 |
|---|---|---|
00 | 0 番地 | (NOT 2 の位) AND (NOT 1 の位) |
01 | 1 番地 | (NOT 2 の位) AND 1 の位 |
10 | 2 番地 | 2 の位 AND (NOT 1 の位) |
11 | 3 番地 | 2 の位 AND 1 の位 |
どの番号も、4 行のうちちょうど 1 行にだけ当てはまる。 だから、選ぶ線はいつも 1 本だけ 1 になる。 2 つ選んで混ざることは、もう起きない。
アドレス シミュレータ
左上の 2 つのスイッチが番号(アドレス)。デコーダが、同じ番号の線だけを 1 にします
デコーダの右の 00〜11 は、その線が 1 になる番号
番号は 00。デコーダは 00 の線だけを 1 にした。読み出しは 0 番地(お茶)の 120 円
| 番地 | 商品 | 中身 | 値段 |
|---|---|---|---|
| 0(00) | お茶 | 1100 | 120 円 |
| 1(01) | 水 | 1010 | 100 円 |
| 2(10) | コーヒー | 1101 | 130 円 |
| 3(11) | スポーツドリンク | 1111 | 150 円 |
左上の 2 つのスイッチが、番号だ。
「1 の位」を 1 にすると 01。左の箱から出る線のうち、01 と書いた線だけが緑になり、水の 100 円が出てくる。
4 通り、全部試してみてほしい。
左の箱は、NOT 2 個と AND 4 個を、表のとおりに組んだものだ。 2 桁に詰めた番号を、4 本の線にほどき直している。 これをデコーダという。デコードは「符号をほどく」という意味だ。
そして、場所を指すこの番号のことを、アドレスという。 日本語では番地とも呼ぶ。住所の番地と同じ言葉だ。
同じ線で、書く
次は、書くほうだ。
デコーダから出る 4 本の線は、どの番地を指しているかを表している。 この線を、書き込みにも使えばいい。
書き込みの合図を、4 つのレジスタに直接は配らない。 番地ごとに、合図と選ぶ線を AND に通してから配る。 合図が届くのは、選ぶ線が 1 の番地、つまりアドレスが指している番地だけになる。
書き込み シミュレータ
選ぶ線と「書き込み」の AND が、指している番地のクロックにだけ合図を届けます
書く値は 4 つの番地すべてに届いている。合図が届くのは、選ぶ線が 1 の番地だけ
アドレスで番地を選び、書く値を選んで「書き込む」を押してください
| 番地 | 商品 | 中身 | 値段 |
|---|---|---|---|
| 0(00) | お茶 | 1100 | 120 円 |
| 1(01) | 水 | 1010 | 100 円 |
| 2(10) | コーヒー | 1101 | 130 円 |
| 3(11) | スポーツドリンク | 1111 | 150 円 |
図の「書き込み」の丸を押すと、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 を、番地の数だけ並べればいい。
コインロッカーを思い浮かべてほしい。 扉に番号が書いてあり、番号さえ分かれば、どの扉にもまっすぐ行ける。 端から順に扉を開けていく必要はない。
前回のシフトレジスタは、そうではなかった。 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 に落ちて書き込まれる)
2 の位の線は、デコーダの中で少し遅れて届く(そのまま通すゲート 3 個ぶん)
いまのアドレスは 01。書き込みの丸を押して 1 にしたまま、アドレスを 10 に変えてから 0 に落としてみてください
| 番地 | 商品 | 中身 | 値段 |
|---|---|---|---|
| 0(00) | お茶 | 1100 | 120 円 |
| 1(01) | 水 | 1011 | 110 円 |
| 2(10) | コーヒー | 1101 | 130 円 |
| 3(11) | スポーツドリンク | 1111 | 150 円 |
図の「書き込み」の丸を押すと、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回と同じところにある。 アドレスが落ち着くまで、書き込みの合図を入れなければいい。
- アドレスを変えるのは、書き込みの合図が 0 のあいだだけにする。
- アドレスが落ち着いてから、合図を 1 にして、0 に落とす。
さきほどのシミュレータで、この順番を守ってみてほしい。
合図が 0 のあいだなら、スイッチを 1 本ずつ押しても、2 本を一度に切り替えても、何も壊れない。
アドレスが 10 になってから合図を入れれば、コーヒーだけが 110 円になる。
第4回で、閘門のたとえを出した。 2 つの扉を、同時には開けない。前の扉が閉じてから、後ろの扉を開ける。 フリップフロップは、そうやって「受け取る」と「変わる」を、クロックの 1 と 0 に分けていた。
ここでも同じことをしている。 「アドレスを変える」扉と、「書き込む」扉を、同時には開けない。
本物の回路では、これを人の注意ではなく、クロックで守る。 書き込みの合図をクロックと AND して、クロックが 1 のあいだにしか出ないようにする。 アドレスのほうは、クロックが落ちたときにだけ変わるレジスタから出す。 そうすれば、アドレスが揺れるのはいつも、合図の出ていないあいだになる。
第4回のクロックが、ここでもう一度効いている。
番号を、数える
最後に、もう一度アドレスを見てほしい。
アドレスは、ただの 2 進数だった。 ということは、番号そのものを、計算できる。
第6回のカウンタは、クロックが来るたびに 1 ずつ増える 2 進数を出していた。 その出口を、アドレスにつないでみよう。
順に読む シミュレータ
アドレスを、第6回のカウンタ(2 桁)につなぎました。クロックを入れるたびに番号が 1 増えます
カウンタは 11 の次に 00 へ戻る(3 桁目は戻る先がない)
番号は 00。0 番地(お茶)の 120 円が読み出されている
「クロックを入れる」を押すたびに、番号が 00、01、10、11 と進む。
そのたびに、お茶、水、コーヒー、スポーツドリンクと、次の番地の値段が読み出される。
11 の次は 00 に戻り、またお茶から。
前回のテープと同じように、置いた値を順番にたどれるようになった。 しかも今度は、番号を足す数を変えれば、1 つ飛ばしにも、好きな場所からにもできる。 テープと違って、戻るのも自由だ。
さて、ここまでで、自動販売機はずいぶんいろいろなことを覚えられるようになった。 入れた金額を足して覚える。商品ごとの値段を、番地を指して読み書きする。
けれど、まだ足りないものがある。
自動販売機が覚えていなければならないのは、金額や値段だけではない。 いまお金を受け付けている段階なのか。ジュースを出している段階なのか。おつりを返している段階なのか。
いま自分がどの段階にいるのかを、誰も覚えていない。
次回は、それを覚えさせてみよう。 記憶のしくみの、最終回である。
参考文献
- 松下俊介 著. 基礎からわかる論理回路. 第2版, 森北出版, 2021.7. 978-4-627-82842-1. https://ndlsearch.ndl.go.jp/books/R100000002-I031573740
- 馬場敬信 著. 算数で読み解くコンピュータのしくみ, 技術評論社, 2022.8. 978-4-297-12960-6. https://ndlsearch.ndl.go.jp/books/R100000002-I032268791
- ディビッド・マネー・ハリス, サラ・L・ハリス 著; 天野英晴, 鈴木貢, 中條拓伯, 永松礼夫 訳. ディジタル回路設計とコンピュータアーキテクチャ. 第2版, 翔泳社, 2017.9. 978-4-7981-4752-9. https://ndlsearch.ndl.go.jp/books/R100000002-I028478041