LoginSignup
260

More than 1 year has passed since last update.

ブレッドボード上でCPUを1から作ってみた話

Last updated at Posted at 2021-11-02

0-1. はじめに

少し前に「自作エミュレータで学ぶx86アーキテクチャ」という本を元に、Linux上でx86エミュレータを自作しました。(詳しくはこちらの記事をどうぞ)

で、「CPUが内部でどんなことをしているのか?」というイメージをざっくり掴むことはできたのですが、

『そもそもCPUはどうして命令を実行できるのか?』

といった根本的な疑問は依然解決しないままの状態で、頭の中が逆にモヤモヤするという結果になってしまいました。。

そのため、x86エミュレータの記事にも書いたのですが

「時間ができたら次はハードウェア的な部分のエミュレートにも挑戦してみたいなぁ」

と思っていたわけなのですが、最近ようやくその願いが叶いなんとか「CPUそのものの自作」(といってもブレッドボード上でですが..)までこぎつけましたので、作業中に気づいたことや苦労したことなどを軽くメモしていこうと思います。

また私自身今までいわゆる「電子工作」と言われる類のものを全くしたことがなかったため

  • 「CPUを自作してみたいけど電子工作したことがないから不安だな...」
  • 「電子工作って半田付けとかをしなくちゃいけなさそうでハードル高そうで不安...」
  • 「電子工作って色々と道具が必要そうで何を買ったらいいのかわからない...」

といった方にとっても割と参考になる話が多いかと思いますので、最後までご覧いただけると幸いです。


ちなみにCPU自作の際、一番参考にしたのはこちらの「CPUの創りかた」という超有名な本です。

後でこの本については詳しく触れますが、正直この本と材料リストさえあれば誰でも簡単にCPUを(ブレッドボード上でなら)作れます。

要はそのくらい優秀な本ですので、CPUを作りたい方はぜひ購入することをおすすめします。



0-2. 対象読者

  • CPUの動作を知りたい人

  • 低レイヤに興味がある人

  • コンピュータの内部について理解したい人

目次

タイトル 備考
0-1. はじめに
0-2. 対象読者
1. 完成品について 実際に作成したCPUについて詳しく見ていきます。
2. 心構えと記事を読む上での注意点 CPUを自作する際に意識しておくべきことと本記事を読む上での注意点を説明しています。
3. 方針と進め方 本記事のメイン部分です。

CPU自作の大まかな流れと具体的な作業の進め方について説明しています。
4. 苦労した点 実際の作業で苦労した点について説明しています。
5. まだ疑問が残ること・次に挑戦したいこと 今回の作業を通して見えてきた新たな疑問と次に挑戦してみたいことについて軽く説明しています。
6. おわりに
7. 参考文献など


1. 完成品について

最初に完成品について少し説明しておきます。

まず完成したものはこちらになります。
かなりスパゲッティコードになってしまっていますが、動作自体は特に問題ないです。

初めてプログラムが動いた時はただただ感動しました。(語彙力..)


1-1. 回路配置

回路の配置については以下のようになっています。

電源とROMに関してはArduino UNO R3で代用しました。ROMのエミュレータ部分のコードに関しては以下のディレクトリを参照してください。

youliangdao/Arduino/td4_rom


1-2. 仕様

今回作成したCPUは名著「CPUの創りかた」で実際に作成するTD4(とりあえず動作するだけの4bitCPU)と同じです。

一応簡単な仕様を載せておきます。

名前 スペック
命令長 8 bit = オペコード 4bit + Im 4bit

※ Im = イミディエイトデータ
(命令に組み込まれたデータという意味)
命令の種類 12種類
アドレス空間 4 bit (16バイト ROM)
汎用レジスタ 4 bit × 2(AレジスタとBレジスタ)
プログラムカウンタ 4 bit
フラグレジスタ 1 bit
I/O 入出力ともに4 bit

※入力はDIPスイッチ・出力はLED
動作周波数 1 Hz or 10 Hz
さらに手動クロックでも動作可能
算術演算 4 bit の加算のみ

1-3. 動作確認

あとでももう一度触れますが、動作確認は非常に重要です。

