シリーズ「コンピュータの 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 | どの位も 0 | 0 |
0011 | 2 + 1 | 3 |
1101 | 8 + 4 + 1 | 13 |
1110 | 8 + 4 + 2 | 14 |
1111 | 8 + 4 + 2 + 1 | 15 |
『記憶のしくみ』を読んだ人は、第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 を計算するプログラムを書いてみよう。 計算の途中の数を置いておく場所を、ここでは「手元」と呼んでおく。手元を回路でどう作るかは、あとの回の話だ。
| 番地 | 中身 | 読み方 |
|---|---|---|
| 0 | 0001 1110 | 14 番地の数を、手元に持ってくる |
| 1 | 0010 1111 | 15 番地の数を、手元の数に足す |
| 2 | 0011 1101 | 手元の数を、13 番地に書き込む |
| 3 | 1111 0000 | 止まる |
| 4〜12 | 0000 0000 | (何も書いていない) |
| 13 | 0000 0000 | 答えを置く場所 |
| 14 | 0000 0011 | 数 3 |
| 15 | 0000 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回のフリップフロップが、ここでも効いている。
押して、確かめる
組み立てた回路を動かしてみよう。
命令を読む シミュレータ
「クロックを入れる」を押すたびに、番地のカウンタが指している語が、命令の置き場に届きます
太い線は束(番地は 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 桁に目を向ける。
参考文献
- 松下俊介 著. 基礎からわかる論理回路. 第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
- 渡波郁 著. CPUの創りかた : IC10個のお手軽CPU設計超入門 : 初歩のデジタル回路動作の基本原理と製作, 毎日コミュニケーションズ, 2003.9. 4-8399-0986-5. https://ndlsearch.ndl.go.jp/books/R100000002-I000004238574
- 嶋正利. "マイクロプロセッサ 4004 の開発". 半導体産業人協会 会報, No.74, 2012.1. https://www.shmj.or.jp/dev_story/pdf/develop43.pdf, (参照 2026-10-13).
- Intel. "Intel Marks 50th Anniversary of the Intel 4004". Intel Newsroom, 2021. https://www.intel.com/content/www/us/en/newsroom/news/intel-marks-50th-anniversary-4004.html, (参照 2026-10-13).
- Computer History Museum. "1971: Microprocessor Integrates CPU Function onto a Single Chip". The Silicon Engine. https://www.computerhistory.org/siliconengine/microprocessor-integrates-cpu-function-onto-a-single-chip/, (参照 2026-10-13).