シリーズ「コンピュータの CPU のしくみ」 第1回

回路が「命令を読む」とは?

配線で決まった手順

自動販売機は、決まった手順で動いている。

硬貨を待つ。 硬貨が来たら、金額に足す。 金額が値段に届いたら、ボタンを光らせる。 ボタンが押されたら、商品を出して、おつりを返す。

この手順は、どこに書いてあるのだろう。

紙に書いてあるわけではない。 自動販売機の中の回路では、手順は配線で決まっている。 「硬貨が来たら、金額に足す」という線が、本当に引いてある。 『記憶のしくみ』を読んだ人は、最終回で作った自動販売機を思い出してほしい。あの回路は、段階の表を、そのまま AND と OR の配線にしたものだった。

配線で決まっているということは、手順を変えたければ、配線を引き直すしかない、ということでもある。 値段を変える。新しい商品を足す。硬貨を入れる順番によって違う動きをさせる。 どれも、回路を作り直すことになる。

電卓も同じだ。 足し算、引き算、パーセント、メモリー。 ボタンを押したときの手順を配線で決めておけば、機種ごとに機能が違うたびに、回路をまるごと作り直さなければならない。

1970 年ごろ、日本のある電卓の会社が、ちょうどこのことに困っていた。 その話は、この回の後半でする。

このシリーズでは、配線を 1 本も変えずに、手順だけを取り替えられる回路を作っていく。 シリーズの名前にある CPU が何のことなのかは、部品がそろう第3回で、あらためて書く。

手順を、メモリに置く

手順を配線に書かないなら、どこに書けばいいのか。

答えは、メモリだ。

メモリは、0 と 1 の並び(パターン)を、たくさんしまっておける箱である。 しまう場所には、0 から順に番号が付いている。この番号を番地という。 番地を入れると、その番地にしまってあるパターンが出てくる。 1 つの番地にしまうパターンのひとまとまりを、語という。

このシリーズのメモリは、16 語ぶん。番地は 0 から 15 までだ。

番地も、0 と 1 で書く。 4 桁あれば、0000 から 1111 までの 16 通りが書ける。

読み方は、右から順に、1 の位、2 の位、4 の位、8 の位。 1 の立っている位を足せば、ふつうの数になる。

パターン読み方番地
0000どの位も 00
00112 + 13
11018 + 4 + 113
11108 + 4 + 214
11118 + 4 + 2 + 115

『記憶のしくみ』を読んだ人は、第8回で作った 4 語のメモリを思い出してほしい。ここで使うのは、それを 16 語・8 桁に広げたもので、番地はやはりデコーダが選んでいる。

さて、ここに手順を置く。

手順を 1 つずつ、決まった形のパターンにする。 それを、0 番地から順に並べてしまっておく。

こうして、手順の 1 つぶんを表したパターンを、命令という。 命令を並べたものを、プログラムという。

1 語は 8 桁

このシリーズの CPU では、1 語を 8 桁にする。 命令として読むときは、8 桁を 4 桁ずつに分ける。

  • 上 4 桁 … 何をするか
  • 下 4 桁 … どの番地を使うか

たとえば 0010 1111 なら、上 4 桁の 0010 が「足す」、下 4 桁の 1111 が「15 番地」。 合わせて「15 番地の数を、足す」という命令になる。

では、3 + 5 を計算するプログラムを書いてみよう。 計算の途中の数を置いておく場所を、ここでは「手元」と呼んでおく。手元を回路でどう作るかは、あとの回の話だ。

番地中身読み方
00001 111014 番地の数を、手元に持ってくる
10010 111115 番地の数を、手元の数に足す
20011 1101手元の数を、13 番地に書き込む
31111 0000止まる
4〜120000 0000(何も書いていない)
130000 0000答えを置く場所
140000 0011数 3
150000 0101数 5

0 番地から 3 番地までの 4 つが、命令だ。 上から順にやれば、手元に 3 を持ってきて、5 を足して、8 を 13 番地に書き込んで、止まる。

14 番地と 15 番地には、命令ではなく数が入っている。 数として読むときは、下 4 桁だけを使う。0011 は 3、0101 は 5 だ。

中身の列を、もう一度見てほしい。 手順も、数も、メモリの中では 8 桁のパターンが並んでいるだけである。

