299
222

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

「CPUの創りかた」の4bitCPUをブレッドボードで作りました

Last updated at Posted at 2019-10-25

CPUの創りかた | 渡波 郁 を読んで、中で紹介されている 4bitCPU をブレッドボードで作ってみました。けっこう時間がかかったのですが、面白かったのでメモを残しておきます。
※ 間違いのないように記載したつもりですが、どこかに間違いがあるかもしれません。作る際は、自己責任で確認しながら作っていただければと思います。

本の紹介

CPUの創りかた | 渡波 郁 はタイトルの通り、CPU の自作がテーマとなっている本です。「TD4(とりあえず動作するだけの 4bitCPU)」の作成を通じて、基本的な CPU の動作原理がわかりやすく紹介されています。実際にこの TD4 を作られている読者の方も多く、検索するとたくさんの方の記事が見つかります。
手を動かしながら学びたいという方にはおすすめの一冊です。

IMG_0719.jpg

作り終わって

進め方を載せる前に、作ったものや、読む前からの変化を記載します。

作ったもの

ブレッドボードで 4bitCPU を作ることができました。
そして結構ごちゃごちゃになってしまいました。でも思った通りに動かすことができて、また作りきることができて良かったです。(PC = プログラムカウンタです)
cpu.jpg
cpu2.jpg

また ROM の部分は Arduino Uno で代替しましたが、使用したコードは以下のフォルダにアップしています。
Arduino/td4_rom at master · y-meguro/Arduino

使用した部品(購入した部品)

LED や IC などは壊す可能性もあるので、不安な方は多めに買っておいてもいいかもしれません。
※ ROM の部分は Arduino Uno で代用しているため、本と異なります(74HC154 などは使っていません)
※ 電源も結局 Arduino Uno から取ったため不要でしたが、一応記載しています

名前 個数 メモ
74HC74(Dフリップフロップ) 1 回路数: 1
74HC161(レジスタ) 4 回路数: 4
74HC153(4chマルチプレクサ) 2 回路数: 2
74HC32(2入力OR) 1 回路数: 4
74HC10(3入力NAND) 1 回路数: 3
74HC14(シュミットトリガ) 1 回路数: 5
74HC283(4ビット全加算器) 1 回路数: 1
0.1μF(セラミックコンデンサ) 11
10μF(無極性電解コンデンサ) 1
10μF(有極性電解コンデンサ) 2
100μF(有極性電解コンデンサ) 1
DIPスイッチ4P 1
100Ω 1 100本単位で購入
1KΩ 1 100本単位で購入
3.3KΩ 1 100本単位で購入
10KΩ 1 100本単位で購入
33KΩ 1 100本単位で購入
100KΩ 1 100本単位で購入
LED赤 8 壊す可能性やテストで使用する可能性あり
LED青 4 壊す可能性やテストで使用する可能性あり
LED黄緑 1 壊す可能性やテストで使用する可能性あり
タクトスイッチ 2
トグルスイッチ 1
電源 1 Arduino から電源とったので不要だった
ブレッドボード用DCジャックDIP化キット 1 Arduino から電源とったので不要だった
電池ボックス 1 テスト時に使用
ブレッドボード用ジャンパーワイヤ 2 長いもの
ブレッドボード用ジャンパーワイヤ 2 短いもの
Arduino Uno 1
ブレッドボード短 4
ブレッドボード長 1 3個入りを1つ購入
ペンチ 1
ニッパー 1
ワイヤーストリッパー 1 アースコードを剥くために使用
ESDマット 1
アースコード 1
アースターミナル付変換アダプタ 1
アース線 1
ピン揃え 1
DIP-IC引き抜き工具 1

方針

  • 見ての通り、はんだ付けはせず、ブレッドボードで作っています
  • また ROM の部分は Arduino Uno で代替しています
  • 本当ははんだ付けもやりたかったし、ROM も作りたかったのですが、時間の関係で断念しちゃいました

本を読む前からの変化

  • この本に取り組む前に コンピュータシステムの理論と実装 をやって、HDL で CPU を実装していたが、物理的にも作成してみることで、より一層イメージを掴むことができた
  • LED の使い方、IC の使い方、電圧の H と L がどのように 0 と 1 に変換されるか、といったことを理解できた
  • 各部品(レジスタ・ALU・ROM など)をどのように組み合わせて、CPU として動作させているか、イメージが明確になった
  • 電子工作は未経験だったが、部品の買い方にはじまり、ブレッドボードの仕組み、Arduino Uno の仕組みといった、電子工作の基本中の基本も理解することができた
  • 作成中、うまくいかないこともたくさんあったので、その中でどのように原因を特定していくか、またどのようなミスを犯しやすいか、理解することができた
  • 細かい読書メモは以下にあげています

進め方

