📚

Nand2Tetris読書会(1章)

2021/04/26に公開

概要

Nand2Tetris読書会 を開催しています。
今回取り上げるのは、1章『ブール定理』です。

内容

全てのデジタル機器の構成要素は論理ゲート
1章ではNandを最小単位として、他の論理回路を実装していく。

ブール関数の表現方法は複数ある。

  • 真理値表: 関数の入力について、考えられる組み合わせを全て列挙してそれぞれの出力を書き出していく。
  • ブール式: And, Or, Not を基本単位として、式の形で表現したもの。
    • 正準表現: 関数の出力が1となる組み合わせを式の項として列挙したもの。

ブール関数を実装する物理デバイスをゲートと呼ぶ。
ゲートはスイッチ素子(トランジスタ)をつなぎ合わせて作られる。
基本ゲート(And, Or, Not, etc.)を組み合わせてより複雑な複合ゲートを設計できる(論理設計)。

ハードウェア設計は、物理的にモノを作らずにハードウェア記述言語(HDL)とハードウェアシミュレータを使って進められる。

1章では、Nandをプリミティブゲート(最小単位)として、NotやOrなどの他のゲートを実装する。

予習メモ

ゲートの表現

演習でNandをベースに論理ゲートを実装したが、個人的には以下のような手順で進めるとやりやすかった。

  1. 真理値表を書いて、すべての組み合わせを列挙
  2. 正準表現に書き直す
  3. ド・モルガンの法則 を使って、正準表現をNandだけで書き直す
  4. HDLでゲートを作る

ディスカッションメモ

なぜ一般的にNorではなくNandを最小単位とするのか?

Functional completeness の観点から言えば、NandもNorも同じ。 したがって、NorでNotやAnd, Orなどを実現することも可能。

2つの差が現れるのは、物理的な実装(トランジスタ)を考慮した場合である。
CMOS では、P型とN型の MOSFET を利用している。
P型とN型の違いは、半導体内で電荷を運ぶキャリアが正孔(ホール)か電子かという点であり、キャリアの移動度は電子の方が大きい。 すなわち、N型の方が動作が速い。
NandとNorのCMOS回路構成を比較すると、NandではN型が直列でP型が並列、NorではN型が並列でP型が直接となっている。
そのため、NandとNorではNandの方が動作が速く、Norに比べて優位である。

これが一般的にNandが採用されている理由である。

多ビットゲートと多入力ゲートの違いは何?

  • 多ビット: 一つの入力に複数ビットからなる配列が入る(=複数ビットをまとめて一つの入力として扱う)
    • [例] 多ビットOrの場合、nビットの入力を二つ受け取り、ペアとなるビットにOr演算をする。出力はnビット。
  • 多入力: 複数ビットが入力されるが、一つ一つのビットを個々の入力と捉える。
    • [例] 多入力Orの場合、nビットの入力を受け取り、そのn個の入力に対してOr演算をする。出力は1ビット。

感想

組織のリーダーをされている参加者が、教育的な視点から質問・コメントを書いてくれたのが非常にためになりました。
「ここに〇〇と書いてあるけど、正しく理解できてる?」というコメントを見て、改めて本文を読み返すと確かに何となく分かったつもりになっていたぞ…!というのに気付かされました。
また、書籍であまり細かく触れられていない内容を分かりやすく説明されているページのURLを貼ってくれた人もいました。
質問表を見返すだけでも理解度チェックができそうです。

この読書会では、しばらく自分がファシリをやっていくつもりなのですが、毎回全員に何かしら発言してもらうのがとても難しいなと感じました。
演習課題の確認はランダムに指名して書いたコードを見せてもらうので、全員いつかは当てられると思うのですが、質問表を見ていくときに初学者にどう話を振るかが今後の課題です。
わたし自身も初学者で、難しい質問のときに「これ分かります?」って聞かれたら困る気持ちはとてもよく分かるので、「分からない」「間違っているかもしれないけど〇〇だと思う」ということも気軽に発言できる雰囲気を作りたいなと思っています。

最後に

Nand2Tetris読書会始めました』の記事でも紹介していますが、読み進めているのはこちらの本です。
https://www.oreilly.co.jp/books/9784873117126/

初学者なりに書籍やその他に調べた内容をまとめていますが、理解が足りておらず間違ったことを書いているかもしれません。
そのような箇所を見つけた場合はコメントなどで指摘していただけると助かります。

次の記事は こちら

GitHubで編集を提案

Discussion