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

回路が「足し続ける」とは?

輪に、つなぐ

前回、4 桁の数を覚えるレジスタができた。 クロックが落ちる瞬間に、4 桁をいっぺんに書き込む。

けれど、書き込む数は、まだ人間がスイッチで作っていた。

今回は、そのスイッチを外す。 代わりに、レジスタの出力を加算器に通して、答えをレジスタの値 D に戻す。

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

  1. レジスタの出力を、加算器の入力 A につなぐ。
  2. 加算器のもう片方の入力 B には、0001 を置いておく。
  3. 加算器の答えを、レジスタの値 D につなぐ。

レジスタは前回のもの。加算器は「計算のしくみ」シリーズの第2回で作ったもの。 新しい部品は、今回も 1 つも要らない。 出力が入力へ戻ってくるので、回路は輪になる。

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

カウンタ シミュレータ

「クロックを入れる」を押すたびに、覚えている数が 1 ずつ増えます

8 の位いま 0クロック全加算器AB4 の位いま 0クロック全加算器AB2 の位いま 0クロック全加算器AB1 の位いま 0クロック全加算器ABレジスタ加算器戻る先がないクロックの線は、左の 1 本だけクロック0足す数00015 桁目

左の箱は第5回のフリップフロップ、右の箱は計算シリーズ第2回の全加算器。足す数は 0001 に固定

覚えている数0000= 0
加算器の答え0001= 1

加算器は、もう次の答え(1)を出している。クロックが落ちると、それを覚える

図の「クロック」の丸を押すと、1 にしたままにできる(もう一度押すと 0 に落ちる)

押して、確かめる

左の 4 つの箱が、前回のレジスタだ。上が 8 の位、下が 1 の位である。 右の 4 つの箱が、全加算器。計算シリーズの第2回で横に並べたものを、縦に並べ直した。 右端の丸が、足す数 B。0001 に固定してある。

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

覚えている数が、1 つ増えた。

もう一度押すと、また 1 つ。押すたびに、0、1、2、3……と増えていく。

図の中を、1 行ずつ見てほしい。

どの行も、左の箱から右の箱へ線が出て、右の箱の「和」から上を回って、左の箱の「値」へ戻っている。 桁ごとに、小さな輪ができている。

そして図の下の「加算器の答え」を見てほしい。 クロックを入れる前から、加算器はもう「覚えている数 + 1」を出している。

加算器はクロックを知らない。入力が来れば、いつでも答えを出す。 その答えは、レジスタの値 D の前で待っている。 クロックが落ちた瞬間、レジスタがそれを覚える。 覚えた数が出力に出ると、加算器はすぐ次の答えを出して、また待つ。

こうして、クロックが来るたびに 1 つずつ数えていく回路を、カウンタという。

押しっぱなしでも、1 回だけ

ここで、第3回の最後を思い出してほしい。

D ラッチの出力を「+1」に通して、D に戻した。 書き込み E を 1 にしているあいだ、値は何周も回ってしまった。 E を 1 にしておいた長さで、答えが変わった。

今回の回路も、出力を「+1」して戻している。形は同じだ。 それなら、クロックを 1 にしたままにしたら、どうなるだろうか。

さきほどのシミュレータで、図の左下にある「クロック」の丸を 1 回だけ押してほしい。 クロックが 1 になったまま止まる。

そのまま、しばらく待ってほしい。 下の表示に、クロックを 1 にしてから何ステップたったかが出る。 シミュレータは、そのあいだも回路を 1 ステップずつ回しつづけている。

覚えている数は、1 つも動かない。

10 ステップたっても、30 ステップたっても同じだ。 もう一度丸を押してクロックを 0 に落とすと、そこで 1 回だけ増える。

第3回で困ったことは、4 桁になっても解決できている。

理由は、第4回で見たとおりだ。 フリップフロップの中には、ラッチが 2 つ並んでいる。 クロックが 1 のあいだ、前のラッチは加算器の答えを受け取るが、後ろのラッチは閉じている。 だから出力は動かない。出力が動かなければ、加算器の答えも動かない。 ぐるぐる回るための輪が、クロックが 1 のあいだは切れている。

クロックが 0 に落ちると、後ろのラッチが開いて、出力が 1 つ進む。 けれどそのとき、前のラッチはもう閉じている。 進んだ数が加算器を回って戻ってきても、次にクロックが落ちるまで、どこにも入れない。

第4回では、これを 1 桁で確かめた。 4 桁になり、「+1」が本物の加算器になっても、話は何も変わらない。

15 の次は