ここから少し長くなってしまいますが、本を読み終わった後、どのように作成を進めていったか書いてみようと思います。
最初はんだ付けする気満々だったので、無駄が多いですし、知らないことが多すぎて遠回りしながら進めていったのですが、もし同じように苦しみながら進めていく方の参考になれば幸いです。

Day 1: 理解の浅いまま、まず注文

Day 2: 道具が届くも、足りていない部品がたくさん。LED も光らない

  • すべての道具が届いたので、開封しつつ作成をはじめる。まずはブレッドボードでトライすることに
    • この時はブレッドボードで作成した後、はんだ付けにトライするつもりでした
  • ブレッドボードに電源・LED・抵抗をつなげて、疎通確認をするが、一瞬光ったあと、何も反応しなくなる。LED を変えても音沙汰なし。DC ジャックが悪そうだが確認できない
not_lighting.jpg
  • はんだこての使い方、こて台クリーナーの使い方、デジタルマルチメーターの使い方、ブレッドボードの使い方を学ぶ
  • 道具が足りなくてできることがなくなったので、再度注文

Day 3: Arduino を触りはじめる

  • 電池につなげば、LED が光ることを確認
lighting_by_dry_cell.jpg
  • みんなのArduino入門 を読みながら、Arduino を触りはじめる
    • Arduino を使って、LED を点滅させられるようになった

Day 4: Arduino で複数 LED を点滅させられるようになる

  • TD4ブレッドボード版できた! - marlesanのブログ さんの記事の ROM の実装(Arduino)を理解する
    • こちらのコードで Day 9 の挙動確認をさせていただきました。ありがとうございました。
  • Arduino を使って、複数 LED を点滅させられるようになった

Day 5: IC の仕組みを理解し、手動クロック回路を作成する

  • 改めて DC ジャックをはんだ付けして、今度は光ることを確認
lighing_by_adapter.jpg
  • 基本的な IC の仕組みを理解する
    • 1 つの IC に複数の回路が入っていること、Vcc に + を GND に - をつないでおく必要があること
  • NOT 回路が入っている IC(74HC04)を正しく動かせることを確認。1A を H にすると、1Y が L(LED が光らない)、1A を L にすると、1Y が H(LED が光る)
not_ic1.jpg not_ic2.jpg
  • 抵抗の色を見て、どれがどの抵抗かわかるようになる
  • ショートさせて、2 つの LED と 1 つの IC を壊してしまう
  • 手動クロック回路が正しく動くことを確認する(Push SW を押している間だけ H になる)

Day 6: リセット回路とクロック回路を作成する

  • クロックジェネレータができる。1Hz バージョンと 10Hz バージョン
  • リセット回路とクロック回路をあわせて作成する(リセット回路は Push SW を押している間だけ L になる)

Day 7: レジスタ / データセレクタ / ALU / 命令デコーダについて再度理解を深める

  • レジスタ / データセレクタ / ALU / 命令デコーダの部分に取り組むに当たり、わからない部分が多いことに気づく
  • 改めて本を読み直しながら、理解を深める

Day 8: プログラムカウンタから ROM を介して、命令デコーダまでの挙動が正しいことを確認する

  • プログラムカウンタを作成する
  • プログラムカウンタから、ROMのアドレスを指定して、該当のオペレーションコード取ってくるところまで挙動を確認する
  • 命令デコーダの挙動が正しいことを確認する

Day 9: レジスタ / データセレクタ / ALU も作って、一通り完成

  • レジスタ / データセレクタ / ALU も作って、一通り完成させる
  • A レジスタの点滅を B レジスタが 1 クロック遅れで追いかけていく命令で実行するも、想定通りにいかず苦しむ
    • いきなりこのプログラムで実行せず、本のサンプルプログラム 1 に載っている LED ちかちかを実行すれば良かった
  • プログラムカウンタの値が安定せずに悩んだが、クロックの挙動確認用にはさんでいた LED を外したら、安定するようになる
  • 無事に思った通りの挙動となることを確認した(左下の赤い LED が A レジスタ、青い LED が B レジスタ)

Day 10: 完成!

終わりに

とても時間がかかってしまいましたが(本を読んでいた時間とあわせると約 100 時間かかりました)、なんとか 4bitCPU を作りきることができました。
これまでに IC や スイッチ、LED を組み合わせて回路を作成した経験はなかったので、最初はどこから手を付けていいかわからず、また失敗も多くて、なかなか大変なチャレンジとなりました。しかし、段々と理解が深まり、徐々に自分で問題を切り分けながら進めていく経験ができたのはとても良かったです。
また、レジスタやデータセレクタ、ALU、ROM がどのように繋がっているか、これまで以上に理解が深まったのもいい経験になりました。興味ある方はぜひどうぞ!

参考

他に取り組まれている方の記事

部品の購入

器具の使い方

299
222
0

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
299
222

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?