低レイヤそろそろ勉強しようと思ったので、お勉強。
コンピュータシステムの理論と実装――モダンなコンピュータの作り方
をやってみることに
[https://www.oreilly.co.jp/books/9784873117126/:embed:cite]
だいぶ前に触ったアセンブリ言語よりもだいぶ低レイヤ。 章ごとにダラダラ学んだことを書いていく予定
1章 ブール論理
ブール関数
3つの表現方法がある
- 真理値表
- ブール式
- 正準表現
Xor = (x and Not y) or (Not x and y)
Nandのみで全ての演算が可能
xORy = (x Nand x) Nand (y Nand y)
論理ゲート=入力と出力のデバイス=ブール関数で表現できる
マルチプレクサ
複数の入力のいずれかを単一の出力にする。どちらかを選ぶかは選択制御Sによる。Sもブール値
Wikipedia:https://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]=1
で hoge[1]=0
らしい。
あと、記録はgitにのっけてます