では、数えつづけるとどうなるか。

4 桁で覚えられるのは 15 までだった。15 の次は、何を覚えるのだろう。 今度は 13 から始めておいた。何回か押してみてほしい。

カウンタ シミュレータ

「クロックを入れる」を押すたびに、覚えている数が 1 ずつ増えます

8 の位いま 1クロック全加算器AB4 の位いま 1クロック全加算器AB2 の位いま 0クロック全加算器AB1 の位いま 1クロック全加算器ABレジスタ加算器戻る先がないクロックの線は、左の 1 本だけクロック0足す数00015 桁目

左の箱は第5回のフリップフロップ、右の箱は計算シリーズ第2回の全加算器。足す数は 0001 に固定

覚えている数1101= 13
加算器の答え1110= 14

加算器は、もう次の答え(14)を出している。クロックが落ちると、それを覚える

図の「クロック」の丸を押すと、1 にしたままにできる(もう一度押すと 0 に落ちる)

13、14、15。そして——0 に戻る。

15 を覚えているとき、図の上の「5 桁目」のランプを見てほしい。点いている。 加算器の答えは、1111 + 0001 = 10000。5 桁の答えが出ているのだ。

けれど、5 桁目の線はランプで止まっている。 戻る先のフリップフロップが無い。 レジスタに戻ってくるのは下の 4 桁、0000 だけだ。だから 15 の次は 0 になる。

「計算のしくみ」シリーズの第4回で、4 桁の数を輪に並べた。 1111 の次は 0000 で、15 と 0 は隣どうしだった。 そして第5回では、その継ぎ目をまたいだことを、5 桁目のランプが知らせていた。

カウンタは、あの輪を本当に回っている。 クロックが来るたびに 1 席ずつ進み、15 の席の次は 0 の席に着く。 ランプは点くが、回路はそれを気にせず回りつづける。

数取器

桁が尽きたら、0 に戻る

計算シリーズの第3回で出てきた数取器も、9999 の次は 0000 だった。 桁の数が決まっている数え器は、どれもこうなる。 カウンタは、まっすぐな数直線ではなく、輪の上を回っている。

足す数を、変えてみる

ここまで、足す数は 0001 に固定してきた。 では、これを変えられるようにしたら、どうなるか。

足す数を 5 にすれば、クロックが来るたびに 5 ずつ増える。 足す数を 10 にすれば、10 ずつ増える。 回路は何も変えていない。足す数のスイッチを押せるようにしただけだ。

こうして、入ってくる数を次々に足し込んでいくレジスタを、アキュムレータ(累算器)という。 「ためこむもの」という意味である。

これで、第1回の自動販売機の話ができる。 入れた金額を、覚えている金額に足して、覚え直す。まさにこれだ。

ただし、前回書いたとおり、4 桁で覚えられるのは 15 までだった。120 円は置けない。

そこで、名札を貼りかえる。 自動販売機で使える硬貨は、10 円玉からだ。1 円玉と 5 円玉は使えないことが多い。 それなら、1 の位を「10 円」と読めばいい。

1 を 10 円、5 を 50 円、10 を 100 円と読む。 4 桁で 15、つまり 150 円まで置ける。120 円は 12、1100 である。

計算シリーズの第4回や第8回と同じだ。 桁に名札を貼っているのは、回路ではなく読む側である。 回路が数えているのは、ずっと 0 から 15 までの数でしかない。

アキュムレータ シミュレータ

硬貨を選ぶと、足す数が置かれます。「クロックを入れる」で足されます。1 の位を 10 円と読みます

8 の位いま 0クロック全加算器AB4 の位いま 0クロック全加算器AB2 の位いま 0クロック全加算器AB1 の位いま 0クロック全加算器ABレジスタ加算器戻る先がないクロックの線は、左の 1 本だけクロック0足す数00005 桁目
覚えている数0000= 0(0 円)
足す数0000= 0(0 円)
加算器の答え0000= 0

硬貨を選んでから、「クロックを入れる」を押してください

入れる硬貨(足す数)

硬貨を選んでから、「クロックを入れる」を押してほしい。 100 円、10 円、10 円と入れていくと、覚えている数は 10、11、12。120 円だ。

次に、リセットしてから 100 円を 2 回入れてみてほしい。

40 円になる。

100 円は 10、1010 である。2 回足すと 20 で、15 を超える。 5 桁目があふれて、16 ぶん、つまり 160 円が消えた。 さきほどの 15 の次の 0 と、同じことが起きている。

