静寂とプログラミング

技術について書いたり、日常について書いたり

コンピュータシステムの理論と実装(1) - 基本論理ゲートをゲットした

基本論理ゲートをゲットした

はじめに

コンピュータシステムの理論と実装という本を読んでいます。 自分はコンピュータサイエンスを生業として生きていくつもりなので、学部時代に学んだことを 復習するような目的でこの本を読もうと思いました。また、最近C++を書くことが多いため、 どうせならさらに下のレイヤーまで復習したいなぁと思い立ったという次第です。
ついでに、他の方の参考になればと思います。 (ざっくりとしたまとめなので、本当にさっくり読む程度にしていただけると)

Nand2Tetris

この本では、自分で手を動かすためにNand2TetrisというCourseが公開されています。
https://www.nand2tetris.org/
これをつかって実際に手を動かすことができるような内容になっています。

ちなみに、このnad2tetrisをつかって、シューティングゲームを作った方とかもいます。(強い...)
www.youtube.com

ちなみに、Githubにコードが公開されています。(自分もこんな感じのものが作れたらいいなぁ)
GitHub - QuesterZen/hackenstein3D: Raycasting game for the Hack computer from Elements of Computing Systems / Coursera NAND2Tetris

HDL(ハードウェア記述言語)

回路を仮想的にシミュレートするために作られた言語である。
さまざまなソフトウェアが作られているが、この本では無料のHDLを提供してくれています。(神!)

https://www.nand2tetris.org/

そして、本の章で1章に対応する内容である、基本論理ゲートの実装を紹介します。

HDLシミュレータの使い方

論理ゲートを実装していくためにHDLを使用していきますが、HDLで回路を作るために まずは使い方について紹介します。

ソフトウェアの起動方法

DLしたフォルダ内にあるtoolsディレクトリにある、*.shを呼び出すことによってそれぞれのソフトウェアを起動することができます。

コーディング規則

回路名はXxxの形で名前をつけます。
XOR回路 -> Xor、AND回路 -> Andのような感じです。

Xxxは別ファイルとしてXxx.hdlが定義されていることになる。

回路構造の記述

回路を作成すために二つの要素で構成されています、

  1. ヘッダ:インターフェース部分を記述する
  2. ボディ:実際の実装を記述する

まずは例を出します

Chip chipname {
IN pinName1, pinName2, ...;
OUT pinName1, pinName2, ...;
BUILDN: java_class_name

PARTS :
chipName(a=pinName1, in=pinName2)
internal chip part2;
internal chip part3;
...

}

ヘッダ部分はIN, OUT, BUILDINの部分になります。
ボディ部分はPARTS以下になります。

ボディ

ボディについてはさらに3つの要素で構成されています。 1. PARTS 2. ピンとピンの接続 3. バス

PARTS

ピントピンの接続

バス

入力ピン、出力ピン、内部ピンのどれであっても多ビットバスを使うことができる。

ビルドイン回路

BUILDIN java_class_name

ファイル構成

.hdl

シミュレート用のプログラムを実装するファイル

.tst

シミュレーターのテストファイル

..cmp

正しい出力結果のファイル

基本論理ゲートを作ってみる

HDLの記述方法はだいたい紹介したので、次は基本的な論理ゲートとなる回路を Nand回路を組み合わせることで作成してみたいと思います。

Nand

まずはNandから。
次に紹介していくゲートは基本ゲートと呼ばれる。 全てのゲートはNandのみで表現することが可能である。 また、実装する上でもNandをプリミティブなゲートとして他のゲートを作っていく。 また、3つのファイルから構成している。

また、次に作成していくゲートはprojects/01の中で作成していく。

ここで、力尽きた。。。(数日内に書き上げます)

Not

And

Or

Xor