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

回路が「数を覚える」とは?

4 つ、並べるだけ

前回、1 ビットを確実に覚えられる部品ができた。D フリップフロップである。 クロックが 1 から 0 へ落ちる瞬間に、値 D を 1 つだけ受け取る。

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

そこで、4 つ並べよう。

やることは、これだけである。

  1. 値 D の線を、桁ごとに 1 本ずつ、4 本用意する。
  2. クロックの線を 1 本引いて、4 つのフリップフロップに配る。

以上だ。拍子抜けするほど簡単である。

新しい部品は 1 つも要らない。前回作ったものを 4 つコピーして、線をつなぐだけだ。 こうして 1 ビットの部品を何桁か並べたものを、レジスタという。

まずは、触ってみてほしい。

4 ビットレジスタ シミュレータ

D のスイッチで覚えさせたい数を作り、「クロックを入れる」を押してください

フリップフロップいま 0クロックフリップフロップいま 0クロックフリップフロップいま 0クロックフリップフロップいま 0クロッククロックの線は、この 1 本だけクロック08 の位04 の位02 の位01 の位0出力

箱の中身は、第4回で作った D フリップフロップ(D ラッチ 2 段)そのまま

D に作った数0000= 0
覚えている数0000= 0

覚えているのは 00000)。出力は、合図がなくても出つづけている

押して、確かめる

左に並んだ 4 つのスイッチが、覚えさせたい値 D だ。上が 8 の位、下が 1 の位である。 右の 4 つのランプが、レジスタがいま覚えている数だ。

まず、スイッチをいくつか押して、好きな数を作ってほしい。たとえば 1010

ランプは、何も変わらない。

D をどう作りかえても、覚えている数は動かない。 前回見たとおり、値が入るのはクロックが落ちる瞬間だけだからだ。

では「クロックを入れる」を押してほしい。

4 桁が、いっぺんに 1010 になった。

もう一度、別の数で試してほしい。0011 でも 1111 でもいい。 何を作っても、クロックを 1 回入れれば、そのパターンがそのまま覚えられる。

4 桁あるので、覚えられるのは 0000 から 1111 まで。10 進法でいう 0 から 15 だ。

作り方の話は、これで終わりである。本当にこれだけしかない。

だから、この回の主役は作り方ではない。 なぜ、同じクロックを 4 つに配るのか。 ここからは、そこだけを見ていく。

桁どうしは、つながっていない

図をもう一度見てほしい。

4 つのフリップフロップは、縦に並んでいるだけだ。 桁どうしをつなぐ線が、1 本もない。

「計算のしくみ」シリーズの第2回を思い出してほしい。 全加算器を 4 つ横に並べて、4 桁の足し算をする回路を作った。

あのときは、桁どうしが本当につながっていた。 1 の位が出した繰り上がりが、2 の位の入力になる。2 の位の繰り上がりが、4 の位へ。

だから 2 の位の全加算器は、1 の位が決まるまで計算を始められなかった。 4 桁の答えが出そろうまでに、順番待ちが 4 回ぶんあった。

レジスタは、そうではない。

8 の位のフリップフロップは、1 の位が何を覚えているかを知らない。知る必要もない。 下の 3 桁を取り外してしまっても、8 の位はまったく同じように動く。

順番待ちも起きない。4 桁だろうと 32 桁だろうと、覚えるのにかかる時間は同じである。

では、何が「1 つの数」にしているのか

つながっていないのなら、1010 は 4 つのばらばらな 1 ビットにすぎない。 それを 10 だと読んでいるのは、誰なのか。

「計算のしくみ」シリーズの第4回で、同じ話をした。 4 桁の重みを左から 8、4、2、1 と読むか、-8、4、2、1 と読むかは、読む側が決める約束だった。 桁に名札を貼っているのは、いつも人間のほうである。

図に書いてある「8 の位」「4 の位」も、その名札だ。 回路の側には、これが 8 の位だという手がかりが 1 つもない。 4 つのフリップフロップは、どれも同じ 1 ビットを覚える、同じ部品である。

けれど、名札だけでは足りない。 名札が決めてくれるのは、どの桁がいくつぶんか、ということだけだ。 4 つのビットが同じ 1 つの数であることまでは、決めてくれない。

それを決めているものが、図の中にもう 1 つある。 唯一つながっている、クロックの線である。

同じ瞬間でなければ、どうなるか

前回、最後にこう書いた。

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

