jinyux’s diary

IT業界初心者です。勉強したことをまとめています。

HDLを触ってみる

これからハードウェアを学習していくために、回路を組んで実験する必要があるんですが、さすがに電子パーツを揃えて実際にはんだごてを使って回路を組む、というのはかなりしんどいです。そこでHDL(ハードウェア記述言語)をつかってシミュレーションしていきたいと思います。今回は、下記の本の中で用意されたHardware simuratorを触っていきたいと思います。

www.oreilly.co.jp

下記URLからダウンロードできます。
Software | nand2tetris

使い方を記したpdfは下記URLからDLできます。

まず適当にスクリプトを書いてみます。試しにNORから。これがhdlファイルになります。

/** NOR */
CHIP Nor {
  IN a, b;
  OUT out;

  PARTS:
  Or(a=a, b=b, out=w1);
  Not(in=w1, out=out);
}

次にテストスクリプト。これはdemoフォルダに入ってるスクリプトをコピペすればよさそう(入力のパターンは同じだし)。
そして、テスト結果を検証するcmpファイルを用意する。これは期待する値を記述するファイル。今回はNORなので以下のように書く。

|   a   |   b   |  out  |
|   0   |   0   |   1   |
|   0   |   1   |   0   |
|   1   |   0   |   0   |
|   1   |   1   |   0   |

これで準備完了。あとは前述のpdfのとおりにhdlとテストスクリプトを読み込んでテストを実行します。

成功です!

続いてDecorderを実装してみます。
Decorderは2つの入力に対して4つの出力があるロジック回路。真理値表は以下の通り。具体的な回路図は次の機会に説明することにします。

A B out1 out2 out3 out4
0 0 0 0 0 1
0 1 0 0 1 0
1 0 0 1 0 0
1 1 1 0 0 0

hdlは以下の通り

CHIP Decorder {
  IN a, b;
  OUT out1, out2, out3, out4;

  PARTS:
  Not(in=a, out=na);
  Not(in=b, out=nb);
  And(a=na, b=nb, out=out1);
  And(a=na, b=b, out=out2);
  And(a=a, b=nb, out=out3);
  And(a=a, b=b, out=out4);
}

複数の出力は配列を使ってもできるみたいだがとりあえずこの方法でやってみる。
cmpファイルは以下の通りでtstファイルは出力形式を少し改修しないといけない。

|   a   |   b   | out4  | out3  | out2  | out1  |
|   0   |   0   |   0   |   0   |   0   |   1   |
|   0   |   1   |   0   |   0   |   1   |   0   |
|   1   |   0   |   0   |   1   |   0   |   0   |
|   1   |   1   |   1   |   0   |   0   |   0   |

tstファイルの修正部分

output-list a%B3.1.3 b%B3.1.3 out4%B3.1.3 out3%B3.1.3 out2%B3.1.3 out1%B3.1.3;

これで実行してみる。

成功!