全部完成してから動作確認をし始めると、不具合が生じた際のトラブルシューティングが非常に面倒です。
(実際私もこれで非常に苦労しました。)

そのため動作確認は各モジュールが完成するたびにこまめに行うことを推奨します。

以下に各モジュールごとの動作確認例を載せていますので、ぜひ参考にしてください。

①手動クロック回路

手動クロック回路が正しく動作することを確認している動画です。
具体的にはスイッチを押すとLEDが点灯することで確認しています。



②クロックジェネレーター

自動クロック回路であるクロックジェネレーターが正しく動作することを確認している動画です。
1Hzと10Hzのものを2つ用意し、それぞれで確認を行なっています。




③リセット回路

リセット回路が正しく動作することを確認している動画です。
具体的にはスイッチを押し続けている間のみLEDが消灯することで確認しています。
(若干のタイムラグが生じているのは、リセットされたことを把握しやすくするためです。)



④プログラムカウンタ

現在の命令の位置(アドレス)を指定する役割を行うのがプログラムカウンタと呼ばれるものなのですが、ここではそのプログラムカウンタの挙動が正しいことを確認しています。

詳しく説明すると、クロックの立ち上がり(クロックが消灯→点灯する瞬間のこと)のたびにカウンタがカウントアップすることを確認しています。

ここでは0番地から16番地まで正しく指定できていることが確認できています。
(少しわかりづらくて申し訳ないのですが、左が最小ビット、右が最大ビットとなっています。通常とは向きが反対なのでご注意ください。)



⑤ROMからオペコードを取ってくる際の挙動の確認

次にROMからオペコードを正しく取ってこれているかどうかを確認しています。

具体的には先ほどのプログラムカウンタでROMのアドレスを指定し、そのアドレスから該当のオペコードを正しく取ってこれるか?を確認します。



⑥命令デコーダの確認とサンプルプログラムの実行

最後に命令デコーダの確認とサンプルプログラムの実行を行います。

まず最初にTD4の仕様に基づいて1つずつ命令を実行して確認しながら、デコーダの挙動を確認していきます。

具体的には12種類の命令を1つずつ実行しながら動作確認していくのですが、単調作業になるので動画は撮影していません。
(使用したコードはこちらにありますので、参考にしてください。)

そして最後に実行したいサンプルプログラムを自分で作成してROMに書き込み、正しく動くかどうか確認しましょう。

これで動作確認は終了です。

ここではサンプルプログラムの実行例として

  • 「CPUの創りかた」のサンプルプログラム1を実行した際の動作
  • 「AレジスタのスライドアニメーションをBレジスタが1クロック遅れで追いかけるプログラム」を実行した際の動作

の2つを載せておきます。

使用したコードは youliangdao/td4_rom/LED_lightsyouliangdao/td4_rom/b_follow_a にそれぞれ載せてありますので、ぜひ参考にしてください




1-4. 部品について

部品は秋月電子通商樫木総業(株)とAmazonで全て揃えました。

以下が部品表です。細かい型番などは省略させていただきます。
合計で約1万2千円ほどしました。(結構高い...)


部品名 必要個数 詳細
抵抗1/4W 100Ω 2 クロック回路で使用

こちらはArduino入門キットに付属していたものを使用。
抵抗1/4W 1KΩ 18 LEDをつなぐ際に主に使用

100本入りを1袋購入すれば足りる
抵抗1/4W 10KΩ 1 クロック回路で使用

100本入りを1袋購入
抵抗1/4W 100KΩ 4 クロックとリセット回路で使用

100本入りを1袋購入
抵抗1/4W 3.3KΩ 1 クロック回路で使用

100本入りを1袋購入
抵抗1/4W 33KΩ 1 クロック回路で使用

100本入りを1袋購入
セラミックコンデンサ 0.1μF 50V 11 各ICに対し1つずつ使用

パスコンとして用いる
アルミ電解コンデンサ 100μF 16V 1 電源に対し1つ使用

こちらもパスコンとして用いる
電解コンデンサ 10μF 16V 2 チャタリング防止用としてクロックとリセット回路で使用

極性があるので注意
オーディオ用無極性電解コンデンサ 10μF 16V 1 クロックジェネレータで使用
LED 14 動作確認で使用