ここを、少し疑ってみたい。

線には長さがある。途中でゲートも通る。 いちばん近い部品といちばん遠い部品で、合図が届く時刻は本当に同じなのだろうか。

——同じではない。合図は、全員に同時には届かない。

どれくらいずれるかは、その基板の配線の長さや、途中に入る部品の数で決まる。 ごくわずかなずれだ。それで何が困るのか。

試してみよう。

次のレジスタは 0111 を覚えている。10 進法でいう 7 だ。 これを 1000、つまり 8 に書き換える。7 の次は 8 である。何も起こりそうにない。

クロックがずれて届く シミュレータ

0111(7)を覚えています。1000(8)に書き換えるとき、クロックが桁ごとにずれて届いたらどうなるかを見てください

フリップフロップいま 0クロックフリップフロップいま 1クロックフリップフロップいま 1クロックフリップフロップいま 1クロッククロックの線は、この 1 本だけクロック08 の位14 の位02 の位01 の位0出力
D に作った数1000= 8
覚えている数0111= 7
クロック8 の位 +04 の位 +32 の位 +31 の位 +3外に出た数7

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

クロックの届きかたを選んで、「クロックを入れる」を押してください

クロックの届きかた

まず「そろっている」を選んで、「クロックを入れる」を押してほしい。

下の記録テープに、4 桁それぞれの動きと、そのとき外に出ていた数が記録される。 4 本の線は同じところで折れ、7 の次は 8 になる。 狙いどおりだ。

次に「8 の位が先」を選んで、もう一度押してほしい。 8 の位にだけ、クロックが少し早く届く回路になる。

途中で 15 が外に出る。

無理もない。01111000 にするとき、4 桁がそれぞれやることはこうだ。

  • 8 の位 … 0 から 1 になる
  • 4 の位、2 の位、1 の位 … 1 から 0 になる

8 の位だけが先に切り替わってしまえば、その一瞬は 1111 である。10 進法でいう 15 だ。

「8 の位が後」も試してほしい。今度は下の 3 桁が先に 0 になるので、 途中で 0000——0 が外に出る。

「ばらばら」なら、15 と 13 が続けて出てくる。

書き込んだのは 8 である。その前に覚えていたのは 7 だ。 15 も 13 も 0 も、一度も書き込んでいない数である。 それが、たしかに出力の線に出ていた。

パタパタと、めくれていく

駅のホームで、板をめくって次の電車を知らせる発車標を見たことがあるだろうか。 反転フラップ式という。パタパタという音から、そのまま「パタパタ」と呼ばれている。

板の束が、区画ごとに分かれて並んでいる。種別、行き先、時刻、番線。 表示を変えるときは、区画ごとに、目当ての板が出るまで 1 枚ずつめくれていく。

時刻の 4 桁だけを取り出して、めくってみよう。

「めくる」を押すと、次の電車の時刻に変わる

めくれている最中は、どの電車のものでもない

7 時 12 分の次は、8 時 45 分だ。 けれど途中で、8 時 23 分と 8 時 34 分が表示されている。

めくる枚数が、区画ごとに違うからである。 分の一の位は 2 から 5 まで 3 枚めくる。時の一の位は 7 から 8 まで 1 枚で済む。 枚数が違えば、めくり終わる時刻もそろわない。 どの区画も、隣がまだめくれているかどうかは気にしない。

ここで気味が悪いのは、途中で出た 8 時 23 分が、ちゃんと時刻に見えることだ。 10:67 のような表示なら、見た人も「いま変わっているところだ」と分かる。 時刻に見えてしまうものは、そうはいかない。

駅の誰も、8 時 23 分の電車を出そうとしてはいない。 それでも、たしかにホームに向かって表示されている。

レジスタの出力も、同じことだ。 15 を出そうとした者は、どこにもいない。 そして 15 は、4 桁の数として、なんの不自然さもない。

その数を、誰が見ているのか

一瞬のことなら、放っておいてもいいのではないか。

そうはいかない。レジスタの出力は、どこかにつながっているはずだからだ。 覚えた数を読み出して、計算に通して、また覚え直す。 記憶の回路は、そのために作っている。

つないだ先が、よりにもよってその一瞬に読んでしまえば、15 を読む。 一度も書き込まれていない数を、本物の答えとして受け取ってしまう。

覚えている値が正しいかどうかの話ではない。 落ち着いたあとの 1000 は、どの届きかたでも正しかった。 困るのは、落ち着くまでのあいだ、外にうそが出ていることである。

