1987 views
# CPU 自作のすゝめ この記事は[群馬高専 Advent Calendar 2021](https://adventar.org/calendars/6424) 25日目の記事です。 ## 著者紹介 ### Nakaya J科寄りのE科生。 群馬高専 Advent Calendar 2021の首謀者。 たけのこの里のほうがすき。 Twitter: [@eniehack](https://twitter.com/eniehack) ### c Nakayaの友人。今の研究分野は数学。たけのこの里のほうがすき。 ## 概要 群馬高専 電子メディア工学科 5年の「デザイン実験」という授業で我々は授業でCPUを作製した。 そこで、我々が学習の流れ、CPU作製にあたっての苦労話、最後に今後の学習についてここで書ければと思う。 ## 対象読者 対象読者は以下のような人を対象としている。特に高専1~3年生に向け書いている。 * 電気、電子、情報系の高専生、大学 1、2 年生 * いまやっていることがプログラミングへ繋がることに実感が湧かない人 * 情報系学科を志望する中高生 * 普段プログラムは書くが、どのようにして CPU がプログラムを実行しているのかがわからない人 ## 論理回路って何に使うん? コンピュータサイエンスを教える学科でが必ず論理回路の講義がある(と思う)。 しかし、数億もの論理回路素子が集積してコンピュータを構成していると口頭で説明されても、納得がいかないと思う。 そんな方には、[NandGame](https://nandgame.com/)をすることをおすすめする。NandGame とは、NAND ゲートですべての論理回路素子を作ることが可能である、という性質を用いて、NAND ゲート 1 つから、CPU やメモリまでを作るゲームである。 我々が始めた頃はinv(NOTゲートのこと)からだったが、今はnandを磁気リレーで作る所からやることになる。これを初心者にさせるのは酷な気がしたため、ちょっとしたヒントを書いておく:nandを完成させるには磁気リレー(default on)と(default off)を一つずつ使う。 または、通称が『nand2tetris』という NandGame にも影響を与えた書籍の日本語訳版である、[『コンピュータシステムの理論と実装』](https://www.oreilly.co.jp/books/9784873117126/)もいいかもしれない。 私はこの書籍を読んだことはないが、Java を用いて NAND ゲートから始め、コンピュータを作り、その上で アプリケーションを実装するまでを書いた書籍である。 ## NAND とかでコンピュータが作れるのは(ある程度)わかった NandGame でなんとなくコンピュータが論理回路で構成されていることがわかった所で、『CPU の創りかた』を買おう。この本は秋葉原で(通販でも)簡単に手に入る IC のみを使って、4bit CPUのTD4を作るという趣旨の本である。本自体は中古で買えて、中学生の理科の知識でも十分読むことができ、デジタル回路がわからなくとも(ANDゲートやNANDゲートなどがわからなくとも)、CPUが作製できるのではないか、と思えるほど丁寧に解説されていて、初めてCPUを作る際の入門だけでなく、デジタル回路の入門としてもうってつけの本である。大切なことはほぼ全てこの本に書いてある。 今回は(もともと持っていた)2枚のブレッドボード上でCPUを作製する方針をとった。面積の都合上、命令を記憶する ROM の実装は[先人の知恵][rom]を借りてArduinoで代用することにした。 * ブレッドボードを使う利点 * 回路の組みかえ、増設が簡単 これが最大の理由である。実際に、「小規模で実行→不具合が起きた場合の原因の調査、解明」のサイクルが素早くできるのは本当にでかい。また、原因調査の際にテスタが大いに役立った。 * 欠点 * 回路の最大面積等に制約がつく 買い足す等で解決可能ではあるが、費用が掛かる。 * よくわからないところでよくわからない接触不良に悩まされることがある 我々の作成したCPUでも実際に起こり、クロック回路が正常に動作しないことがある。具体的には、自動クロック回路の立ち下がり時にもプログラムカウンタが進んでしまうことがあり、クロック回路内の$100k\Omega$を抑えると正常に動作する、という本当によくわからないもので、その原因は不明(おそらく接触不良)となっている。 また、書籍の通りに作ってもプログラムカウンタは正しく動かなかったため、「NandGame」の counter を参考にレジスタや加算器等を購入し、プログラムカウンタを組んだ。苦労した点は、NandGameのcounterはJUMP命令に対応していないため、プログラムカウンタをJUMP命令に対応させるように組んだ点である。苦労はしたが、この試行錯誤によって自ら回路を考えて作っていることが実感できてとても楽しい。 ==**結論:大切なことは『CPUの創りかた』とそれに関連するネットの先人たちの記事に書いてある!**== [rom]: https://marlesan.hatenablog.com/entry/2016/08/08/000047 "TD4 ブレッドボード版できた!" ## 今後の計画 ここまでで、NandGameではNANDゲートからCPUが作れることが、『CPU の創りかた』ではCPU内の素子がどのように関係し合って動作しているのか、をそれぞれ理解することができた。 しかし、『CPU の創りかた』で作るCPUは CPU の基本的な部分のみである。一般に普及しているCPUには、パイプライン処理、仮想メモリなどの機構が組込まれている。さらに、作ったCPUでは4bitであるために命令数が少なく、できることが限られ、実用には向かない。 そこで、一般に普及しているCPUアーキテクチャをFPGA上に自ら実装することで、『CPU の創りかた』では学べない、高度な内容を理解することを考えている。 ### 参考になりそうな書籍 「デザイン実験」の発表も落ち着いた頃に、参考になる書籍に関して詳しい方に紹介していただいたのが最初の2冊である。 最後の2冊はネット上で評判がよさそうな書籍を我々が独断と偏見によって選んだもので、実際にこれらを用いて学習を進めている。 #### 1.『コンピュータの構成と設計』 言うまでもなく有名。2巻構成。~~これを知らないコンピュータサイエンスの学生はモグリなんじゃないかというレベル。~~ 最近第6版が出た。 ##### 書籍情報 * 著者: David Patterson, John Hennessy(著), 成田 光彰(訳) * 書名: コンピュータの構成と設計 MIPS Edition 第6版 上巻/下巻 * 出版社: 日経BP #### 2.『ディジタル回路設計とコンピュータアーキテクチャ』 こちらの書籍は先程の『コンピュータの構成と設計』とは反対に、実践がメインとなっている書籍である。MIPSアーキテクチャを実装することを目標とし、デジタル回路の基礎(それこそ論理ゲートの基礎)から出発する書籍となっている。 この他にも、同じ著者がARMアーキテクチャ、RISC-V(英語版のみ)を取り上げたものがそれぞれ存在している。 別名、ハリスハリス。 ~~正直、パタヘネより有名でない。私も知らなかった。~~ ##### 書籍情報 * MIPS版 * 著者: Sarah L. Harris(著), David Money Harris(著), 天野 英晴ほか(訳) * 書名: ディジタル回路設計とコンピュータアーキテクチャ 第2版 * 出版社: 翔泳社 * ARM版 * 著者: Sarah L. Harris(著), David Money Harris(著), 天野 英晴ほか(訳) * 書名: ディジタル回路設計とコンピュータアーキテクチャ [ARM版] * 出版社: 翔泳社 #### 3.『作ろう!CPU』 『CPUの創りかた』で制作したTD4をFPGAで実装するという内容の書籍。論理回路をブール代数ではなくグラフ理論の視点からみており、とても興味深い。初学者向けにとても丁寧に書いてある本文と、そこへ時々専門性が高い注が入っているところも良い。 ##### 書籍情報 * 著者: 上原周 * 書名: 作ろう!CPU * 出版社: マイナビ #### 4.『RISC-VとChiselで学ぶはじめてのCPU自作』 Chiselという、プログラミング言語Scalaでハードウェア設計ができるソフトウェアを使い、FPGAがなくともソフトウェアのみでRISC-Vを実装する書籍。 ##### 書籍情報 * 著者: ⻄⼭悠太朗, 井⽥健太 * 書名: RISC-VとChiselで学ぶはじめてのCPU自作 * 出版社: 技術評論社