500 円玉のことは、言うまでもない。50 は、4 桁にはそもそも入らない。 本物の自動販売機は、もっと桁の多いレジスタで覚えている。桁を増やすだけで済むことは、前回見たとおりだ。

ただし本物は、覚えている金額をそのまま数字で見せることはあまりない。 お金を入れると、その金額で買える商品のボタンだけが光る。 あれが、「いくら覚えているか」を知らせる表示である。

値段を表示したボタンが光っている自動販売機

光っているボタンは、もう買える

同じ加算器を、何度も

ここで、少し立ち止まって振り返りたい。

「計算のしくみ」シリーズでは、大きなことをするときは、いつも部品を並べてきた。 4 桁の足し算をするために、全加算器を 4 つ横に並べた。 掛け算では、加算器を 3 段に重ねた。 前回のレジスタも、フリップフロップを 4 つ並べたものだった。

今回の回路には、並べたものが 1 つも増えていない。

加算器は 4 桁ぶん、1 つだけ。 それでも、足し算は 1 回で終わらない。 クロックを 5 回入れれば 5 回、100 回入れれば 100 回、同じ加算器が足し算を繰り返す。

たとえば足す数を 3 にして、0 からクロックを 5 回入れてみる。 3、6、9、12、15。3 × 5 の答えが出る。

計算シリーズの第6回で、「掛け算は足し算の繰り返しだ」という素朴なやり方を考えたことがあった。 あのときは回路にする前に却下した。32 桁なら最大で約 43 億回もかかるからだ。 けれど、やり方そのものは時間さえあれば、たくさんの部品を用意せずとも、いまの回路でもうできてしまう。

部品を増やすのではなく、同じ部品を何度も使う。 並べたものを一度に通り抜けるのではなく、1 つのものを何度も通る。

覚える回路が無かったころ、回路にできたのは、入力を入れて答えが出るのを待つことだけだった。 答えが出たら、それで終わりだった。 いまは違う。答えを覚えておいて、次のクロックでもう一度使える。

覚える回路を手に入れたことで、回路は「時間」を使えるようになった。

ストップウォッチ

同じ文字盤を、何度も回る

クロックとクロックのあいだ

時間を使うのなら、その時間がどれだけ要るのかも見ておきたい。

クロックが落ちてから次に落ちるまでのあいだ、回路は何をしているのだろうか。 クロックを流しっぱなしにして、記録テープに残してみよう。 今度は 5 から数えはじめる。

クロックの速さ シミュレータ

5 から数えはじめます。クロックとクロックのあいだに、加算器の答えがどう動いているかを見てください

8 の位いま 0クロック全加算器AB4 の位いま 1クロック全加算器AB2 の位いま 0クロック全加算器AB1 の位いま 1クロック全加算器ABレジスタ加算器戻る先がないクロックの線は、左の 1 本だけクロック0足す数00015 桁目
覚えている数0101= 5
加算器の答え0110= 6
クロック8の位へ繰上り加算器の答え覚えている数

右へいくほど新しい。黄色の破線はクロックが落ちたところ。黄色の帯は、答えがまだ出そろっていないところと、数え間違えたところ

「クロックを流す」を押してください

クロックの速さ(1 周期のステップ数)

まず「ゆっくり」のまま、「クロックを流す」を押してほしい。

テープの「加算器の答え」の帯を見てほしい。 クロックが落ちるたびに、しばらく黄色い「計算中」になる。 そのあいだ、加算器はまだ答えを出しきっていない。 上の「加算器の答え」の表示を見ていると、関係のない数が一瞬ずつ出ては消えるはずだ。

長くかかるのは、たとえば覚えている数が 7 になった直後だ。 7 に 1 を足すと、繰り上がりが 1 の位から 8 の位まで、端から端まで伝わっていくからだ。 計算シリーズの第2回で見た、あの順番待ちである。 図の右の列を、繰り上がりが下から 1 段ずつ上っていくのが見えるはずだ。

数えてみると、クロックが落ちてから答えが出そろうまで、長いときで 11 ステップかかる。 フリップフロップが新しい数を出すまでに 4 ステップ。そこから加算器が落ち着くまでに 7 ステップ。 さらに、前のラッチがそれを受け取りきるのに 2 ステップ要る。 合わせて 13 ステップ。 クロックの 1 周期は、これより短くできない。

「ぎりぎり(13)」を選んでほしい。答えが黄色から戻った直後に、クロックが落ちる。それでも、ちゃんと数えられる。

では、「速すぎ(12)」にしたら、どうなるか。

7 の次が、0 になる。