つないであるのは、クロック 1 本

ここまでをまとめよう。

4 つのフリップフロップは、桁どうし何もつながっていない。 それぞれが、自分の 1 ビットだけを覚えている。

つないであるのは、クロックの線 1 本だけだ。 その 1 本が、4 つの 1 ビットを「1 つの数」にしている。

同じ瞬間に書き換わるから、外から見ると、1 つの数が別の数に変わったように見える。 瞬間がずれれば、その見え方は崩れる。 4 つはただの 4 つに戻り、誰も書いていないパターンが通りすぎていく。

クロックが桁ごとにずれて届くことを、クロックスキューという。 スキューは「ゆがみ」「ずれ」という意味だ。

だから本物のコンピュータでは、クロックをどう配るかに手間をかける。 配線の長さをそろえ、途中を通る部品の数をそろえる。 どれも、同じ瞬間に届かせるためである。

前回、オーケストラの指揮者の話をした。 棒が振り下ろされた瞬間、全員が同時に演奏を始める。

けれど、もし棒が見えるのが遅れる人がいたら、どうなるか。 その人だけ、半拍おくれて鳴りはじめる。 誰も書いていない和音が、一瞬だけホールに響く。

音を合わせるというのは、同じ楽譜を持つことではなかった。 同じ瞬間を分け合うことだったのである。

読み出しに、合図は要らない

もう 1 つ、確かめておきたいことがある。

最初のシミュレータに戻って、クロックを入れずに、そのまま置いておいてほしい。

出力のランプは、ずっと点いたままだ。

書き込みには合図が要った。クロックが落ちる瞬間、その一点だけだった。 けれど読み出しには、合図が要らない。

覚えている値は、書き込んでいないあいだも、出力の線に出つづけている。 読みたいときに読めばいい。何度読んでも減らない。

当たり前のようだが、大事なところだ。 第1回の SR ラッチから、出力はずっとそうだった。 押していないあいだも、ランプは点いていた。あれと同じである。

4 桁では、まだ 120 円が置けない

さて、4 桁のレジスタができた。覚えられるのは 0 から 15 までだ。

第1回の自動販売機は、120 円を覚えていた。まだ置けない。

置くにはどうするか。桁を増やすだけである。 フリップフロップをもう 4 つコピーして、クロックを配る先を 8 つにする。 それで 0 から 255 まで覚えられる。120 円は、これで置ける。

8 つで足りなければ、32 個並べればいい。40 億を超えるところまで覚えられる。 「計算のしくみ」シリーズの第2回で、加算器の桁数を増やすときに書いたことと同じだ。 桁数を増やすのに、新しいアイデアは要らない。

ただし、今回はひとつ付け足しておきたい。

コピーするのは簡単だが、クロックを配る先が増えるほど、同じ瞬間に届けるのは難しくなる。 4 つならまだいい。何百、何万となれば、 いちばん近い部品といちばん遠い部品で、線の長さがまるで違ってくる。

増やすのが簡単なのは部品のほうだけで、合図のほうはそうでもない。 さきほど見た 15 は、桁を増やすほど出やすくなるということである。

この記事では、「計算のしくみ」シリーズにそろえて、4 桁のままでいく。 4 桁で見えることは、32 桁でもそのまま見えるからだ。

覚えた数を、使ってみたい

4 桁の数を、同じ瞬間に書き込めるようになった。 けれど、書き込む数は、まだ人間がスイッチで作っている。

第3回で、困ったことがあった。

D ラッチの出力 Q を「+1」に通して、値 D に戻した。 覚えている値をもとに計算して、その答えで覚え直す。そのつもりだった。 ところが書き込みを開けているあいだ、値は何周も回ってしまった。

あのループを、今度はフリップフロップでやってみよう。 1 桁ぶんは、前回の最後でもう確かめてある。何度やっても、1 回しか進まなかった。

そして 4 桁ぶんの「+1」は、「計算のしくみ」シリーズでもう作ってある。加算器である。 レジスタの出力を加算器に通して、答えをレジスタの D に戻す。そこへクロックを 1 回入れる。

クロックが来るたびに、1 つ増える。 回路が、数を数えられるようになる。

「いま覚えている金額に、入れた金額を足して、覚え直す」という第1回の話が、ようやくできる。

次回は、それをやってみよう。

参考文献

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