序
NANDだけでCPUを設計しようと思います。
前にもVerilogでCPUを設計してみたのですが、何となくこうじゃないと思っていました。
文法の通りに書いていくと、勝手に加算器や選択器等の部品が生成されて実際に電気がどう流れているのかを深く理解出来ません。
そこで今回はNANDを最小単位としてNANDを組み立ててCPUを開発していくことにします。
本当はNAND素子もトランジスタから出来ていますが、一旦はNANDを最小単位として扱います。
初めから目標を上げすぎて破綻したくないからです。
カレーを初めて作る人がカレーのルーの成分まで研究していては終わりません。
筆者は何でも原理が気になり、下へ下へと掘り進めてしまいますが、トランジスタから下へ掘り進めると化学や量子力学の領域になり、最早計算機の話ではありません。
CPUの仕組みを調べる為に電磁場、電子やクオークの本質まで遡ろうとすると、筆者の余生はあまりにも短すぎます。
筆者は良くこんな空想をします。
自炊をしたとして、その料理は本当に自分で作ったと言えるのか、どこまでやれば胸を張って作ったと言えるのか。
調味料を原料から作り、畑に野菜を植え、自給自足にしないといけないのでは、
いや、そもそも苗なり種なりから育てているからそれは自分で作ったとは言えない、遺伝子、いやもう原子から創造しないといけないのでは、でも原子の中には陽子や中性子、その中には更にクオークがある、クオークの中身も将来発見されるかもしれない、想像が無限に広がります。
だからプログラミングをする時も、OSやライブラリを使わずベアメタル向けのアセンブリ言語ばかり書いてしまいます。
そしてアセンブリ言語では物足りなくなりました。もっと下があるのです。電子回路です。
最終的にはGDSIIまで設計し、半導体工場へ渡せる一歩手前まで作ろうと思っています。
nandだけで構成するとトランジスタの量が増えてしまいますが、それでもnand縛りにしたのは、下の抽象層への入口を1つに絞りたかったからです
初めは題名をNANDだけでCPUを作る連載としていましたが、個人の力では"作る"段階まではいけないことに気づきました。
なのでせめて工場へ渡すギリギリまで設計することにしました。
汎用NANDチップを買ってきて無数に並べれば作ることはできるかもしれません。
しかしそのNANDチップも自分で作っている訳ではありません。
気軽に作るという言葉を使うのはやめました。
前提知識
こんな酔狂な記事を読んでくれる人がいるとも思えませんが、もしおられましたら以下の前提知識があれば読みやすくなるかと思います。
- ブール代数
- 論理回路
- 2進数
途中で分からないことが多々でてきます。一度躓いて日が開くと投稿への熱量が薄れてしまいます。
その為、回路を何故そう組むのか等、筆者に理解できないところは、一旦確立された方法として定石通りに実装して先へ進みます。
その後に改めて調べた内容を別記事として投稿します。
記事一覧
9/24 ①NANDとは
9/25 ②NOTとは
9/25 ③ANDとは
9/25 ④ORとは
9/25 ⑤XORとは
9/25 ⑥半加算器とは
9/26 ⑦全加算器とは
9/26 ⑧8bit加算器
9/27 ⑨NANDから8bit加算器までのまとめ
10/1 開発中で記事が止まっていますが、諦めてはいません。レジスタ、ALUで苦戦しています。
番外編:NANDより下を掘る
序ではNANDを最小単位として扱うと書きましたが、番外編ではどんどん突き詰めていこうと思います。
NANDの実現方法は1つではなくCMOSやTTL等複数あります。
要は振る舞いさえ一致したらそれでよく、極論旗を持たせた人間を並ばせてもCPUは作れます。
現にマインクラフトでCPUを作る人もおり、材料は何でもよいのです。
ですがここでは現在広く使われているCMOSを基に調べていきます。
計算機に限ったことではありませんが、技術は例えば
ソフトウエア→プログラミング言語→ライブラリ→OS→機械語→論理回路→トランジスタ→.....→宇宙の真理
のように抽象化の層に分かれていると思います。
ソフトを使用する人はソースコードの中身まで理解する必要はありません。
プログラムを書く人はライブラリがどの様に実装されているかまで気にする必要はありません。
ライブラリを書く人はシステムコールの内部までは知らないかもしれません。
トランジスタに詳しい人は論理回路まで詳しく理解しているとは限りません。
CPUを設計できる人は高級言語を書くのが得意ではないかもしれません。
それぞれの層では、その下の仕組みを完全に理解していなくても、振る舞いを知っていれば便利な道具として利用できます。
NANDから下へ掘り進める際には、その時に調べている内容の最小単位を決め、それより下は次の研究課題として掘り進めないようにしようと思います。
9/28 ①PMOS及びNMOSからNANDを設計
開発環境
CPU : Intel® Core™ i5-7200U CPU @ 2.50GHz × 4
OS : Ubuntu 22.04.5 LTS
回路シミュレーション : simulide-1.1.0 LEDを使った論理素子の動作可視化に使用。設計には使用しない。
回路記述 : Icarus Verilog version 11.0 NANDを組み立てたCPUの設計に使用。
波形確認 : GTKWave Analyzer v3.3.104 (w)1999-2020 BSI
設計回路可視化 : Yosys 0.9 (git sha1 1979e0b)
設計回路画像生成 : dot - graphviz version 2.43.0 (0)
回路の製図 : https://app.diagrams.net/
※コマンド一発で全て導入できるように整理中
sudo apt install iverilog gtkwave
参考にしたサイト
https://go.orixrentec.jp/rentecinsight/it/article-285
https://digisim.io/ja/blog/the-nand-gate-the-single-building-block-of-all-digital-logic
https://ushitora.net/archives/479#toc3