これはマイナビ出版の書籍

作ろう! CPU ~基礎から理解するコンピューターのしくみ~

のサポートページです。

本書を購入して下さった方へ

買ってくださってありがとうございます。 感謝感謝です。 たぶん本書の11ページあたりを読んで、このサイトに来て下さったと思います。 そこで

回路を動かす手順

↑ のリンクを開いて CPU を作り、FPGA で動かして下さい。

また本書の図は色覚異常の方に大変見にくい図になっております。 ご不便をおかけして申し訳ありません。 対応策として、色を変更したPDFを配布しております。 詳細は下記リンクをご参照ください。

https://book.mynavi.jp/ec/products/detail/id=116654

また誤植については 誤植のページ をご参照下さい。

未購入の方へ

本書は CPU を作る本です。 コンピューターの頭脳と呼ばれる、あの CPU を自分で作るのです。 下記PDFリンクにて、1章末までの内容を無料公開しています。

https://book.mynavi.jp/files/topics/116654_ext_90_0.pdf

さて本書のストーリーについてですが、

要するに本書は超初心者に向けた自作CPUの解説本です。 他書よりはるかに丁寧に書きましたので、一冊目の入門本としてお薦めです。

CPUを作る上で具体的にやることは

作業内容はプログラミングと似ています。 開発環境は無料なので、書籍代以外はタダで CPU の製作に取りかかれます。 とりあえず無料のシミュレーターで CPU を動かして、さらに興味が湧いたら FPGA (1万円ぐらい) を買うのが良いと思います。

作る労力については、CPUのコード行数がわずか69行 なので超簡単に作れます。 完成する CPU は単純で低機能なので、強い CPU を作りたい方は、本書を読んだ後で更にハイレベルな本に挑戦すると良いでしょう。

以下では製作する CPU を眺めてみます。

上図は本書で設計する CPU を、 FPGA 開発環境の回路図ビューアーで表示したものです。 まぁよく分からないと思いますが、本書を読めば全て分かります。

上図は本書で設計するマザーボードです。 CPU だけ作っても動かないので、マザーボードや ROM (メモリー) も作っています。 要するに本書は CPU だけでなく、コンピューター全体を設計して動かす本なのです。

上図は CPU を動かしたときの、電圧変動のタイムチャートです。 さっぱり意味不明だと思いますが、上から3段目のIN_BとかMOV_A_IMMとかADD_A_IMMは、いわゆる「機械語」というやつです。 本書を読めば CPU の言葉が分かるようになります。

本書の購入をご希望の方は オンライン書店のリンク をご参照ください。

動作環境について

本書の紙面内では、回路図の読み方や回路の設計方法など、ツール類にとらわれない「考え方」だけを説明しています。 著者としては、FPGA の実機動作はあくまでオプションで、むしろ FPGA をさわる前に知っておくべき基礎知識を紙面に書いたつもりです。 FPGA 開発環境のインストール方法や操作方法については、紙面に載せず、この web サポートページに記載しています。

OSについて

開発に用いるパソコンのOSについては

OS名 オススメ度
Windows10 ◎(初体験ならこれがオススメ)
Ubuntu18.04 △(一応動くけどハマりやすい)
MacOS ☓ (動かすのがかなり大変)

FPGAの開発環境を整えるのは結構大変なので、ユーザーの多いWindows10が圧倒的にオススメです。 UbuntuやMacOSでFPGAを触るのは、慣れていないと難しいのが実情です。 この web サポートページでは Windows10 だけを対象に説明します。

FPGA評価ボードについて

動作検証済みの FPGA 評価ボードは、以下の3点です。 どれも10000円程度で購入できます。

FPGAの名前 メーカー 開発環境ソフト オススメ度
Arty S7-50 Xilinx Vivado
Arty Xilinx Vivado
DE0-Nano Intel Quartus

各ボードの詳細はこちらをご参照下さい。 この他にも、スイッチとLEDがそれぞれ4個以上搭載されているFPGAボードなら、ほぼ確実に動くと思われます。

いろいろな方への紹介文

