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

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

短くすれば、いいのか

前回の最後で、D ラッチの出力 Q を「+1」に通して、値 D に戻した。 書き込み E を 1 にすれば、Q が 1 増える。そのはずだった。

ところが、E を 1 にしておく長さを変えると、答えが変わってしまった。 長く開けておけば、値は何周も回ってしまう。

欲しいのは、1 回だけ進むことだ。 それなら、話は簡単に思える。E を 1 にしておく時間を、うんと短くすればいい。

1 周するより短いあいだだけ開けて、すぐ閉じる。 そうすれば、値は 1 周ぶんしか進めないはずだ。

まずは、この道を通ってみよう。

回路は前回と同じもので、描き方だけを変えた。 D ラッチの中身(ゲート 5 個)を、1 つの箱にまとめてある。中身は前回のままだ。

パルスを短くする シミュレータ

書き込み E を 1 にしておく長さを選んで、「書き込む」を押してください。ちょうど 1 回だけ増える長さを探してみてください

D ラッチいま 0書き込み+1出力を +1 して、値に戻す書き込み E0出力 Q
書き込み E を 1 にしておく長さ(ステップ数)

長さを「3」にして、「書き込む」を押してほしい。 Q は 0 から 1 になって止まる。入れ替わりは 1 回。狙いどおりだ。 「2」でも同じになる。

では、いちばん短い「1」にしてみてほしい。

出力が点滅し続けて、決まらない。

短すぎたのだ。 値が入れ替わっている最中に E を 0 に戻してしまうと、「つける」と「消す」が同時に 0 になる。 第2回で見た「両方を同時に離す」のと、同じことが起きている。

長すぎれば何周もする。短すぎれば決まらない。 ちょうど 1 回になるのは、「2」と「3」だけだった。

ちょうどいい長さが、決められない

窓は狭いが、たしかにある。ならば、そこを狙って作ればいいのではないか。

シミュレータの下にある「「+1」の箱だけ、少し遅いことにする」に、チェックを入れてほしい。 回路はまったく同じ。変えたのは、ゲート 1 個が、ほんの少しだけ遅れて反応するということだけだ。

長さ「2」「3」は、やはり 1 回になる。 ところが、長さ「4」を、チェックを付けた場合と外した場合の両方で試してみてほしい。

  • ゲートの速さがそろっているとき … 決まらない
  • 「+1」だけ少し遅いとき … ちょうど 1 回

同じ回路、同じ長さ、同じ押し方。違うのはゲート 1 個の速さだけだ。それで答えが変わる。

第2回で見たとおり、ゲートの反応の速さは 1 個ずつ違う。 同じ型番でも違うし、温度でも電圧でも変わる。

つまり「ちょうどいい長さ」は、その日の、その 1 枚の基板の、そのゲートの速さで決まる。 作る前に決めることはできない。 たまたま今日うまくいく長さに決めてしまえば、暑い日には間に合わなくなる。

パルスを短くする道は、行き止まりである。

同時に、開かないようにする

いったん、何に困っていたのかへ戻ろう。

E が 1 のあいだ、D ラッチは通り道だった。 入口から出口まで、ひとつながりになってしまう。 つながっている限り、値は先へ、先へと進み続ける。

短くしたかったのは、じつは時間ではない。 入口から出口までが、一度につながってしまうこと。 困っていたのは、こちらだ。

だったら、時間を削るのではなく、つながらないようにすればいい。

水面の高さが違う水路どうしをつなぐところに、閘門(こうもん)というものがある。 船を上げ下げして通すための仕掛けだ。

扉は 2 つある。手順はこうなっている。

  1. 下流側の扉を開けて、船を中に入れる。
  2. 下流側の扉を閉める
  3. 中の水位を、上流側に合わせる。
  4. 上流側の扉を開けて、船を出す。

2 つの扉が同時に開くことは、一度もない。 同時に開けてしまえば、水が一気に流れ込んで、船どころではなくなる。

それでも船は、ちゃんと向こう側へ渡っていく。 一度も通り抜けさせないまま、通すのである。

パナマ運河ミラフローレス閘門の、閉じた扉と閘室

両方が開いたら、船は通せない

これを回路でやる。

D ラッチを 2 つ、直列につなぐ。前のラッチの出力を、後ろのラッチの値にする。 そして、書き込み E を互いに逆向きに配る。

  • E が 1 のとき … 前が開き、後ろは閉じる。
  • E が 0 のとき … 前が閉じ、後ろが開く。