番地を、数える

手順は、メモリに置けた。 次は、これを 0 番地から順に取り出したい。

順に取り出すには、いま何番地まで読んだのかを覚えておいて、1 つ読むたびに 1 進めればいい。

この「1 ずつ進める」箱を、カウンタという。 クロックという合図が来るたびに、覚えている数に 1 を足す。 クロックは、回路の中の箱たちに「いま、受け取れ」と知らせる合図だ。0 と 1 を、規則正しく繰り返す。 0000、0001、0010、0011……と進み、1111(15)の次は 0000 に戻る。 4 桁しかないので、16 になる 5 桁目の 1 は、捨てられてしまうからだ。

『記憶のしくみ』を読んだ人は、第6回のカウンタを思い出してほしい。ここで使うのは、あれとまったく同じものだ。

このカウンタの出口を、メモリの番地の入口につなぐ。 カウンタが 0011 なら、メモリからは 3 番地の語が出てくる。

次に読む番地を覚えておくこのカウンタを、プログラムカウンタという。 このシリーズでは、番地のカウンタと呼ぶことにする。

メモリから出てきた語は、もう 1 つの箱で受け取る。 8 桁を覚えておける箱だ。命令レジスタという。 このシリーズでは、命令の置き場と呼ぶ。 中身は、『記憶のしくみ』の第5回のレジスタを、8 桁にしたものだ。

クロックの線は 1 本だけ引き、番地のカウンタと命令の置き場の両方に届ける。 クロックが来ると、2 つの箱が同時に受け取る。

  • 命令の置き場は、メモリから出てきている語を受け取る
  • 番地のカウンタは、1 を足した数を受け取る

命令の置き場が受け取るのは、カウンタが進む前の番地の語だ。 受け取るのは、クロックが 1 から 0 に落ちる一瞬で、そのときメモリから出ているのは、まだ前の番地の語だからである。 第4回のフリップフロップが、ここでも効いている。

押して、確かめる

組み立てた回路を動かしてみよう。

命令を読む シミュレータ

「クロックを入れる」を押すたびに、番地のカウンタが指している語が、命令の置き場に届きます

番地のカウンタ0000 = 0メモリ(16 語)0001 1110番地命令の置き場0000 0000クロックの線は 1 本。2 つの箱が同時に受け取るクロック0

太い線は束(番地は 4 本、語は 8 本)。メモリの箱の中の数字は、いま出てきている語。中身の全部は下の表

メモリからは、番地のカウンタが指している 0 番地の語 0001 1110 が出てきている。クロックを入れると、これが命令の置き場に届く

読んだ番地の順:まだ読んでいない
番地中身読み方(人間のメモ)
0000(0)0001 1110持ってくる 14 番地
0001(1)0010 1111足す 15 番地
0010(2)0011 1101書き込む 13 番地
0011(3)1111 0000止まる
0100(4)0000 0000
0101(5)0000 0000
0110(6)0000 0000
0111(7)0000 0000
1000(8)0000 0000
1001(9)0000 0000
1010(10)0000 0000
1011(11)0000 0000
1100(12)0000 0000
1101(13)0000 0000数 0(答えを置く場所)
1110(14)0000 0011数 3
1111(15)0000 0101数 5

青い行が、番地のカウンタが指している番地。次のクロックで、この行の語が命令の置き場に届く

上から、番地のカウンタ、メモリ、命令の置き場。 メモリの中身は、下の表にある。さきほどの 3 + 5 のプログラムを、シミュレータがはじめに書き込んでおいた(書き込むしくみは、あとの回で作る)。

はじめ、番地のカウンタは 0000。 メモリからは、0 番地の語 0001 1110 が出てきている。 表の青い行が、いま指している番地だ。

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

0001 1110 が、命令の置き場に届いた。 番地のカウンタは 0001 に進み、表の青い行も 1 番地に下りた。 メモリからは、もう次の語 0010 1111 が出てきている。

続けて 3 回押すと、1 番地、2 番地、3 番地の語が、順に命令の置き場に届く。

3 番地の語は 1111 0000、「止まる」のつもりで置いた命令だ。 ところが、もう一度押すと、番地のカウンタは 5 に進む。 回路は、止まらない。

