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

学んだことを書くところ

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

こんにちは。3章まできました。

www.oreilly.co.jp

記録用git

vol.1

vol.2

vol.3 いまここ

3章 順序回路

理論

組み合わせ回路

時間に依存しない回路。論理演算や算術演算。

順序回路

時間に依存する回路。一つ以上のDFFが組み込まれている回路。組み合わせ回路が含まれていることもある。

クロック

継続的にマスタクロックが送信する信号。プラットフォームの全ての順序回路に対して送信される。周期。

DFF

D型フリップフロップ

順序回路の基本的要素。

out(t)=in(t-1)

簡単に言えば、クロックが進むまで待機する回路。

1ビットレジスタ

記憶装置。DFFを拡張して情報を格納できる。仕組みはこんな感じ。

f:id:Kouchannel55:20190113152623p:plain

load(ロードビット)という値がキモ。周期の前と後で考える。後を今回、前を前回ととりあえず呼ぶ。

👇load=falseの場合は、前回の自身の出力をそのまま今回の出力とする。この仕組みは、値をレジスタが記憶していると言っても良い。

f:id:Kouchannel55:20190113152629p:plain

👇load=trueの場合は、今回の入力をそのまま今回の出力とする。この仕組みは、値を書き換えると言ってもいい。

f:id:Kouchannel55:20190113152619p:plain

wビットレジスタ

通常のコンピュータであれば、1ビットレジスタでは構成されておらず、並列に処理できるwビットレジスタで構成されている。

👇loadはあくまで1ビットであることに注意

f:id:Kouchannel55:20190113152605p:plain

メモリ

レジスタの集合体。

並列にwビットレジスタが配置されている。

周期ごとに、

  • どのレジスタに対して(address
  • 読み込みか書き込みか(load
  • 入力値(in

を入力として与える。

カウンタ

他の順序回路とは少し違うみたい。

この書籍では、

  • カウンタを0にするかどうか(reset。1の場合、出力を0にする)
  • 読み込みか書き込みか(load。1の場合、前回の出力を今回の出力にする)
  • 加算するか(inc。1の場合、前回の出力に1=00....000001を加算したものを出力にする)

を入力値としている

実装

カウンタ(PC)が難しかった。

2章でじっそうしたものがつかえる

と書いてあったので、ALUが使えるかと思ったが無理だった。

以下、PCの実装。

実装後に他人の実装見てたけど、4~7行ほどが多かった。

ベストアンサー説💯

/**
 * A 16-bit counter with load and reset control bits.
 * if      (reset[t] == 1) out[t+1] = 0
 * else if (load[t] == 1)  out[t+1] = in[t]
 * else if (inc[t] == 1)   out[t+1] = out[t] + 1  (integer addition)
 * else                    out[t+1] = out[t]
 */

CHIP PC {
    IN in[16],load,inc,reset;
    OUT out[16];

    PARTS:

    //2
    // inc
    Add16(a=dffout, b[0]=inc, out=temp-out1);
    Mux4Way16(a=temp-out1, b=false, c=in, d=false, sel[0]=reset, sel[1]=load, out=temp-out2);
    Register(in=temp-out2, load=true, out=out, out=dffout);
}