シリーズ「コンピュータの記憶のしくみ」 第4回
回路が「一瞬で書き込む」とは?
短くすれば、いいのか
前回の最後で、D ラッチの出力 Q を「+1」に通して、値 D に戻した。 書き込み E を 1 にすれば、Q が 1 増える。そのはずだった。
ところが、E を 1 にしておく長さを変えると、答えが変わってしまった。 長く開けておけば、値は何周も回ってしまう。
欲しいのは、1 回だけ進むことだ。 それなら、話は簡単に思える。E を 1 にしておく時間を、うんと短くすればいい。
1 周するより短いあいだだけ開けて、すぐ閉じる。 そうすれば、値は 1 周ぶんしか進めないはずだ。
まずは、この道を通ってみよう。
回路は前回と同じもので、描き方だけを変えた。 D ラッチの中身(ゲート 5 個)を、1 つの箱にまとめてある。中身は前回のままだ。
パルスを短くする シミュレータ
書き込み E を 1 にしておく長さを選んで、「書き込む」を押してください。ちょうど 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 つある。手順はこうなっている。
- 下流側の扉を開けて、船を中に入れる。
- 下流側の扉を閉める。
- 中の水位を、上流側に合わせる。
- 上流側の扉を開けて、船を出す。
2 つの扉が同時に開くことは、一度もない。 同時に開けてしまえば、水が一気に流れ込んで、船どころではなくなる。
それでも船は、ちゃんと向こう側へ渡っていく。 一度も通り抜けさせないまま、通すのである。
これを回路でやる。
D ラッチを 2 つ、直列につなぐ。前のラッチの出力を、後ろのラッチの値にする。 そして、書き込み E を互いに逆向きに配る。
- E が 1 のとき … 前が開き、後ろは閉じる。
- E が 0 のとき … 前が閉じ、後ろが開く。
どちらの場合も、片方は必ず閉じている。 入口から出口までが、一度もつながらない。
押して、確かめる
箱 2 つで並べたものが、これだ。
D フリップフロップ シミュレータ
値 D を決めてから、書き込み E を 1 にして、そのあと 0 に戻してください。値がどこまで進むかを見てください
前のラッチは閉じ、後ろが開いています。前の箱にあった 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 回)
長さを選んで、「両方に書き込む」を押してほしい。上と下が同時に動く。 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 が変わる場所と、クロックが落ちる場所を見比べてください
右へいくほど新しい。緑の帯はクロックが 1 だったところ、黄色の破線は 1 から 0 に落ちたところ
クロックが 1 のあいだ(緑の帯のあいだ)、出力 Q は一度も動かない。動くのは、黄色い破線を越えたあとだけ
「クロックを流す」を押してほしい。 下の記録テープに、クロックと、前のラッチの出力と、出力 Q が並んで記録されていく。
前のラッチの出力は、クロックが 1 のあいだ(緑の帯のあいだ)に動いている。 けれど出力 Q は、クロックが1のあいだ、一度も動かない。 動くのは、黄色い破線を越えたあと。クロックが 1 から 0 へ落ちたあとだけだ。
破線のちょうど真上ではなく、少し右にずれていることがある。 信号が後ろのラッチのゲートを通り抜けるのに、何ステップかかかるからだ。 ずれる幅は、そのときのゲートの速さで変わる。 それでも、クロックが 1 のあいだに動くことは一度もない。
いつ書き込むかを、回路はもう自分では決めない。クロックが決める。
ここでオーケストラの指揮者を思い浮かべてほしい。 棒が振り下ろされた瞬間、全員が同時に演奏を始める。 誰かが早く、誰かが遅く始めることはない。振り下ろしは、全員に同じように見えているからだ。
同様にクロックの線は、1 本あればいい。 それを何十、何百というフリップフロップに配れば、全員が同じ瞬間に書き込む。
速いゲートも遅いゲートも、次の振り下ろしまでに終わってさえいればいい。 そのあいだに誰が先に着こうが、結果には出てこない。
第2回からずっと足を引っぱってきた「ゲートの速さがばらつく」という問題は、ここでようやく格好がつく。 ばらつきを無くしたのではない。ばらつきが答えに出ないところまで、待つことにしたのだ。
さて、1 ビットを確実に覚えられる部品が、これで手に入った。
けれど 1 ビットでは、0 か 1 しか覚えられない。 第1回の自動販売機が覚えていた 120 円は、まだどこにも置けない。
次回は、これを 4 つ並べてみよう。
参考文献
- 松下俊介 著. 基礎からわかる論理回路. 第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
- 国土交通省中部地方整備局木曽川下流河川事務所. "木曽川と長良川を結ぶ「船頭平閘門」". 国土交通省中部地方整備局木曽川下流河川事務所. https://www.cbr.mlit.go.jp/kisokaryu/sisetu/sendohira-detail.html, (参照 2026-9-22).