コンピュータシステムの理論と実装のアウトプットをしていくための記事です。
コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方
実装は下記にまとめてあります。
GitHub - sanoyo/nand2tetris
参考にした記事は下記になります。
「コンピュータシステムの理論と実装」をやりきりました - Qiita
第1回「コンピュータシステムの理論と実装」の勉強会 - Cloudii blog
コンピュータシステムの理論と実装 - 資料一覧 - connpass
全体像
ブール論理
ブール式の基本
NOT / OR / AND が基本になります。
また上記3つの関数を NAND関数で表現することができます。
Nand関数(Not And関数)
名称から見てもわかる通り、Andの反対の性質を持ちます。
a | b | Nand(a, b) |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
一つ目の課題は、NAND だけ与えられた状態から、NOT / OR / AND / XOR などを実装することになります。
AND
NANDの真反対の結果になります。
a | b | And(a, b) |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
ANDを作成するための実装は下記のようになります。
# ゲート名
CHIP And {
IN a, b;
OUT out;
PARTS:
Nand (a=a, b=b, out=not);
Nand (a=not, b=not, out=out);
}
OR
a | b | OR(a, b) |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
NOT
0
を 1
に、1
を 0
にします。
XOR
a | b | XOR(a, b) |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
MUX(マルチプレクサ)
3入力のゲートで、一つのアウトプットを返します。
マルチプレクサ (MUX)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
下記の実装だと、sel
の部分が条件文になるイメージです。
この後のALUの実装で活躍してくれます。
CHIP Mux {
IN a, b, sel;
OUT out;
PARTS:
Not(in=sel, out=notsel);
And(a=a, b=notsel, out=and1);
And(a=sel, b=b, out=and2);
Or(a=and1, b=and2, out=out);
}
DMUX(デマルチプレクサ)
マルチプレクサとは反対のことを行います。
一つの入力に対して、複数の出力を返します。
デマルチプレクサ (DEMUX)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
下記実装の場合だと、 sel
の条件文によって、出力を4パターン作成する実装になっています。
CHIP DMux4Way {
IN in, sel[2];
OUT a, b, c, d;
PARTS:
Not(in=sel[0], out=notsel0);
Not(in=sel[1], out=notsel1);
And(a=notsel0, b=notsel1, out=asel);
And(a=in, b=asel, out=a);
And(a=notsel1, b=sel[0], out=bsel);
And(a=in, b=bsel, out=b);
And(a=notsel0, b=sel[1], out=csel);
And(a=in, b=csel, out=c);
And(a=sel[0], b=sel[1], out=dsel);
And(a=in, b=dsel, out=d);
}
準備
諸々インストール
MacにNand2Tetrisのハードウェアシミュレータをインストールする - Qiita
Software | nand2tetris
Java SE Development Kit 14 - Downloads
ハードウェアシミュレータ立ち上げ
sh tools/HardwareSimulator.sh
O'REILLY コンピューターシステムの理論と実装【第1章②】 - sota0113
テストファイルの実行方法
- hdlファイルを読み込む
- Scriptを読み込んで、実行する
各ファイルの役割
hdl
実装が必要なファイル
tst
テスト用のファイル
cmp
正しい抽出結果か確認できるテスト用のファイル
And.cmpに書かれている条件のようにアウトプットできればOK