シリーズ「コンピュータの記憶のしくみ」 第3回
回路が「書き込む」とは?
2 本に、分けてみる
前回、SR ラッチの「つける」と「消す」を両方押してから、同時に離した。 2 つのゲートが互いの出方を待ち合って、ランプは点いたり消えたりを繰り返した。
原因は、「つける」と「消す」という 2 つのボタンを別々に持たせたことだった。 別々のボタンなら、同時に押せてしまう。
そこで前回の最後に、こう考えた。 私たちがラッチに本当に伝えたいことは、2 つしかないはずだ。
- 覚えてほしい値は、1 か 0 か。
- いま、それを覚えてほしいのか、ほしくないのか。
1 つ目を 値 D、2 つ目を 書き込み E と呼ぶことにしよう。 どちらも 0 か 1 の、ただの線だ。
ラッチの中身は、前回までの SR ラッチをそのまま使う。 やることは、D と E から「つける」と「消す」を作ることだけである。 どう作ればいいか、欲しい表を先に書いてみる。
| 書き込み E | 値 D | 消す | つける |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
E が 0 なら、「いまは覚えなくていい」。だから何も押さない。 E が 1 なら、D が 1 のときは「つける」だけ、D が 0 のときは「消す」だけを押す。
表を上から下まで見てほしい。 「消す」と「つける」が両方 1 の行が、どこにもない。
押して、確かめる
表のとおりに組んだ回路が、これだ。 右半分は、前回までと同じ SR ラッチ。左半分が、今回足した部分である。
D ラッチ シミュレータ
「値 D」「書き込み E」をクリックして、4 通りの組み合わせを試してください
| 書き込み E | 値 D | 消す | つける |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | ? | ? |
| 1 | 0 | ? | ? |
| 1 | 1 | ? | ? |
「消す」と「つける」が両方 1 になった回数(途中のステップも含む):0 回
「値 D」と「書き込み E」を押して、4 通りの組み合わせをすべて試してほしい。 試した組み合わせから、下の表が埋まっていく。
途中で何度押しても、どんな順番で押してもいい。 表の下には、「消す」と「つける」が両方 1 になった回数が出ている。 スイッチを押した直後の、信号が回路を伝わっている途中のステップまで含めて数えている。
何をしても、0 回のまま動かない。
前回は、読者が自分の指で両方押せてしまった。 今回は、どう押しても両方 1 にはならない。禁止入力は、禁止するまでもなく起こせなくなったのだ。
ついでに、もう 1 つ確かめておきたい。 E を 0 にしてから、D を何度か切り替えてみてほしい。
出力 Q は、ぴくりとも動かない。 E が 0 のあいだ、「消す」も「つける」も 0 のままだからだ。 SR ラッチから見れば、何も押されていない。だから、前の値を覚え続ける。
両方 1 に、ならないわけ
理由は、表を 1 行ずつ見るより、「つける」と「消す」がそれぞれ何を欲しがっているかを見るほうが早い。
- 「つける」が 1 になるには、D が 1 でなければならない。
- 「消す」が 1 になるには、D が 0 でなければならない。
D は 1 本の線だ。 1 本の線は、同時に 1 と 0 にはなれない。 だから「つける」と「消す」は、どちらか一方しか 1 になれない。
言いかえると、前回までの「つける」「消す」という 2 つのボタンを、D という 1 つのスイッチにまとめたことになる。 ボタンが 1 つなら、両方押すことはできない。
では、それぞれのゲートを見ていこう。
「つける」は、下の AND が作っている。 AND は入力が両方とも 1 のときだけ 1 になるゲートだった。入力は D と E。 「E が 1 で、D が 1」のときだけ「つける」が 1 になる。表のとおりだ。
「消す」は、上の NOR が作っている。こちらは少しひねってある。 NOR は、入力が両方とも 0 のときだけ 1 になるゲートだった。 入力の 1 本は D。もう 1 本は、E を NOT(入力の逆を出すゲート)に通したものである。 「D が 0」で、「E の逆が 0」、つまり「E が 1」。そのときだけ「消す」が 1 になる。これも表のとおりだ。
「消す」は、「D の逆」と E を AND に入れても作れる。教科書ではそちらの形をよく見かける。 ただしその形だと、E が 1 のまま D を 0 から 1 に変えた瞬間、NOT を通るぶん「消す」が 0 に戻るのが少しだけ遅れる。 ほんの一瞬、「つける」と「消す」が両方 1 になってしまうのだ。 このシミュレータでは途中のステップまで数えているので、NOT を E の側に置く形にした。
開けっぱなしに、したら
禁止入力は消えた。これで一件落着——と言いたいところだが、まだ試していない押し方がある。
E を 1 にしたまま、D を何度か切り替えてみてほしい。 今度のシミュレータには、記録テープを付けた。 押すたびに、D・E・Q の値が 1 目盛りずつ右へ記録されていく。
記録テープ付き D ラッチ
書き込み E を 1 にしてから、値 D を何度か切り替えてください。押すたびに、テープが 1 目盛り進みます
右へいくほど新しい。緑の帯は、書き込み E が 1 だったところ
D を 1 にすると、Q も 1 になる。D を 0 にすると、Q も 0 になる。 テープを見ると、Q の線が、D の線をそのままなぞっているのがわかる。
E が 1 のあいだ、出力 Q は D にそのままついていく。
これは、「覚えている」と言えるだろうか。 D を変えれば、Q もすぐに変わる。さっきまでの値は、どこにも残っていない。 やっていることは、D を右へ素通ししているだけだ。 これでは、D の線を Q のランプに直接つないだのと変わらない。
E が 1 のあいだ、この回路は記憶の回路ではなく、ただの通り道になっている。 この状態を、透過(トランスペアレント)と呼ぶことがある。 中が透けて見えて、入れたものがそのまま向こうへ抜けていく、という意味だ。
では、いつ覚えるのか。 テープの最後で、E を 0 にしてみてほしい。そのあとで D を切り替えても、Q の線はもう平らなままだ。
閉じた瞬間が、残る
もう少しはっきり見るために、D を勝手に動かしてみよう。 次のシミュレータは、「値 D を動かす」を押すと、D が 0 と 1 を行ったり来たりし始める。 E は最初から 1 にしてある。
書き込み E で「撮る」シミュレータ
「値 D を動かす」を押してから、好きなときに書き込み E をクリックして 0 にしてください
右へいくほど新しい。緑の帯は、書き込み E が 1 だったところ
書き込み E = 1:出力 Q は、値 D をそのまま通しています
しばらくは、Q が D を追いかけ続ける。 好きなときに、E をクリックして 0 にしてほしい。
E を 0 にした、その瞬間の D が、Q に残る。
そのあとで D がいくら動いても、Q は変わらない。 もう一度 E を 1 にすると、Q はまた D を追いかけ始める。
スマホのカメラを思い浮かべてほしい。 カメラを向けているあいだ、画面の中の像は、被写体に合わせて動き続ける。 シャッターを押すと、その瞬間の像だけが写真として残る。 あとで被写体が動いても、写真の中身は変わらない。
E が 1 のあいだは、画面の中の像。E を 0 にすることが、シャッターを押すことにあたる。
この回路は、D ラッチ(ゲート付きラッチ)と呼ばれている。 D は、値(Data)の頭文字。 E は、「書き込んでいい」という許可(Enable)の頭文字だ。
何と、引き換えにしたのか
SR ラッチと並べてみよう。
| SR ラッチ | D ラッチ | |
|---|---|---|
| 入力 | つける・消す | 値 D・書き込み E |
| 「つける」「消す」の両方 1 | 押せば起こせる | 起こせない |
| 値が書き込まれるのは | ボタンを押したとき | E が 1 のあいだ、ずっと |
| 値が決まるのは | 離したとき(同時に離すと迷う) | E を 0 にした瞬間 |
SR ラッチでは、「つける」を押すこと自体が「いま書き込んで」という合図だった。 何を書くかと、いつ書くかが、1 つのボタンにまとまっていた。
D ラッチは、それを 2 本に分けた。 何を書くかは D が、いつ書くかは E が受け持つ。 分けたおかげで、禁止入力は消えた。
その代わり、E という線が 1 本増えた。 書き込みを 2 本に分けたら禁止入力は消えたが、今度は「いつ書き込むか」を回路に決めさせる必要が出てきた。
いつ書き込むかは、E を 1 にしているあいだで決まる。 点ではなく、幅がある。 この幅が、次の問題を連れてくる。
開いている時間が、長すぎる
第1回で、自動販売機の話をした。 お金を入れるたびに、覚えている金額に、入れた金額を足して、覚え直す。 記憶の回路が本当に役に立つのは、こういう使い方をするときだ。
これを回路でやるなら、ラッチの出力 Q を、「計算のしくみ」シリーズで作った加算器に通して、D に戻せばいい。 Q に 1 を足した値を D に入れて、E を 1 にする。すると Q が 1 増える。
いちばん小さな 1 桁で試してみよう。
1 桁だけの「+1」は、半加算器の「和」だけを見たものだ。
実際の入力+1を見ると、0 + 1 = 1、1 + 1 = 10 の下の桁は 0。つまり、入力の逆を出すだけで済む。
中身は NOT 1 個である。
次のシミュレータでは、D のスイッチを外し、代わりに Q を「+1」の箱に通して戻した。
Q は 0 から始まる。欲しい答えは、0 + 1 = 1 だ。
出力を戻す シミュレータ
書き込み E を 1 にしておく長さを選んで、「書き込む」を押してください(書き込み E のスイッチを押しても同じです)
まずは長さを「3」にして、「書き込む」を押してほしい。 Q は 0 から 1 になって止まる。狙いどおりだ。
次に「リセット」で Q を 0 に戻してから、長さを「7」にして試してみてほしい。
Q は 1 になったあと、また 0 に戻ってしまう。
E が 1 のあいだ、この回路は通り道だった。 Q が 1 になると、その 1 はすぐに「+1」を通って 0 になり、D に戻ってくる。 E はまだ 1 だから、その 0 がまた素通しで Q に出る。 するとまた「+1」されて 1 になり……値が、ぐるぐると何周も回ってしまう。
10、14 と長くしていくと、下の表の「入れ替わり」の回数が増えていく。 ちょうど 1 回で止まらなければ、+1 にはならない。 E を 1 にしておいた長さで、答えが変わる。
しかも本物の回路では、1 周にかかる時間はゲートの速さで決まる。 前回見たとおり、ゲートの速さは 1 個ずつばらつくし、温度でも変わる。 E を 1 にしているあいだに何周するのか、前もって決めることはできない。
ちょうど 1 周だけ回したい。 そのためには、E を 1 にしておく時間を、1 周より短くしなければならない。 けれど短すぎれば、今度は値が書き込みきれない。
欲しいのは、幅のある「あいだ」ではない。 「この瞬間」という、一点だけで書き込む仕組みだ。
E が 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