シリーズ「コンピュータの記憶のしくみ」 第6回
回路が「足し続ける」とは?
輪に、つなぐ
前回、4 桁の数を覚えるレジスタができた。 クロックが落ちる瞬間に、4 桁をいっぺんに書き込む。
けれど、書き込む数は、まだ人間がスイッチで作っていた。
今回は、そのスイッチを外す。 代わりに、レジスタの出力を加算器に通して、答えをレジスタの値 D に戻す。
やることは、これだけだ。
- レジスタの出力を、加算器の入力 A につなぐ。
- 加算器のもう片方の入力 B には、
0001を置いておく。 - 加算器の答えを、レジスタの値 D につなぐ。
レジスタは前回のもの。加算器は「計算のしくみ」シリーズの第2回で作ったもの。 新しい部品は、今回も 1 つも要らない。 出力が入力へ戻ってくるので、回路は輪になる。
まずは、触ってみてほしい。
カウンタ シミュレータ
「クロックを入れる」を押すたびに、覚えている数が 1 ずつ増えます
左の箱は第5回のフリップフロップ、右の箱は計算シリーズ第2回の全加算器。足す数は 0001 に固定
加算器は、もう次の答え(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 ずつ増えます
左の箱は第5回のフリップフロップ、右の箱は計算シリーズ第2回の全加算器。足す数は 0001 に固定
加算器は、もう次の答え(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 の席に着く。 ランプは点くが、回路はそれを気にせず回りつづける。
計算シリーズの第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 円と読みます
硬貨を選んでから、「クロックを入れる」を押してください
硬貨を選んでから、「クロックを入れる」を押してほしい。 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 から数えはじめます。クロックとクロックのあいだに、加算器の答えがどう動いているかを見てください
右へいくほど新しい。黄色の破線はクロックが落ちたところ。黄色の帯は、答えがまだ出そろっていないところと、数え間違えたところ
「クロックを流す」を押してください
まず「ゆっくり」のまま、「クロックを流す」を押してほしい。
テープの「加算器の答え」の帯を見てほしい。 クロックが落ちるたびに、しばらく黄色い「計算中」になる。 そのあいだ、加算器はまだ答えを出しきっていない。 上の「加算器の答え」の表示を見ていると、関係のない数が一瞬ずつ出ては消えるはずだ。
長くかかるのは、たとえば覚えている数が 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 を規則正しく繰り返す波で、ずっと流れつづけている。
では、流しっぱなしにしてみよう。
止まらないクロック シミュレータ
クロックを流したまま、お金が勝手に増えないようにしてください。クロックは止めずに
「クロックを流す」を押してください。本物の自販機では、クロックは止まらずに流れつづけている
クロックが来た回数 0
足す数は、10 円のままにしてある。「クロックを流す」を押してほしい。
お金を入れていないのに、10 円ずつ増えていく。
第1回のモンスターマシンは、お金を吸い込んで何も覚えていなかった。 今度は逆だ。何も入れていないのに、どんどんお金が増えていく。 これではジュースが配り放題である。
クロックが来るたびに、この回路は必ず足してしまう。 足すのをやめさせるには、どうすればいいだろうか。
ひとつだけ条件をつけたい。クロックは止めないこと。 シミュレータで、増えるのを止める方法を探してみてほしい。
0 を、足せばいい
見つかっただろうか。
足す数を 0 円、つまり 0000 にすればいい。
クロックは流れつづけている。加算器は、クロックが来るたびに足し算をしている。 けれど足しているのは 0 だ。覚えている数に 0 を足しても、覚えている数のまま。 足し続けているのに、変わらない。
拍子抜けするほど簡単である。
なぜクロックを止めてはいけないのか、とも思ったかもしれない。 前回見たとおり、クロックの線は 1 本を全員で分け合っている。 自動販売機の中には、金額を覚えるレジスタのほかにも、クロックで動く部品がたくさんある。 お金を入れていないからといって、1 本しかない線を止めるわけにはいかない。
止めるのではなく、0 を足す。 それなら、硬貨が入ったときだけ足す数が金額になり、それ以外は 0 になっていればいい。
では、「1 拍のあいだだけ金額を出して、次の拍では 0 に戻る」ものは、どう作るか。
これも、もう持っている。フリップフロップである。
フリップフロップは、クロックが落ちる瞬間に値を受け取り、次にクロックが落ちるまで、その値を出しつづける。 そして次の瞬間には、新しい値に書き換わる。 硬貨が来ていなければ、新しい値は 0 だ。 1 拍だけ出して、次の拍には入れ替わる。 フリップフロップが、もともとそういう部品なのだ。
そこで、硬貨のセンサーと加算器のあいだに、フリップフロップを 4 つ並べたレジスタ、つまり「投入口」を置く。 投入口は、センサーの金額をクロックに合わせて受け取り、ちょうど 1 拍のあいだだけ加算器に渡す。
もう 1 つ、いいことがある。 硬貨は、クロックの都合を知らずにやってくる。 クロックが落ちる直前に足す数が変わったら、さきほど見たように、加算器の答えは間に合わない。 投入口を通せば、足す数が変わるのはいつもクロックが落ちた直後になる。加算器は、まるまる 1 拍ぶん考えられる。
自動販売機 シミュレータ
クロックを流したまま、硬貨を入れてください。投入口の箱は、第5回のレジスタそのものです
投入金額 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 を足していく。
| 何回目 | 見る桁 | 足すもの | 合計 |
|---|---|---|---|
| 1 | 1 の位(1) | 0011(3) | 3 |
| 2 | 2 の位(0) | 0000(0) | 3 |
| 3 | 4 の位(1) | 1100(12) | 15 |
| 4 | 8 の位(0) | 0000(0) | 15 |
掛ける数が何であっても、4 桁なら 4 回で終わる。 部分積を 1 本ずつ足していくこのやり方を、あの回ではシフト加算方式と呼んだ。 そして、こう書いていた。
代わりに、途中の合計を覚えておく場所が要る。
表の右端の「合計」がそれだ。足して、覚えて、また足す。 アキュムレータが、まさにその場所である。
では、いまの回路でこの表をそのまま動かせるだろうか。
「足すもの」の列を見てほしい。
1 回目は 0011、3 回目は 1100。
どちらも同じ 3 だが、3 回目は2 桁左にずれている。
筆算で、下の段ほど左へずらして書いた、あれである。
あの回では、「ずらすのはタダだ」と書いた。 部分積を一気に足す回路では、加算器を 3 つ並べていた。 ずらしたければ、その加算器への線を 1 つ隣につなげばよかった。 加算器ごとに、別々のつなぎ方ができたからだ。
いまの回路には、加算器が 1 つしかない。 足す数の線のつなぎ方も、1 通りしかない。 1 回目はずらさず、3 回目は 2 桁ずらす、という線の引き方はできない。
線を変えられないなら、数のほうを動かすしかない。
0011 をどこかに覚えておいて、クロックが来るたびに 0110、1100 と、1 桁ずつ左へ送っていく。
そうすれば、足す数の線は 1 通りのままで、毎回ちょうどいい位置の 3 が加算器に届く。
ずらすのは、もうタダではない。 覚えている数そのものを、クロックに合わせて動かさなければならなくなった。
覚えている数を、クロックが来るたびに 1 桁ずつ横へ送るには、どうすればいいだろうか。
次回は、それを考えてみよう。
参考文献
- 松下俊介 著. 基礎からわかる論理回路. 第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://j.cocacola.co.jp/info/faq/detail.htm?faq=19863, (参照 2026-9-23).