コンピュータシステムの理論と実装 レジスタとメモリとカウンタ
TOP > てきとうにこらむ > ゲーム作りとプログラミング日記 > コンピュータシステムの理論と実装 レジスタとメモリとカウンタ
順序回路
今までの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章に進めるぞー
一覧
- コンピュータシステムの理論と実装 ブール論理
- コンピュータシステムの理論と実装 ブール論理のつづき
- コンピュータシステムの理論と実装 ALUの実装
- コンピュータシステムの理論と実装 レジスタとメモリとカウンタ
- コンピュータシステムの理論と実装 機械語
- コンピュータシステムの理論と実装 CPU
- コンピュータシステムの理論と実装 コンピュータそのもの
- コンピュータシステムの理論と実装 アセンブラ
- コンピュータシステムの理論と実装 バーチャルマシン#1
- コンピュータシステムの理論と実装 バーチャルマシン#2