Arduino入門キットに付属しているものをそのまま使用。
74HC10(3入力NAND) 1 命令デコーダで使用
74HC14(6回路シュミットトリガインバーター) 1 チャタリング防止用としてクロックとリセット回路で使用
74HC32(4回路OR) 1 命令デコーダで使用
74HC74(2回路D-FF) 1 キャリーラッチで使用
74HC153(2回路4chマルチプレクサ) 2 データセレクタで使用
74HC161(レジスタ・カウンタ) 4 A・Bレジスタ、出力ポート、プログラムカウンタで使用
74HC283(4 bit 全加算器) 1 ALUで使用
ブレッドボード 小 4
ブレッドボード 大 4 3個入りを1つとArduino入門キットに付属していたもの1つ
DIPスイッチ 4P 1 入力ポートで使用
タクトスイッチ 2 手動クロックとリセット回路で使用

Arduino入門キットに付属しているものをそのまま使用
トグルスイッチ 2 クロックジェネレータで使用
ブレッドボード ・ジャンパーワイヤ(オスーオス) 約100本 Arduino入門キットに付属しているものだけでは足りなかったため、別で130本入りを買い足した。
Arduino UNO R3 入門キット 1 Arduinoの入門キット
Arduino UNO本体と以下の部品が付属してくる。LEDとタクトスイッチはこれだけで充分足りる

①ジャンパーワイヤ(オスーオス)
・長:65本
・短:約15本
②トグルスイッチ:1個
③タクトスイッチ:5個
④ブレッドボード 大:1個
⑤LED:25個
⑥抵抗:120個
エンジニア卓上導電マット 1 静電気対策で使用

あってもなくてもどっちでもいい。
DIPーIC引き抜き工具 1 短めのジャンパーワイヤを引き抜くために購入。

短めのジャンパーワイヤ自体をそこまで使用しなかったので必要なかったかも。


2. 心構えと記事を読む上での注意点

次にCPUを自作する上での心構えや本記事を読む際の注意点について少しお話ししておきます。

意外と重要な話ですので、飛ばさずに読んでいただけると幸いです。


2-1. CPUを自作する上での心構え

いきなりですが、皆さんに質問です。

皆さんはガンプラってご存知ですか?

image.png

はい、これです。

まぁ簡単にいうと、「戦闘機やロボットを立体化したプラモデル」なんですけど、これ作るの一見難しそうに見えるのですが、実はめっちゃ簡単なんですよね。

(もちろんここではいわゆる「素組み」を前提にしています。ちゃんとした塗装などをしたらめちゃくちゃ時間かかると思います。)

というのもガンプラは通常、写真にあるような長方形の箱に「パーツ」や「コーティング用のシール」、さらに組み立て方が載ってる「説明書」が全部入っている状態で売られていて、部品をキットから切り離すためのニッパーさえあればあとは中の部品を説明書通りに組み立てていけば簡単に作れるようになっているんです。

つまりは、

  1. 道具はニッパーのみ。あとは適当に好きなものを買ってこれば作れる
  2. 知識は全くいらない。日本語がわかれば誰でも作れる
  3. 説明書の指示通りに作れば簡単に作れてしまう。
  4. 絶対に動く

このような特徴を持っているのがガンプラなんです。


さて話を戻しましょう。

一方のCPUはというと、ガンプラとは正反対の以下のような特徴を持っています。

  1. 道具がたくさん必要で、しかも一つずつ集めなければいけない。 CPUに必要な道具が一通り揃えられている魔法の箱なんて存在しない
  2. 論理回路の知識・プルアップやチャタリングなどのアナログの知識・電気回路の知識が最低限必要。 ブレッドボードを用いない場合は半田付けの知識も必要
  3. 組み立て方が1から10まで載った説明書は存在しない。 完成品(回路図)があるだけでそれを見ながら自分で試行錯誤して作っていかなければいけない
  4. 部品を回路図の通りに組み立てても思い通りに動かないことが多々ある。

これがCPUです。


いやガンプラと比べてハードル高すぎじゃね。。。
そうなんです、見ての通りガンプラと比べると完成までのハードルの高さが雲泥の差なんですよね。

これがCPUクオリティなんです。

