クソ雑魚エンジニアのメモ帳

学んだことを書くところ

低レイヤチョットワカル(nand2tetris/コンピュータシステムの理論と実装1章)

低レイヤ

そろそろ勉強しようと思ったので、お勉強。

コンピュータシステムの理論と実装――モダンなコンピュータの作り方をやってみることに

www.oreilly.co.jp

だいぶ前に触ったアセンブリ言語よりもだいぶ低レイヤ。 章ごとにダラダラ学んだことを書いていく予定

1章 ブール論理

ブール関数

3つの表現方法がある

  1. 真理値表
  2. ブール式
  3. 正準表現

Xor = (x and Not y) or (Not x and y)

Nandのみで全ての演算が可能

xORy = (x Nand x) Nand (y Nand y)

論理ゲート=入力と出力のデバイス=ブール関数で表現できる

マルチプレクサ

複数の入力のいずれかを単一の出力にする。どちらかを選ぶかは選択制御Sによる。Sもブール値

「マルチプレクサ」の画像検索結果

Wikipediahttps://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AC%E3%82%AF%E3%82%B5

デマルチプレクサ

単一の入力を複数の出力のいずれかにする。どちらかを選ぶかは選択制御Sによる。Sもブール値

多ビットのゲート

入力・出力共に配列であり、それぞれのindexに対して操作するだけ

多入力のゲート

入力が2つ以上のゲート

多入力Or=入力1…nまでのいずれかが1であれば1それ以外は0

多入力マルチプレクサ=複数の入力のいずれかを単一の出力にする。どちらかを選ぶかは選択制御Sによる。Sもブール値。入力の数がnに対して、選択制御は、log2n個必要

HDL

ハードウェアを構築するための言語。HDLで記載して各ゲートをシミュレートする宿題が出た。

HDLでloop使えない😇(単に1章だから使えないのかも?)

マルチプレクサゲート(Mux/4WayMux16)/デマルチプレクサゲート(Dmux)が一番しんどかった。

以下、僕の回答。

/** 
 * Multiplexor:
 * out = a if sel == 0
 *       b otherwise
 */
CHIP Mux {
    IN a, b, sel;
    OUT out;

    PARTS:
    Not(in=sel, out=notsel);
    And(a=a, b=notsel, out=outtemp1);
    And(a=b, b=sel, out=outtemp2);
    Or(a=outtemp1, b=outtemp2, out=out);
}

/**
 * Demultiplexor:
 * {a, b} = {in, 0} if sel == 0
 *          {0, in} if sel == 1
 */
CHIP DMux {
    IN in, sel;
    OUT a, b;

    PARTS:
    Not(in=sel, out=notsel);
    And(a=in, b=notsel, out=a);
    And(a=in, b=sel, out=b);
}

あと、配列の各要素へのアクセスにはまったが、自分と全く同じコードで全く同じ意図の質問があって助かった。

まさか右から読むとは思わなんだ。正しくはhoge = 01の場合、 hoge[0]=1hoge[1]=0らしい。

あと、記録はgitにのっけてます