どちらの場合も、片方は必ず閉じている。 入口から出口までが、一度もつながらない。

押して、確かめる

箱 2 つで並べたものが、これだ。

D フリップフロップ シミュレータ

値 D を決めてから、書き込み E を 1 にして、そのあと 0 に戻してください。値がどこまで進むかを見てください

前のラッチいま 0書き込み後ろのラッチいま 0書き込みNOT書き込みの逆値 D0書き込み E0出力 Q

前のラッチは閉じ、後ろが開いています。前の箱にあった 0 が、出力 Q に出ています

まず「値 D」を 1 にしてから、「書き込み E」を 1 にしてほしい。

前の箱が「開」になり、中に 1 が入る。 けれど、出力 Q は 0 のままだ。 後ろの箱が「閉」だからである。

E を 1 にしたまま、D を何度か切り替えてみてほしい。 前の箱の値は、そのつど追いかけてくる。出力 Q は、やはり動かない。

どれだけ長く開けていても、値は前の箱で止まる。

では、E を 0 に戻してほしい。

前の箱が「閉」になり、後ろの箱が「開」になる。 前の箱に入っていた値が、出力 Q に出てくる。

そのあとで D をいくら動かしても、Q はもう変わらない。前の箱が閉じているからだ。

値が 1 つ進むのは、E を 1 にしているあいだでも、0 にしているあいだでもない。 1 から 0 へ切り替わる、そのときだけである。

中身は、第3回のまま

シミュレータの「中身を開く」に、チェックを入れてほしい。2 つの箱が、ゲートに戻る。

上が前のラッチ、下が後ろのラッチ。どちらも第3回で作った D ラッチ、そのままだ。 違うのは、左下の NOT から出ている 2 本の線である。

  • 前のラッチには、E が「つける」へ、E の逆が「消す」へ入っている。
  • 後ろのラッチには、それが入れ替わって入っている。

第3回の D ラッチは、ゲート 5 個だった。 2 つ並べたのだから 10 個かと思いきや、9 個で足りている。 NOT が 1 個で済むからだ。

前のラッチのために作った「E の逆」を、後ろのラッチがそのまま使う。 そして後ろのラッチが必要とする「E の逆の、さらに逆」は、E そのものである。 逆の逆は、もとに戻る。だから NOT は増えない。

足したのは、ラッチ 1 つぶんの 4 個。それだけで、通り道が同時に開かなくなった。

「一瞬」は、時間ではなかった

ここで、最初の問いに戻ろう。

第3回の最後で欲しかったのは、「この瞬間」という一点だけで書き込む仕組みだった。 そのために E を 1 にしておく時間を、限りなく短くしようとした。そして行き止まりになった。

いま手に入れたものは、時間を短くしていない。 E は、好きなだけ長く 1 にしておいていい。1 秒でも、1 年でもいい。 それでも値は、1 回しか進まない。

「一瞬」は、時間の長さではなく、切り替わる瞬間として実現された。

この「切り替わる瞬間」を、エッジ(へり)と呼ぶ。 0 から 1 へ上がる瞬間が立ち上がり、1 から 0 へ落ちる瞬間が立ち下がりである。

いま作った回路で値が出てくるのは、E が 1 から 0 へ落ちる瞬間、つまり立ち下がりだ。 E と「E の逆」を入れ替えれば、立ち上がりで動くものになる。どちらが偉いということはない。

そして、ここで名前が分かれる。

  • ラッチ … 開いているあいだ、ずっと書き込まれる。で決まる。
  • フリップフロップ … 切り替わる瞬間だけ書き込まれる。で決まる。

第1回から作ってきた SR ラッチも、第3回の D ラッチも、名前のとおりラッチだった。 今回作ったものは、D フリップフロップという。

D ラッチ 2 つでできているので、マスタースレーブ型と呼ばれることもある。 前のラッチがマスタ、後ろのラッチがスレーブだ。

第3回の困りごとは、どうなったか

では、第3回の最後でつまずいたところへ、もう一度行ってみよう。

出力 Q を「+1」に通して、値に戻す。 上が第3回の D ラッチ、下が今回の D フリップフロップ。それ以外は、まったく同じである。

並べて比べる シミュレータ

長さを選んで「両方に書き込む」を押すと、上と下が同時に動きます。長さを変えて、何度か試してください

第3回の D ラッチ(入れ替わり 0 回)

D ラッチいま 0書き込み+1出力を +1 して、値に戻す書き込み E0出力 Q