実はこれ当たり前っちゃ当たり前で、ガンプラってめちゃめちゃ人気商品ですからできるだけ簡単に作れるような工夫がいたるところに散りばめられているわけなんですよね。

ですが、CPUときたら作ろうと考えている人なんてたぶん手のひらで数えられるくらいしか(流石にもうちょっと多いかも...)いないわけですから、売る側としては(そもそも組み立て式のCPUを売ろうと考えている人がいるかどうか怪しい...)作る側に対しての考慮なんて全くないわけです。

まぁ「仕方がなかった」ってやつですね。

また少し補足ですが最近はFPGAのような「現場で即座に書き換え可能な集積回路」が存在するため、一般的にCPUのような複雑な論理回路を持つデバイスを作ろうとした場合はそちらを使用することが多いです

しかもFPGAを用いた場合、今回私が作成したのと同レベルのCPU程度なら割と簡単に作れると思います。
image.png

ただ今回はFPGAを用いずに、実際に販売されている汎用ICを用いてCPUを作ることにしました。

これは、FPGAを用いて作る場合HDL(ハードウェア記述言語)やツールの使い方など事前に学ぶことが多くなりがちで、CPUを作るという目的を達成する前に挫折する可能性が高くなると思ったからです。

ただプログラミング言語でロジックを組んだ経験がある方なら、FPGAを使うのにそんな苦労しないという話も聞きますので手を出してみてもいいかもしれません。まぁこの辺はお好きにどうぞ。

ちなみに私はここまでいっておいてなんですが、FPGAを使ったことありません!!笑

ということで、基本的にCPUを自作する難易度は割と高めだと考えておくことをおすすめします

くれぐれもガンプラのように誰でも簡単に作れるものではないということをまずは心得ておきましょう。
(ガンプラのノリで作り出すと、たぶん簡単に挫折するでしょう。)


2-2. 記事を読む上での注意点

ここまで自作CPUのハードルの高さをつらつら述べてきましたが、とはいっても全く希望がないかというとそうでもなくて、実は結構わかりやすい資料やらなんやらがネット上や本に載っていたりします。

つまり自分で色々と調べたりすれば多少ハードルは下がるわけですが、電子工作をしたことがない人がいちいち必要な道具やら部品やらを調べるのは結構大変かと思います...


そんなわけで、一応本記事ではそういった方達のためにできるだけ目線を下げつつ、必要な道具や学習手順などを詳しく説明しながら話を進めていきたいと思っています。

そのため、電子工作の経験や論理回路/電気回路/アナログ回路あたりの知識がある方にとってはやや冗長な説明が多いかもしれませんが、大目にみてくださると助かります。

また私自身もこのあたりについてはまだまだ初心者の域を脱せれていないため、記事に何かしらの不備があった際はご指摘していただけると幸いです。



3. 方針と進め方

さてそれでは本題に入っていきましょう。

まずは、CPU自作の大まかな方針と作業の進め方について説明していきましょう。


3-1. 方針

まず方針としては完成品を見てわかる通り、半田付けはせずにブレッドボード上で作っていくことにします。

image.png

そもそも電子工作をする場合

  • 基板に半田付けをして回路を作る
  • ブレッドボード上でジャンパー線と呼ばれる導線を用いて回路を作る

の2パターンが存在します。

半田付けをする場合、回路以外にも様々な知識が必要になってきて、例えば配線作業ひとつをとっても半田こての使い方などを学ぶ必要が出てきます。

さらに配線作業にミスが生じた場合、半田付けはやり直しができません。

そのため「今まで半田付けをあまりしたことがない」っていう人にとっては結構ハードルが高くなりがちです。

一方、ブレッドボード上で作業をしていく場合、配線作業も基本的にはジャンパー線をブレッドボードに挿すだけでできますし、また配線にミスがあった場合でもジャンパー線を付け替えるだけで簡単にやり直せます。

このため電子工作の知識が全くない初心者がCPUを作っていく場合には、ブレッドボード上で作業していく方が圧倒的にやりやすいと思いますので、今回はこちらを採用して作業を進めていきたいと思います。


3-2. 進め方

次に「CPU自作の手順」について私なりの意見を交えながら説明していきます。