本書の主な想定読者は、電気や回路や CPU について何も知らない方です。 しかし回路に詳しい方々からも、「こんな考え方があるのか!」という驚きの声を多数いただいております。 筆者として、本当に嬉しい限りです。 様々なバックグラウンドの方に楽しんでいただくために、以下に10通りの紹介文をひねり出したので、興味のある項目に目を通してもらえると幸いです。

電気や回路を全然知らない方へ

本書のメインの対象読者は、CPU や電子回路について全然知らない方です。 コンピューターに関しては「マザーボードの上に CPU とメモリーが載っている」ぐらいの知識があれば十分です。 プログラミングについては無経験でも大丈夫ですが、「関数・変数・代入・if文」あたりを知っていると多少役に立ちます。

本書は基礎を大変重視しています。 小学校レベルの豆電球の回路から、CPU まで、一歩ずつ真面目に丁寧に解説していきます。 そのため他の CPU 自作本と比べると、完成する CPU の機能はやや劣ります。 高機能な CPU が作りたい方は、とりあえず一冊目に本書を読んで、その後で他書にチャレンジするのが良いと思います。

本書は FPGA という「回路生成装置」を使って CPU を作る、という建前になっています。 この装置は外付けの USB 機器で、1万円ほどで購入できます。 ハンダゴテやピンセットは一切不要なので、手先が不器用でも問題なく作れます。

とはいえ正直なところ、FPGA の開発環境を整えるのは面倒な作業です。 「実際に動かさないと意味ない」という意見もあるかもしれませんが、筆者の本音としては FPGA を買わずに本書を読むだけでも十分だと思っています。 本書のメインは FPGA で遊ぶことではなく、むしろ「CPUの作りかたを理解する」ことなのです。

とりあえず本書を手にとって、12章まで読んでみて下さい。 パソコン・ゲーム機・炊飯器・キッチンタイマーのようなデジタル家電の内部で、電子がどのように動いているのか直感的に理解できます。 これらのハードウェアが、どのように設計され、どのような言語で記述されるのか、だいたい理解できるはずです。 身の回りの電化製品が、原理不明のブラックボックスから「頑張れば自分でも設計できそうなモノ」になれば、筆者としては嬉しい限りです。

プログラマーの方へ

本書で作るのは、TD4と呼ばれている 4bit の CPU です。 能力については、以下のC言語のコードが動きます。

int main(void) {
  int a, b;
  b = read_switch(); // キーボードの値を読み取る関数

  do {
    led(b);          // ディスプレイに値を表示する関数

    a = 13;
    do {
      a = a + 1;
    } while (a < 16);

    b = b + 1;
  } while (b < 16);

  do {
    led(0);
    led(15);
  } while (true);

  return 0;
}

コードの内容はさておき、一応それなりのプログラムが動く CPU なのです。 この動作のしくみが回路レベルで理解できれば、日常的に書いておられるコードが動く様子もだいたい理解できると思います。

ちなみに本書では、SystemVerilog という言語を使って CPU の回路図を記述します。 これはプログラミング言語ではなく、ハードウェア記述言語と呼ばれるもので、関数型言語の親戚です。 多くの方にとって馴染みが薄いと思われるので、本書ではハードウェア記述言語について多くのページを割いて解説しています。

ハードウェア記述言語の知識は一生モノです。 数十年前から回路パーツは全く変わっておらず (小さくなっただけ) 、回路図を記述する言語にも大した変化はありませんでした。 情報科学の最底辺レイヤーで、物理層と密着しているので、めったなことでは変わらないのです。 web 系のように一瞬で知識が陳腐化する心配がないので、習得するとオトクだと思います。

情報学科の学生さんへ

お疲れさまです。 多くの学校では、ブール代数・2進数・加算器などを教わった後に、いきなり「ハードウェア記述言語で CPU を作れ」という課題が降ってくるようです。 そして右も左もわからないまま、とりあえず適当にコードを書いてコンパイルすると、一応それっぽく動いたので、単位はもらえそう、みたいになるようです。 しかし何だかモヤモヤとした気持ちが残ってしまいます。

あなたは悪くありません。 ハードウェア記述言語という馴染みのないものを、ろくな事前知識のないまま押し付けられても、混乱して当たり前です。 そこで本書が役立つのです。 これを読めば、ハードウェア記述言語 (SystemVerilog) についてしっかり理解できます。 とりあえず本書の4章から7章まで読めば、迷うことなく SystemVerilog が書けるようになります。

