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

回路が「書き込む」とは?

2 本に、分けてみる

前回、SR ラッチの「つける」と「消す」を両方押してから、同時に離した。 2 つのゲートが互いの出方を待ち合って、ランプは点いたり消えたりを繰り返した。

原因は、「つける」と「消す」という 2 つのボタンを別々に持たせたことだった。 別々のボタンなら、同時に押せてしまう。

そこで前回の最後に、こう考えた。 私たちがラッチに本当に伝えたいことは、2 つしかないはずだ。

  • 覚えてほしい値は、1 か 0 か。
  • いま、それを覚えてほしいのか、ほしくないのか。

1 つ目を 値 D、2 つ目を 書き込み E と呼ぶことにしよう。 どちらも 0 か 1 の、ただの線だ。

ラッチの中身は、前回までの SR ラッチをそのまま使う。 やることは、D と E から「つける」と「消す」を作ることだけである。 どう作ればいいか、欲しい表を先に書いてみる。

書き込み E値 D消すつける
0000
0100
1010
1101

E が 0 なら、「いまは覚えなくていい」。だから何も押さない。 E が 1 なら、D が 1 のときは「つける」だけ、D が 0 のときは「消す」だけを押す。

表を上から下まで見てほしい。 「消す」と「つける」が両方 1 の行が、どこにもない。

押して、確かめる

表のとおりに組んだ回路が、これだ。 右半分は、前回までと同じ SR ラッチ。左半分が、今回足した部分である。

D ラッチ シミュレータ

「値 D」「書き込み E」をクリックして、4 通りの組み合わせを試してください

NOTNORANDNORNOR消すつける書き込み E0値 D0出力 Q
書き込み E値 D消すつける
0000
01
10
11

「消す」と「つける」が両方 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 目盛り進みます

NOTNORANDNORNOR消すつける書き込み E0値 D0出力 Q
値 D書き込み E出力 Q

右へいくほど新しい。緑の帯は、書き込み 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 にしてください

NOTNORANDNORNOR消すつける書き込み E1値 D0出力 Q
値 D書き込み E出力 Q

右へいくほど新しい。緑の帯は、書き込み 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 = 11 + 1 = 10 の下の桁は 0。つまり、入力の逆を出すだけで済む。 中身は NOT 1 個である。

次のシミュレータでは、D のスイッチを外し、代わりに Q を「+1」の箱に通して戻した。 Q は 0 から始まる。欲しい答えは、0 + 1 = 1 だ。

出力を戻す シミュレータ

書き込み E を 1 にしておく長さを選んで、「書き込む」を押してください(書き込み E のスイッチを押しても同じです)

NOT+1NORANDNORNOR消すつける出力を +1 して、値に戻す書き込み E0出力 Q
書き込み E を 1 にしておく長さ(ステップ数)

まずは長さを「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 でいる時間を、限りなく短くする。 書き込みを、一瞬にできないだろうか。

次回は、それを考えてみよう。

参考文献