前章で触れた通り、CPUの自作はガンプラのような「部品を組み立てたら最低限のものを作れるよ♪」というようなノリではなく、細々とした背景知識が必要になってきますので、これらについて事前に学習しておく必要があります。

個人的な意見としては、以下の手順にしたがって進めていくことを初心者の方にはおすすめします。


手順 内容 詳細
電気回路(電子回路)と論理回路の学習(自由選択) 「ゼロから学ぶ電子回路/デジタル論理回路」
の2冊をさらっと読む
マイコンを使って簡単な配線作業をする 「Arduino UNOの入門キット」を購入し、書籍やネットの記事を参考にしながらブレッドボード上で配線作業をしていく。これによりアナログ回路やブレッドボード上での作業に慣れる
CPUを作る 「CPUの創りかた」を読み進めながらCPUをブレッドボード上で作っていく

以下に簡単な補足説明をしておきます。

①電気回路(電子回路)と論理回路の学習

まず最初のステップとして電気回路(電子回路)と論理回路について基本的なことを学習していくことをおすすめします。

image.png
image.png

というのも前章でも軽く述べましたが、CPUを自作する上で電気回路と論理回路の知識は知っていおくに越したことはないからです。


ちょっと踏み込んだ話をしておくと、そもそもコンピュータというのは集積回路の集まりであり、またその集積回路の中身というのはほとんど論理回路でできています。

そしてこの論理回路では電圧の高低で情報を表し計算を行っており、基本的にはトランジスタを使った回路で構成されています。

つまり、コンピュータの基本的な動作の仕組みを知るにはトランジスタの仕組み、すなわち電子回路の知識とそれを組み合わせてできる論理回路の知識が必要なのです。


...

...

はい、何っているのか意味わかりませんよね。

「集積回路?トランジスタ?ってかそもそも論理回路って何?」

この辺りの知識があまりない人はたぶんこんな感想を持ったことでしょう。またそもそもコンピュータの仕組みとかに興味がない人はこんなこと絶対に知らないはずですし、たぶん知ろうとも思わないでしょう。

というわけでここに関してはやるやらないは個人の自由です。

...

「いやあんたさっき『知っておいた方がCPU作りやすくなるしおすすめ』って自信満々に言うてたやん!」

ってツッコミ、ありがとうございます。

はい、確かにその通りで、CPUを自作する上で電子回路や論理回路についての知識はあった方が絶対いいと思います。何ならその知識がないと何をやっているのかちゃんと理解できないでしょう。反論の余地はありません

ただ、世の中にはこの手の物理チックな話(先ほどのような話)に耐性がない人や興味が湧かないという人がたくさんいるのもまた事実です。

さらにこの電子回路や論理回路あたりの話についてちゃんと学ぼうと思うとそれなりに時間がかかってしまいます...

このような事情から「絶対にやるべき」と強制してしまうとむしろCPU自作の難易度をさらにあげてしまうことになると判断し、ここでは自由選択とさせていただきました。

やってもいいし、やらなくてもいいです。みなさんの好きな方を選択してください。

(またやらなかったとしても後述の「CPUの創りかた」という本でこのあたりの知識については最低限は知ることができますので、そこまで心配しなくていいです。)

②マイコンを使って簡単な配線作業をする

お次はアナログ回路やブレッドボードでの配線作業に慣れるため、マイコンを使って実際に作業することをおすすめします。

CPUを自作する上でこれらの知識は欠かせないのでここは必ずやっておくことを勧めます。


さてここで

「ん?そもそもマイコンって何だ?」

って方も割といらっしゃると思うので、マイコンについて簡単に説明しておきましょう。

マイコンとは一言でいうと「めちゃめちゃ小さなパソコンのようなもの」です。

このくらいの手のひらに乗るほどの小さな基板に、プロセッサや入出力用ポートなどが実装されており、基本的な電子工作をせずに様々な電子部品を制御することができるものとなっています。

電子工作で人気のあるマイコンはこちらの2つです。名前くらい聞いたことがあるかもしれません。

名前 呼び方
Raspberry Pi ラズベリーパイ
Arduino アルドゥイーノ