「ウチの学校では SystemVerilog じゃなくて Verilog-HDL を使う」という方でも、本書は役に立つと思います。 Verilog-HDL の文法は (私見ですが) 極めて醜悪で、それをきれいに整備した後継言語が SystemVerilog です。 遠回りのようですが、まず先に SystemVerilog の文法を知った上で、Verilog-HDL を書く方が楽だと思います。 「ウチの学校では VHDL を使わされる」という方についても、本書の知識が無駄になることはないでしょう。 言語の見た目は異なりますが、結局のところ、論理回路を記述するという点は共通しているからです。

論理回路を教えておられる先生方へ

本書は「もし自分が論理回路学の担当教員だったらどんな講義内容にしようか」と考えて執筆しました。 既存の教科書の説明を全て忘れて、ストーリーをゼロから再構築したつもりです。 これまで必須とされてきた話題であっても、不要だと判断すれば躊躇なく削除しています。

そもそも従来の論理回路の教科書は、組合回路に偏重しすぎていたと筆者は考えています。 具体的には、NANDの完備性・カルノー図・QM法といった話題です。 これらはブール代数を基礎とする秀麗な理論で、説明したくなる気持ちはよく分かります。 しかし「それが論理回路の基礎なのか?」と考えると、やや的を外しているように筆者には見えるのです。

かつて汎用ロジック IC が広く使われていた時代は、組合回路の最適化について習熟する必要がありました。 人力で組合回路を論理圧縮するために、最適化アルゴリズムの細部を詰める必要があったからです。 しかしHDLが普及するにつれ、論理圧縮はコンパイラの仕事になりました。 組合回路の最適化技法を習得する必要性は、昔と比べて大きく下がっています。

ところでHDLは有向グラフを記述する言語です。 プログラミングパラダイムがデータフロー型なので当然といえます。 この背後には「論理回路は有向グラフだ」という思想があります。 これこそ、論理回路の基礎であると筆者は考えています。 そこで本書では

という疑問からスタートして、「向き付け可能な回路」を論理回路と定義します。

組合回路については、DAG で定義します。 これをトポロジカルソートして、HDLの知識に基づいて式木(Expression Tree)に変換し、動作が純粋関数になることを示します。 また組合回路の設計は「真理値表を書く」という話題に置き換えて議論します。

順序回路についても、グラフ構造に基づいて系統的に説明します。 回路に対し、ある種の安定性を要求することで、ミーリー型回路やムーア型回路を自然に導出します。 そしてムーア型回路の具体例として、 単純な 4bit CPU を設計し、ハードウェア記述言語でコーディングして、シミュレーターと FPGA で動かします。

FPGAに挫折した経験のある方へ

多くの初心者が FPGA に挫折する原因は、ハードウェア記述言語 (HDL) の解説本のせいだと筆者は考えています。 初心者向けを謳う大抵の解説本には、

「コードを書く際にどのような回路が生成されるか想像せよ」

みたいなことが書かれています。 しかし具体的に、何をどう想像すればよいのか、まるで説明がありません。 これはそもそも考えかたの方向性が誤っています。 HDLは、その名の通り、ハードウェアを記述するための言語です。 ハードが先、コードは後です。 HDL を正しく理解したければ、まず第一に

「この回路を作りたい!」

という回路図を用意すべきです。 紙に回路図を描くのです。 そして (本書の4.2節の手順で) 回路図をコードに変換すれば、自動的に正しい HDL が生成されます。 本質的なポイントは、作りたい回路を用意するところだけです。 その後のコーディングは純然たる作業で、頭を悩ませる必要はありません。

HDL を理解する上で重要なポイントは、以下の2つを分けて考えることです。

  1. 回路の構造
  2. 電圧の動作

前者が重要です。 回路図を、電気や電圧と何の関係もない純粋な「絵」だと考えて下さい。 この絵 (有向グラフ) を描くためのペイントツールが HDL なのです。 本書はこうした立場で HDL を解説しています。

ハードウェア記述言語に詳しい方へ

ある程度 HDL (SystemVerilog) に詳しい方なら、本書の内容は自明に感じることばかりです。 具体的には以下のような内容が書かれています。