今回の D フリップフロップ(入れ替わり 0 回)

前のラッチいま 0書き込み後ろのラッチいま 0書き込みNOT+1書き込みの逆出力を +1 して、値に戻す書き込み E0出力 Q
書き込み E を 1 にしておく長さ(ステップ数)

長さを選んで、「両方に書き込む」を押してほしい。上と下が同時に動く。 3、7、10、14 と、長さを変えて何度か試してほしい。

  • 上(ラッチ) … 入れ替わりは 1 回、2 回、3 回、4 回と増えていく。
  • 下(フリップフロップ) … 何度やっても、1 回

第3回で困ったことが、そのまま消えている。

理由は、もう見たとおりだ。

E が 1 のあいだ、前のラッチは値を受け取るが、後ろは閉じている。だから出力 Q は動かない。 Q が動かなければ、「+1」の答えも動かない。前のラッチが受け取る値も、動かない。 ぐるぐる回るための輪が、そもそもつながっていない。

E を 0 に戻すと、後ろが開いて Q が 1 つ進む。 けれどそのとき、前のラッチはもう閉じている。進んだ値が、前へ戻ってくることはない。

D ラッチD フリップフロップ
値が書き込まれるのはE が 1 のあいだ、ずっとE が 1 から 0 に落ちるとき
E を 1 にしておく長さ答えが変わるいくらでもよい
出力を入力に戻せるか戻せない(回ってしまう)戻せる
中身ゲート 5 個ゲート 9 個

ゲートを 4 個足しただけで、出力を入力に戻せるようになった。 覚えている値をもとに計算して、その答えで覚え直す。 1 桁だけなら、これでやっと、確実にできる。

同じ瞬間に、みんなが

E という名前は、もう合っていない。 Enable(許可)は、「開けてある」という幅のある言葉だ。いま大事なのは、幅ではなく瞬間のほうである。

この線を、クロックと呼び直そう。時計、という意味だ。 0 と 1 を規則正しく繰り返す波を、この線に流し続ける。

クロック シミュレータ

「クロックを流す」を押してください。出力 Q が変わる場所と、クロックが落ちる場所を見比べてください

前のラッチいま 0書き込み後ろのラッチいま 0書き込みNOT+1書き込みの逆出力を +1 して、値に戻すクロック0出力 Q
クロック前の出力出力 Q

右へいくほど新しい。緑の帯はクロックが 1 だったところ、黄色の破線は 1 から 0 に落ちたところ

クロックが 1 のあいだ(緑の帯のあいだ)、出力 Q は一度も動かない。動くのは、黄色い破線を越えたあとだけ

「クロックを流す」を押してほしい。 下の記録テープに、クロックと、前のラッチの出力と、出力 Q が並んで記録されていく。

前のラッチの出力は、クロックが 1 のあいだ(緑の帯のあいだ)に動いている。 けれど出力 Q は、クロックが1のあいだ、一度も動かない。 動くのは、黄色い破線を越えたあと。クロックが 1 から 0 へ落ちたあとだけだ。

破線のちょうど真上ではなく、少し右にずれていることがある。 信号が後ろのラッチのゲートを通り抜けるのに、何ステップかかかるからだ。 ずれる幅は、そのときのゲートの速さで変わる。 それでも、クロックが 1 のあいだに動くことは一度もない。

いつ書き込むかを、回路はもう自分では決めない。クロックが決める。

ここでオーケストラの指揮者を思い浮かべてほしい。 棒が振り下ろされた瞬間、全員が同時に演奏を始める。 誰かが早く、誰かが遅く始めることはない。振り下ろしは、全員に同じように見えているからだ。

オーケストラの前で指揮棒を構える指揮者

合図は、点でくる

同様にクロックの線は、1 本あればいい。 それを何十、何百というフリップフロップに配れば、全員が同じ瞬間に書き込む。

速いゲートも遅いゲートも、次の振り下ろしまでに終わってさえいればいい。 そのあいだに誰が先に着こうが、結果には出てこない。

第2回からずっと足を引っぱってきた「ゲートの速さがばらつく」という問題は、ここでようやく格好がつく。 ばらつきを無くしたのではない。ばらつきが答えに出ないところまで、待つことにしたのだ。

さて、1 ビットを確実に覚えられる部品が、これで手に入った。

けれど 1 ビットでは、0 か 1 しか覚えられない。 第1回の自動販売機が覚えていた 120 円は、まだどこにも置けない。

次回は、これを 4 つ並べてみよう。

参考文献

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