そのまま押しつづけてほしい(「自動で進める」でもいい)。 0000 0000 のままの 4〜13 番地も、数を置いた 14・15 番地も、同じように 1 語ずつ命令の置き場に運ばれてくる。 15 番地の次は、0 番地に戻る。そして、また 0001 1110 から読みはじめる。

どこで押しても、同じことが言える。 クロックを n 回入れたあと、番地のカウンタは n。命令の置き場には、n − 1 番地の語が入っている。 (16 回目からは 0 に戻るので、16 で割った余りで数える)

この図の 3 つの箱の中では、本物のゲートが 1700 個あまり働いている。 そのうち 1400 個あまりは、メモリの 16 語 × 8 桁を覚えている部分だ。

読むだけでは

さて、何が起きただろうか。

じつは、何も起きていない。

3 + 5 のプログラムを読んだのに、13 番地は 0000 0000 のままだ。 3 も 5 も、どこにも足されていない。 止まる命令を読んでも、止まらなかった。

この回路がしているのは、番地を 1 つずつ数えながら、そこにある語を命令の置き場に運ぶことだけである。 運んできたパターンが「足す」なのか「止まる」なのか、数なのか、回路は見ていない。

それでも、ここで大事なことが 1 つ起きている。

手順が、配線ではなくなったのだ。

いま、回路の配線は、「番地を 1 つずつ数えて、その語を運ぶ」ことしか決めていない。 3 + 5 をするという手順は、どこにも配線されていない。 メモリの中に、パターンとして並んでいるだけだ。

だから、メモリの中身を替えれば、回路は 1 本も変えずに、手順が替わる。 3 + 5 の代わりに 7 + 2 をしたければ、14 番地と 15 番地を書き換えればいい。 手順そのものを変えたければ、0 番地からの命令を書き換えればいい。

手順を配線ではなくメモリの中のパターンとして置き、番地を 1 つずつ数えながら読めば、パターンが順番に並んだ手順になる。

ただし、読む順番は、いまのところ番地の順だけだ。 番地のカウンタは、1 つずつ進むことしかできない。 飛ばしたり、戻ったりする方法は、もう少し先の回で考える。

1 節で、日本の電卓の会社が困っていた、と書いた。その話をしておこう。

1969 年、電卓を作っていた日本の会社ビジコンが、アメリカの半導体の会社インテルに、電卓のための部品を頼んだ。 当時の電卓は、手順を配線で決めていて、機能を変えるのが難しかった。 ビジコンは、いくつもの機種に使い回せる部品を求めていて、電卓の機能をプログラムで実現することを考えていた。

インテルのテッド・ホフは、もっと思い切った案を出した。 4 桁の 2 進数を扱う、ごく単純な命令だけを持つ、汎用の部品にする。 電卓としてのふるまいは、すべてプログラムで書けばいい。

ビジコンの技術者だった嶋正利は、この部品の論理設計(ゲートをどう組むか)などを受け持った。 インテルのフェデリコ・ファジンが、それを 1 枚のチップの上の回路にした。

1971 年 11 月、この部品は 4004 という名前で発表された。 一度に扱えるのは 4 桁。トランジスタは 2300 個ほど。 このシリーズで作る CPU も、数は 4 桁である。

読んだあとは

シミュレータを、もう一度はじめに戻して、クロックを 2 回入れてみてほしい。

命令の置き場には、0010 1111 が入っている。 人間が読めば、「15 番地の数を、足す」だ。表の読み方の欄にも、そう書いてある。

けれど、この欄は灰色にしてある。 人間のためのメモで、回路はこの欄を見ていない。

回路にとって、0010 1111 は 8 本の線のうち、4 本が 1 になっているというだけである。 「足す」という言葉も、「15 番地」という言葉も、回路は知らない。

それでも、このパターンが届いたら、回路は 15 番地の数を手元に足さなければならない。 1111 0000 が届いたら、止まらなければならない。

そのためには、上 4 桁を見て、動かす箱を選ぶ何かが要る。 けれど、意味を知らない回路に、そんなことができるのだろうか。

回路は、命令をどうやって見分けるのか。

次回は、命令の置き場に届いたパターンの、上 4 桁に目を向ける。

参考文献

シリーズ「コンピュータの CPU のしくみ」