本書の特色は、トランジスタから RTL まで、首尾一貫して「有向グラフ」を意識して説明していることです。 そもそもハードウェア記述言語はデータフロー型言語であり、つまり有向グラフを記述するための言語です。 これを意識している論理回路の本が、(筆者の知る限り) 見当たらないので、本書を執筆しました。

アナログ回路に詳しい方へ

本書は FPGA 使用を前提として書かれています。 そのため論理回路の「芯」の部分しか扱っていません。 つまりアナログにまつわる難しい話題は、全て無視しています。 具体的にはスイッチのチャタリングやドライバの駆動能力、寄生容量や寄生インダクタンスといった話題を扱っていません。 これらについては、本書の命令セット(TD4)の元ネタの「CPUの創りかた」に秀逸な説明があるので、詳細は割愛しています。 本書の回路図を見ると腹が立つかもしれませんが、許していただけると幸いです。

別軸の言い訳ですが、何を作るにせよ、まずは原理的な「ミニマルなモデル」を知るのが重要だと筆者は考えています。 その後で「愚直に作ると動かなった」という挫折を経て、「安定的に動かすにはどうすればよいのか」という境地に達するのが健全だと思います。 本書はミニマルなモデルを説明するだけで手一杯でした。

物理に詳しい方へ

筆者も物理出身なのですが、IT 業界で働くことになりました。 そこで情報科学の基礎を理解するため、論理回路の本を数冊読みました。 当然ですが、どの本も「情報処理装置をいかにして回路実装するか?」というモチベーションで書かれていました。 これは一見分かりやすいのですが、しかし筆者には不満が残りました。 各論としては理解できるのですが、それらを統括する普遍的な物理・数理が見えてこなかったのです。

論理回路について深く理解するには、むしろ逆に「物理から出発して情報処理装置を作る」という立場で議論を進めるべきだと筆者は感じました。 階層構造的に考えると、下側の物理レイヤーを基礎として、上側の情報レイヤーを策定していくのが自然でしょう。 本書はそうした期待に答えるための本です。 以下では本書の理論構成を物理的な視点で概説します (詳細は本書の付録を参照) 。

まず電子回路に含まれる全ワイヤーの電位のリストを、状態と定義します。 電池や抵抗といったパーツは、電位に対する拘束条件と見なせます。 そして拘束条件を満たす状態を全て集めたものを、相空間と定義します。 解析力学における相空間と同じようなものだと思って下さい。 論理回路の場合は状態が離散化されるので、相空間が有限集合になります。

この相空間に時間発展のフローを入れます。 すると相空間の各点をノードとする有向グラフが得られます。 有向グラフ上の経路は、力学系でいうところの解軌道に対応します。 重要なポイントは解軌道の力学的安定性です。 例えばカオス的な解軌道が存在する場合、回路を操作したときの電圧変動が予測不能になってしまいます。

こうした不安定性は、回路の設計時に適切なルールを導入することで除去できます。 要するに回路の形を制限するのです。 そして全ての不安定性を取り除けば決定論的に動作する回路が得られます。 本書では、この決定論的な回路クラスを CPU と定義しています。

ここまでくれば、あとは人間の欲望のまま機能 (乗算器とか) を追加することで、どんどん便利な CPU に成長していきます。 そうした応用方面の話題については、既に多くの書籍が出版されているので、本書ではほとんど扱っていません。 また回路設計における最適化技法についても、必要最小限の記述にとどめました。 あくまで基礎的な話題に絞って、物理と情報をしっかり繋ぐことだけを念頭においています。

数学に詳しい方へ

本書は「論理回路の背後にひそむ数理構造を明瞭に整理したい」と考えて執筆しました。 「どうせブール代数のことだろう」と思うかもしれませんが、主眼はそこではありません。 むしろブール代数でわりきれない部分を整理したかったのです。 以下では議論の概要を説明します (詳細は本書の8.9節と付録を参照) 。