8 の位への繰り上がりが届いたのは、クロックが落ちるほんの直前だった。 前のラッチがそれを受け取りきる前に、クロックが落ちてしまった。 下の 3 桁は 000 になれたが、8 の位は 1 を受け取りそこねた。 回路は、何度やっても 7 までしか数えられなくなる。

第4回で、こう書いた。

速いゲートも遅いゲートも、次の振り下ろしまでに終わってさえいればいい。

その「次の振り下ろしまで」が、この回路では 13 ステップということだ。

そして、この数は桁を増やすほど伸びる。 32 桁の加算器なら、繰り上がりが通る全加算器は 8 倍になる。 それだけ、クロックの間隔を空けなければならない。 コンピュータのクロックをどこまで速くできるかは、こういう「いちばん長い待ち時間」で決まっている。

入れていないのに、増えていく

話を自動販売機に戻そう。

さきほどのアキュムレータでは、硬貨を選ぶたびに、人間が「クロックを入れる」を押していた。 けれど本物の機械で、クロックを押す人はいない。 第4回で見たとおり、クロックは 0 と 1 を規則正しく繰り返す波で、ずっと流れつづけている。

では、流しっぱなしにしてみよう。

止まらないクロック シミュレータ

クロックを流したまま、お金が勝手に増えないようにしてください。クロックは止めずに

8 の位いま 0クロック全加算器AB4 の位いま 0クロック全加算器AB2 の位いま 0クロック全加算器AB1 の位いま 0クロック全加算器ABレジスタ加算器戻る先がないクロックの線は、左の 1 本だけクロック0足す数00015 桁目
覚えている数0000= 0(0 円)
足す数0001= 1(10 円)
加算器の答え0001= 1

「クロックを流す」を押してください。本物の自販機では、クロックは止まらずに流れつづけている

足す数

クロックが来た回数 0

足す数は、10 円のままにしてある。「クロックを流す」を押してほしい。

お金を入れていないのに、10 円ずつ増えていく。

第1回のモンスターマシンは、お金を吸い込んで何も覚えていなかった。 今度は逆だ。何も入れていないのに、どんどんお金が増えていく。 これではジュースが配り放題である。

クロックが来るたびに、この回路は必ず足してしまう。 足すのをやめさせるには、どうすればいいだろうか。

ひとつだけ条件をつけたい。クロックは止めないこと。 シミュレータで、増えるのを止める方法を探してみてほしい。

0 を、足せばいい

見つかっただろうか。

足す数を 0 円、つまり 0000 にすればいい。

クロックは流れつづけている。加算器は、クロックが来るたびに足し算をしている。 けれど足しているのは 0 だ。覚えている数に 0 を足しても、覚えている数のまま。 足し続けているのに、変わらない。

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

なぜクロックを止めてはいけないのか、とも思ったかもしれない。 前回見たとおり、クロックの線は 1 本を全員で分け合っている。 自動販売機の中には、金額を覚えるレジスタのほかにも、クロックで動く部品がたくさんある。 お金を入れていないからといって、1 本しかない線を止めるわけにはいかない。

止めるのではなく、0 を足す。 それなら、硬貨が入ったときだけ足す数が金額になり、それ以外は 0 になっていればいい。

では、「1 拍のあいだだけ金額を出して、次の拍では 0 に戻る」ものは、どう作るか。

これも、もう持っている。フリップフロップである。

フリップフロップは、クロックが落ちる瞬間に値を受け取り、次にクロックが落ちるまで、その値を出しつづける。 そして次の瞬間には、新しい値に書き換わる。 硬貨が来ていなければ、新しい値は 0 だ。 1 拍だけ出して、次の拍には入れ替わる。 フリップフロップが、もともとそういう部品なのだ。

そこで、硬貨のセンサーと加算器のあいだに、フリップフロップを 4 つ並べたレジスタ、つまり「投入口」を置く。 投入口は、センサーの金額をクロックに合わせて受け取り、ちょうど 1 拍のあいだだけ加算器に渡す。

もう 1 つ、いいことがある。 硬貨は、クロックの都合を知らずにやってくる。 クロックが落ちる直前に足す数が変わったら、さきほど見たように、加算器の答えは間に合わない。 投入口を通せば、足す数が変わるのはいつもクロックが落ちた直後になる。加算器は、まるまる 1 拍ぶん考えられる。

自動販売機 シミュレータ

クロックを流したまま、硬貨を入れてください。投入口の箱は、第5回のレジスタそのものです