どちらもヨーロッパで学生たちにコンピュータや電子回路についての知識をわかりやすく教えるために開発されたものであり、割と簡単に使うことができます。

で、その中でも今回はこちらのArduino UNOの入門キットを使うことをおすすめします。

image.png
Arduino UNO入門キット


こちらArduinoで作業する上でよく使われる部品がセットになったもので(ジャンパー線やブレッドボードも入っている)、これ1つで電子工作の基本は大体学ぶことができるようになっています。

基本的にはこいつを用いながらArduinoでいろんな作業をしていきましょう。

で、その作業の進め方なのですが、幸いにもArduinoは世界中で非常によく使われているためネットで検索すれば使い方に関する記事は大量に出てきます。なので、適当にググってわかりやすそうな記事を読みながら作業を進めていくという流れでOKでしょう。

一応おすすめの記事を挙げさせていただくと、個人的にはこちらの方の記事が非常にわかりやすく参考になるかと思います。

(またこちらの方はYouTubeでも解説動画を出していて、そちらも大変わかりやすく参考になると思います。)

またネット上の記事だとまとまりがなくて嫌だという方は書籍で学習するのもありでしょう。

実際に私は「これ1冊でできる!Arduinoではじめる電子工作」という本を読んで、Arduinoに関する基本的なことは1通り学びました。

③ブレッドボード上でCPUを自作

ここまできてようやく、CPU自作に移っていきます。

CPUの自作に関してはネット上の記事であったり書籍などたくさん資料が存在していますが、個人的にはこちらの超有名な「CPUの創りかた」という本を参考にしながら作っていくことをおすすめします。

(おすすめというよりはもうこれ一択な気がします笑)

コンピューターの中核であるCPUという名のブラックボックス。その動作の「超」基本原理から具体的な設計例までを解説。アキバで手に入る部品だけで実際の製作も可能。
内容(「BOOK」データベースより)

内容紹介にも書いてあるとおり、「TD4(とりあえず動作するだけの4bitCPU)」の作成を通じて、基本的な CPU の動作原理がわかりやすく紹介されている本で、手を動かしながらCPUの仕組みを学びたい方にとってはまさにうってつけの内容となっています。

で、そんな本書の特徴はなんといっても 「尋常なくらいの説明のわかりやすさ」 です。これに尽きます。

正直このわかりやすさには感動を覚えるレベルで、中でもデコーダとレジスタの説明は個人的には目から鱗でした。

(表紙はこんな感じなのですが、中身は本当にちゃんと構成されているんですよね。見た目と中身のギャップがエグい...)

しかも、前知識がほとんどいらないってことも本当に素晴らしい。

例えば、実際に製作する際に必要となってくるアナログ回路の知識(チャタリング、プルアップなど)はもちろん論理回路の基礎的な知識やコンデンサについてもちゃんと説明してくれているので、オームの法則を知っている程度の人であればまじで誰でもわかるレベルになっています。