本書では一般的な電子回路を、ワイヤーを介してパーツ同士を繋いだ無向グラフとして定義します。 そこに段階的に「良い性質」を導入することで、特殊な回路クラスを定義していきます。 特に「電圧の二値性」と「向き付け可能性」を満たす回路を、論理回路と定義します。 また回路内の全ワイヤーの電圧値のリストを、回路の状態と定義します。 回路に含まれるスイッチを操作すると、状態が遷移します。 これは状態遷移図で表現できます。

ここで回路の幾何が効いてきます。 回路図で表現されるパーツ間の接続情報は、回路における位相幾何情報といえます。 そこで捨象されたワイヤーの長さなどの情報は、ある種の微分幾何情報といえます。 この位相構造と微分構造が、それぞれ状態遷移図のノードとエッジに対応するのです。

また一般に、論理回路の状態遷移は確率過程になります。 つまり遷移にランダムネスが含まれるのです。 ここにいくつかのルールを追加すれば、ランダムネスが排除され、決定論的に動く回路クラスが構成できます。 この回路クラスこそ、世間で CPU と呼ばれているものです。

以上がざっくりとした議論の流れです。 一般から特殊に向かって段階的にルールを追加し、CPU を導出する本なのです。 メインの対象読者は数学に強い人ではないので、ほとんどの議論は具体例だけで済ませています。 また筆者自身、それほど数学に強いわけではないので、厳密に考えるとヤバい箇所が残っているかもしれません。 査読を受けた原稿でもないので、眉に唾をつけて読んでいただけると幸いです。

人間の欲望を重視する方へ

私が調査したところ、大半の論理回路の教科書は

のように話が進んでいきます。 これは「人間の欲望」に沿ったストーリーといえます。 欲望を叶えるための回路を、各論的に提供するスタイルです。

一方、本書には人間の欲望がほとんど登場しません。 そのかわりに「回路そのものの性質」を重視しています。 雰囲気としては以下のような感じです。

いきなり算数になって恐縮ですが、本書のストーリーはこの四角形の分類と似ています。

と同じノリで

という具合に、小3理科で習う電池と豆電球の回路から CPU を導出する本なのです。

回路設計の歴史を振り返ると、その根本に人間の欲望があったと思います。 本書はそうした歴史や文化を蔑ろにする本です。 因習にとらわれず、ひたすら数理的整合性だけを突き詰めて、身も蓋もない形式で全てを理解するための本といえます。

オンライン書店のリンク

PDF版をご希望の方はマイナビ出版のサイトからご購入ください。 紙版は実店舗かオンライン書店でお買い求めいただけます。 またKindle版も提供いたしております。

ショップ リンク
マイナビ出版 https://book.mynavi.jp/supportsite/detail/9784839968519.html
アマゾン https://www.amazon.co.jp/gp/product/4839968519
楽天ブックス https://books.rakuten.co.jp/rb/16392746
セブンネットショッピング https://7net.omni7.jp/detail/1107117531
honto https://honto.jp/netstore/pd-book_30422205.html
紀伊国屋BookWeb https://www.kinokuniya.co.jp/f/dsg-01-9784839968519
TSUTAYAオンライン http://shop.tsutaya.co.jp/book/product/9784839968519/
HonyaClub https://www.honyaclub.com/shop/g/g20001707/
e-hon https://www.e-hon.ne.jp/bec/SA/Detail?refShinCode=0100000000000034105477
ヤマダモール https://ymall.jp/books/9784839968519/
ネオウイング https://www.neowing.co.jp/product/NEOBK-2526775
DMM.com https://www.dmm.com/mono/book/-/detail/=/cid=bkt34105477/
ヨドバシドットコム https://www.yodobashi.com/product/100000009003309434/
ヤフーショッピング https://shopping.yahoo.co.jp/search?p=9784839968519&uIv=off

その他のリンク

ページ URL
バグ・誤植の報告先 https://github.com/amane-uehara/cpubook/issues
0章と1章の試し読みPDF https://book.mynavi.jp/files/topics/116654_ext_90_0.pdf
色覚異常の方向けのPDF配布情報 https://book.mynavi.jp/ec/products/detail/id=116654

更新履歴

書籍の更新履歴

発行日 版と刷
2020年08月26日 初版第1刷
2020年09月15日 初版第2刷
2020年10月20日 初版第3刷

サイトの更新履歴

https://github.com/amane-uehara/cpubook/commits/master