てきとうなさいと べぇたばん

コンピュータシステムの理論と実装 レジスタとメモリとカウンタ

順序回路

今までのALUまでの回路のことを、「組み合わせ回路」と呼ぶ。これから作るのは「順序回路」と呼ばれるもの。というのは、ALUは計算ができるが、記録ができない。

フリップフロップ

この記録を行う素子を「フリップフロップ」と呼ぶもので作っていく。この本では、フリップフロップをプリミティブなゲートとして扱っている。いろいろ調べてみると、フリップフロップをNandから作成することはできるらしいが、色々ごちゃごちゃになってしまう。ということのようだ。

レジスタ

1ビットのレジスタ

CHIP Bit {
    IN in, load;
    OUT out;

    PARTS:
    // Put your code here:
    Mux(a = w2, b = in, sel = load, out = w1);
    DFF(in = w1, out = w2, out = out);
}

16ビットのレジスタ

CHIP Register {
    IN in[16], load;
    OUT out[16];

    PARTS:
    // Put your code here:
    Bit(in = in[0], load = load, out = out[0]);
    Bit(in = in[1], load = load, out = out[1]);
    Bit(in = in[2], load = load, out = out[2]);
    Bit(in = in[3], load = load, out = out[3]);
    Bit(in = in[4], load = load, out = out[4]);
    Bit(in = in[5], load = load, out = out[5]);
    Bit(in = in[6], load = load, out = out[6]);
    Bit(in = in[7], load = load, out = out[7]);
    Bit(in = in[8], load = load, out = out[8]);
    Bit(in = in[9], load = load, out = out[9]);
    Bit(in = in[10], load = load, out = out[10]);
    Bit(in = in[11], load = load, out = out[11]);
    Bit(in = in[12], load = load, out = out[12]);
    Bit(in = in[13], load = load, out = out[13]);
    Bit(in = in[14], load = load, out = out[14]);
    Bit(in = in[15], load = load, out = out[15]);
}

RAM8

CHIP RAM8 {
    IN in[16], load, address[3];
    OUT out[16];

    PARTS:
    // Put your code here:
    DMux8Way(in = load, sel = address, a = a0, b = a1, c = a2, d = a3, e = a4, f = a5, g = a6, h = a7);

    Register(in = in, load = a0, out = w0);
    Register(in = in, load = a1, out = w1);
    Register(in = in, load = a2, out = w2);
    Register(in = in, load = a3, out = w3);
    Register(in = in, load = a4, out = w4);
    Register(in = in, load = a5, out = w5);
    Register(in = in, load = a6, out = w6);
    Register(in = in, load = a7, out = w7);

    Mux8Way16(a = w0, b = w1, c = w2, d = w3, e = w4, f = w5, g = w6, h = w7, sel = address, out = out);
}

こんな風に組んだ。どのようにアドレスからレジスタへ記録するのか、という組合せ回路が必要だったのだが、コレを一体どうすればいいのか。非常に悩んだ結果、多入力多ビットデマルチプレクサで組めばいいと思いついた。苦しかったです。

RAM16K

16キロバイトのRAMで、困ったことがある。addressが14ではなく15にしないといけないのは…?ぼくがまちがってるのかな?

ぼくが間違ってた。8つ揃えればいいんじゃねと考えてたけど、考えてみたらRAM4K4つでよかったのだ。

CHIP RAM16K {
    IN in[16], load, address[14];
    OUT out[16];

    PARTS:
    // Put your code here:
    DMux4Way(in = load, sel = address[0..1], a = a0, b = a1, c = a2, d = a3);

    RAM4K(in = in, load = a0,  address = address[2..13], out = w0);
    RAM4K(in = in, load = a1,  address = address[2..13], out = w1);
    RAM4K(in = in, load = a2,  address = address[2..13], out = w2);
    RAM4K(in = in, load = a3,  address = address[2..13], out = w3);

    Mux4Way16(a = w0, b = w1, c = w2, d = w3, sel = address[0..1], out = out);
}

カウンタ

この章でやる、レジスタの類とはちょっと違う順序回路。とりあえずいつもはクロックのとおりに1ずつ加算されるが、リセットしたい時もあるし、任意の値を入れてそれを増やさせたい時もある。そんな感じ。

loadがてっきりレジスタのだと思ってたらそうじゃなかったのはああそういえばそうかッて感じだったな。

3章おしまい

これで次は4章に進めるぞー