(ただ説明してあるとはいっても本当に必要最低限感は否めないので、私個人的には上にあげた教材などで補完していった方がより内容が頭に入ってきやすいとは思っています。



というわけで最後は基本的にこちらの本を読み進めながらCPUを作っていくという流れになります。

ただ1点注意することがあります。

それは本書の説明通りに作っていくとROMを超原始的な方法で作っていく羽目になるのでめちゃめちゃ面倒くさくて大変になる...という点です。

具体的にはDIPスイッチを並べて作成していくわけですが、これが引くくらい面倒くさいわけです。

なので他の方も結構言及されてますが、ROM部分はマイコンで代用するという方法を採用することをおすすめします。
(マイコンは先ほど使用したArduino UNOを使えば良いでしょう。)

こうすれば、わざわざスイッチをひたすら並べてON/OFFでプログラムを入力していくという不毛な作業をせずに済みます。

ROM部分のエミュレートに関してはこちらの記事中のコードを参考にさせていただきました。
(一応下にも載せておきます。)

unsigned char rom[] = {
  // Aレジスタのスライドアニメーションを
  // Bレジスタが1クロック遅れで追いかけるプログラム
  B00110001, // MOV A,0001
  B01000000, // MOV B,A
  B00110011, // MOV A,0011
  B01000000, // MOV B,A
  B00110111, // MOV A,0111
  B01000000, // MOV B,A
  B00111111, // MOV A,1111
  B01000000, // MOV B,A
  B00111110, // MOV A,1110
  B01000000, // MOV B,A
  B00111100, // MOV A,1100
  B01000000, // MOV B,A
  B00111000, // MOV A,1000
  B01000000, // MOV B,A
  B00110000, // MOV A,0000
  B01000000, // MOV B,A
};
>
void setup() {
  DDRB = DDRB | B00001111;
  DDRC = DDRC | B00001111;
}
>
void loop() {
  // アドレス入力 D5 D4 D3 D2 番ピン(右が最下位ビット)
  // データ出力   D11 D10 D9 D8 A3 A2 A1 A0 番ピン(右が最下位ビット)
  unsigned char addr = (PIND & B00111100)>>2;
  PORTC = (PORTC & B11110000) | (rom[addr] & B00001111);
  PORTB = (PORTB & B11110000) | ((rom[addr] & B11110000)>>4);
}

このコード自体はそんな難しいことはないのでたぶんマイコンを少し触ればわかるかと思います。
一応軽く説明しておくと

rom 配列に実行したい 8bit プログラムをアドレス順に格納していく
(今回だとAレジスタのスライドアニメーションをBレジスタが1クロック遅れで追いかけていくプログラム)

D5,D4,D3,D2 ピンで Arduino へアドレス入力を行う。

入力されたアドレスに格納されているプログラムを D11,D10,D9,D8,A3,A2,A1,A0 ピンから出力する
の3つがわかってさえいれば充分です。



4.苦労した点

ブレッドボード上での工作とはいえやはり全く電子工作がしたことのない人間からすると、色々と苦労する部分は多かったです。

というわけでここからは、電子工作未経験者の自分がCPUを作る際に特に苦労した点について2つほどあげていきます。


4-1.材料集め

まずは「材料集め」ですね。

電子工作経験者の方からすると「何いってんだこいつ」と思われるかもしれませんが、これが結構私の中では厄介でした。

というのもブレッドボード上で電子工作をする場合、必要なものがかなり多くなってしまい、作業中に買い忘れに気づく..ということが起こりがちだからです。

これにより何回も作業を中断せざるを得なくなり、結構大変でした。
(まぁこれは私自身のいい加減な性格も多少影響しているかもしれませんが...)

しかも汎用ICやDIPスイッチといったものはAmazonのような有名なサイトで買えることがほとんどなく、電子パーツ販売を専門としている店(秋月電気通商さんなんかが有名)で買うしか方法がありません。

そのような店では送料が通常とは比べてかなり高くなってしまい、部品単体の値段は安いが、送料込みだと結構かかるという現象が起こってしまいます。

私の場合は途中でジャンパー線やDIPスイッチが足りないことに気付き買い足したこともあり、諸々の部品を揃えるのにだいたい1万2千円ほどかかってしまいました。

これはたぶんかなり高い方だと思います。
普通に必要な部品を一度に購入していればだいたい1万円未満に抑えれると思います。

ではどうしてここまで高くなってしまったのかというと、LEDやICなどは壊れる恐れがあったため、かなり余分に買ってしまったからです。。
(さっき言った「買い忘れが多く送料を余分に払ってしまった」というのももちろん原因の1つです。)

今思えば、例えばLEDはArduinoの入門キットなんかに結構ついてきていたのでわざわざ買う必要もなかったなぁと少し後悔しています。

また電源部分もArduinoで代用できるので必要なかったです。事前に確認すべきでした。。


4-2. 動作確認

次に苦労したのが、CPUの動作確認です。

正直これが一番大変でした。

というのも私自身あまりこまめに動作確認を行っていかなかったため、最終的に各モジュールをつなぎ合わせた状態で動作確認を行い、思い通りに動かなかったときに不具合の原因が全くわからなくなってしまったからです。

このため不具合の原因を探るのにめちゃめちゃ時間がかかってしまいました。
(だいたい一日くらいかかりました。)

しかも最終的には回路図とにらめっこしながら、各モジュールの配線作業を1からやり直していくという意味わからないくらい愚かなこともしました。
(マジでアホです。)

なので、CPUの自作にこれからチャレンジする方は、例えばクロック回路とリセット回路が完成したらそれがちゃんと動いているのか確認してからデコーダの作成に移る...といったように各モジュールごとにこまめに動作確認を行うということを肝に銘じてください。

これだけでも最後の完成状態での動作確認はめちゃくちゃ楽になりますし、また何より不具合が生じた際のトラブルシューティングもかなりやりやすいはずです。



5.まだ疑問が残ること・次に挑戦したいこと

今回の作業を通して、個人的には「CPUの仕組み」に関してかなりの手応えを掴みました。

今まではよくある

  • 「メモリは机みたいなものだよ〜」
  • 「CPUはコンピュータの頭脳みたいなものだよ〜」

的なふわふわした説明で理解していたのですが、今では実感を伴ってしっかりとCPUの動作原理を理解できているのでCPUを自作して本当によかったと思います。

聞いたことは忘れる。見たことは思い出す。体験したことは身に付く

という孔子の有名な言葉がありますが、「作る」という体験を通してしか見えない世界があるのだなぁと改めて実感しました。


しかし、現代のコンピュータシステムというのはTD4みたいに単純なものではなく、周辺機器やOSといったもっといろんなものが複雑に関連し合っているのもまた事実ですので、次はそうしたシステム同士の有機的な繋がりや関連性みたいな部分についてちゃんと知りたいなと思いました。

具体的には、OSとCPUの関係性や周辺機器の割り込み処理などを今回のように実感を伴いつつ学んでいきたいと思っています。

またシステム同士のつながりという意味ではコンパイラについても知らないことが多いので、1度作ってみるのもありかなと思いました。

(こういったことを踏まえると、次に挑戦する本は「コンピュータシステムの理論と実装」あたりかなぁとひっそり予感してたりします。TD4の次はNand2tetrisかな?



6.おわりに

本記事の内容がみなさんの参考になれば嬉しいです。

最後までご覧いただきありがとうございました。



7.参考文献など

ここからは私がCPUを作る際に参考にさせていただいた資料を紹介していきます。


記事内で紹介した書籍


Arduinoでの作業の際に参考にさせていただいた記事

電子工作初心者の方に向けて書かれてあるので非常にわかりやすかったです。

マイコンの購入から実際に動作させるところまで、初心者に必要なことは大体書かれています。
また解説動画もついていてマイコンが動く様子などを目で見て確認できるので、イメージ作りに大変参考にさせていただきました。


CPU自作の際に参考にさせていただいた記事

1番参考にさせていただいた記事です。
実際の作成手順や材料リスト、さらには完成品の動作の様子など知りたいことが全部まとまっていました。

これに沿ってすべての作業を行なったといっても過言ではないです。。

正直自分のよりも圧倒的にクオリティが高いと思いますので、これからCPU自作にチャレンジする方は絶対に読むことを推奨します。
(記事の構成もがっつり参考にさせていただいたなんて死んでも言えない...)

配線の美しさまで拘って作っているというかなりの猛者の方。
ブレッドボード 上でTD4を作った方の記事をいくつか読ませていただきましたが、個人的にはこちらが一番クオリティが高いと思います。

始めた当初はこれくらい美しい配線を組みたいなと思っていましたが、途中で諦めました。

また配線部分がかなり詳しく載っていますので、配線作業で行き詰まった際に参考にさせていただきました。
また実際に動く様子も動画としてあるため、イメージ作りに非常に役立ちました。

ROM部分でプログラムを書く際に参考にさせていただきました。

「半田付けしたことがない」という電子工作初心者の目線に立って作成過程が書かれていて、非常にわかりやすかったです。

実際にどういうところで苦労したか?なども書いてあったので自分のようなど素人にはめちゃめちゃ参考になりました。


低レイヤ学習の方針を決める際に参考にさせていただいた記事

CPU作りとは関係ない話ですが、低レイヤ学習の大まかな方針を立てる際に参考にさせていただいた資料。
OSの学習を一旦やめて、「まずCPUとメモリだけからなる系を作ろう」と決断できたのはこの記事の影響が大きいです。


部品を購入する際に利用した店



Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
260