8 の位いま 0クロック全加算器AB4 の位いま 0クロック全加算器AB2 の位いま 0クロック全加算器AB1 の位いま 0クロック全加算器AB投入口レジスタ加算器戻る先がないクロックの線は 1 本。投入口にも配るクロック05 桁目

投入金額 0

覚えている数0000= 0
投入口0000= 0(0 円)

「クロックを流す」を押してから、硬貨を入れてください

クロックが来た回数 0 そのうち足した回数 0

「クロックを流す」を押してから、硬貨を入れてみてほしい。

硬貨を入れると、右の投入口が 1 拍だけ金額を出し、次の拍には 0 に戻る。 足されるのは、1 枚につき 1 回だけだ。 何も入れていないあいだ、クロックは流れつづけているが、金額は変わらない。

入れた分だけ覚えて、入れていないあいだは覚えたまま。 第1回で書いたモンスターマシンは、ここでやっと、ふつうの自動販売機になった。

ただし、センサーが出す信号のほうには、ここでは踏み込まない。 硬貨がセンサーを通り抜ける時間は、クロックとは関係なく決まる。 それを「ちょうどクロック 1 回ぶん」に整えるには、もう一工夫いる。 このシミュレータでは、センサーは硬貨が来てから次にクロックが落ちるまで金額を出す、ということにしてある。

取り替えることは、まだできない

ジュースを買ったら、おつりを出して、覚えている金額を 0 に戻したい。

0 に戻すだけなら、覚えている数そのものを引けばいい。 引き算は足し算に化けるのだった(計算シリーズ第3回)。

けれど、もっと素直に「覚えている数を、別の数に取り替えたい」と思うと、困ったことに気づく。

前回は、レジスタの値 D にスイッチがつながっていた。好きな数を作って、そのまま書き込めた。 いまは、D の入口に加算器の出口がつながっている。 入口は 1 つしかなく、そこはもう加算器でふさがっている。

足し算の答えを入れたいときもあれば、まったく別の数を入れたいときもある。 入口の手前で、どちらを通すかを選べればいい。 その「選ぶ仕組み」は、また後の回で考えることにしよう。

ずらすのは、もうタダではない

最後に、掛け算の話に戻りたい。

さきほど、足す数を 3 にしてクロックを 5 回入れると、3 × 5 = 15 が出た。 これは計算シリーズの第6回で却下した「足し算の繰り返し」だった。 掛ける数が 5 なら 5 回、1000 なら 1000 回かかる。

あの回で代わりに使ったのは、筆算だった。 同じ 3 × 5 を、2 進法の筆算で足すとこうなる。 0011(3)に 0101(5)を掛ける。5 の桁を 1 の位から順に見て、1 なら 3 を、0 なら 0 を足していく。

何回目見る桁足すもの合計
11 の位(1)0011(3)3
22 の位(0)0000(0)3
34 の位(1)1100(12)15
48 の位(0)0000(0)15

掛ける数が何であっても、4 桁なら 4 回で終わる。 部分積を 1 本ずつ足していくこのやり方を、あの回ではシフト加算方式と呼んだ。 そして、こう書いていた。

代わりに、途中の合計を覚えておく場所が要る。

表の右端の「合計」がそれだ。足して、覚えて、また足す。 アキュムレータが、まさにその場所である。

では、いまの回路でこの表をそのまま動かせるだろうか。

「足すもの」の列を見てほしい。 1 回目は 0011、3 回目は 1100。 どちらも同じ 3 だが、3 回目は2 桁左にずれている。 筆算で、下の段ほど左へずらして書いた、あれである。

あの回では、「ずらすのはタダだ」と書いた。 部分積を一気に足す回路では、加算器を 3 つ並べていた。 ずらしたければ、その加算器への線を 1 つ隣につなげばよかった。 加算器ごとに、別々のつなぎ方ができたからだ。

いまの回路には、加算器が 1 つしかない。 足す数の線のつなぎ方も、1 通りしかない。 1 回目はずらさず、3 回目は 2 桁ずらす、という線の引き方はできない。

線を変えられないなら、数のほうを動かすしかない。 0011 をどこかに覚えておいて、クロックが来るたびに 01101100 と、1 桁ずつ左へ送っていく。 そうすれば、足す数の線は 1 通りのままで、毎回ちょうどいい位置の 3 が加算器に届く。

ずらすのは、もうタダではない。 覚えている数そのものを、クロックに合わせて動かさなければならなくなった。

覚えている数を、クロックが来るたびに 1 桁ずつ横へ送るには、どうすればいいだろうか。

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

参考文献

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