Carry Lookahead Adder l l l l c

  • Slides: 25
Download presentation

Carry Lookahead Adder l この式を展開していくと l l l c 0が決まれば c 1 = g

Carry Lookahead Adder l この式を展開していくと l l l c 0が決まれば c 1 = g 0 + p 0 c 1~c 4が決まる c 2 = g 1 + g 0 p 1 + p 1 p 0 c 3 = g 2 + g 1 p 2 + g 0 p 1 p 2 + p 0 p 1 p 2 c 0 c 4 = g 3 + g 2 p 3 + g 1 p 2 p 3 + g 0 p 1 p 2 p 3 + p 0 p 1 p 2 p 3 c 0 Carry Lookahead Unit でこの計算を行う l l 入力: g 0~g 3, p 0~p 3, c 0 出力: c 1~c 4

4ビット Carry Lookahead Adder PFA (Partial FA) l l gi, pi を計算 si を計算

4ビット Carry Lookahead Adder PFA (Partial FA) l l gi, pi を計算 si を計算 l l ai xor bi xor ci Carry Lookahead Unit l c 1~c 4 を計算 a 0 b 0 s 0 a 1 b 1 s 1 a 2 b 2 s 2 a 3 b 3 s 3 PFA g 0 p 0 PFA g 1 p 1 c 1 PFA g 2 p 2 c 2 PFA g 3 p 3 c 3 Carry Lookahead Unit l C 0(carry in) C 4(carry out)

CLA 4 クラス public class CLA 4 { public CLA 4(Bus a, Bus b,

CLA 4 クラス public class CLA 4 { public CLA 4(Bus a, Bus b, Path carry. In, Bus s, Path carry. Out) { // g, pを計算する回路 Path[] g = new Path[4]; Path[] p = new Path[4]; : // Carry Lookahead Unit Path[] c = new Path[5]; : CLU clu = new CLU(g, p, c); // sを計算する回路 } public void run() { // 回路を実行 } }

CLU クラス (Carry Lookahead Unit) public class CLU { ANDGate and 1; ORGate or

CLU クラス (Carry Lookahead Unit) public class CLU { ANDGate and 1; ORGate or 1; public CLU(Path[] g, Path[] p, Path[] c) { // g, p, c[0]からc[1]〜c[4]を計算 Path inner 1 = new Path(); and 1 = new ANDGate(p[0], c[0], inner 1); or 1 = new ORGate(g[0], inner 1, c[1]); // c[1]を計算する回路 : } public void run() { and 1. run(); or 1. run(); : } }

16ビット Carry Lookahead Adder 以下のように置き、Carry Lookahead Unit に入力 l l l Gi = g

16ビット Carry Lookahead Adder 以下のように置き、Carry Lookahead Unit に入力 l l l Gi = g 3 + p 3 g 2 + p 3 p 2 g 1 + p 3 p 2 p 1 g 0 Pi = p 0 p 1 p 2 p 3 Carry Lookahead Unit l l 4ビットの場合と全く同じ回路 各 4ビット CLA の carry in を計算 C 0(carry in) a[0 -3] b[0 -3] s[0 -3] 4 bit CLA G 0 P 0 a[4 -7] b[4 -7] s[4 -7] 4 bit CLA G 1 P 1 C 1 a[8 -11] b[8 -11] s[8 -11] 4 bit CLA G 2 P 2 C 2 a[12 -15] b[12 -15] s[12 -15] 4 bit CLA G 3 P 3 Carry Lookahead Unit l C 4(carry out)

32ビット Carry Lookahead Adder l 16ビット Carry Lookahead Adder を2つつなげればよい C 0(carry in) a[0

32ビット Carry Lookahead Adder l 16ビット Carry Lookahead Adder を2つつなげればよい C 0(carry in) a[0 -15] b[0 -15] 16 bit CLA s[0 -15] c 1 a[16 -31] b[16 -31] 16 bit CLA s[16 -31] C 2(carry out)

Register. File クラス public class Register. File { Register[] regs = new Register[32]; Decode

Register. File クラス public class Register. File { Register[] regs = new Register[32]; Decode 5 dec; MUX 32_bus mux 1, mux 2; public Register. File(Path reg. Write, Bus read 1, Bus read 2, Bus write 1, Bus wdata, Bus rdata 1, Bus rdata 2) { : } public void run() { : } } // 制御入力 // 出力

Register. File クラスの使い方 Register. File reg. File = new Register(reg. Write, read 1, read

Register. File クラスの使い方 Register. File reg. File = new Register(reg. Write, read 1, read 2, write 1, wdata, rdata 1, rdata 2); // 1番レジスタへの書き込みと読み出しを同時に行う reg. Write. set. Signal(new Signal(true)); read 1. set. Value(1); // 読み出すレジスタ番号 write 1. set. Value(1); // 書き込むレジスタ番号 wdata. set. Value(100); // 書き込む値 reg. File. run(); System. out. println(rdata 1. read. Signal()); // 古い値(0) // もう一度同じアクセス reg. File. run(); System. out. println(rdata 1. read. Signal()); // 新しい値(100)

課題3(オプション) l Decoder 5 クラスおよび MUX 32_bus クラスを 回路を使って実現せよ NOTGate を表す a 0 a

課題3(オプション) l Decoder 5 クラスおよび MUX 32_bus クラスを 回路を使って実現せよ NOTGate を表す a 0 a 1 : b 0 : b 1 : a 4 ctls b 2 : ins[0] ins[1] : : MUX 32 : : Decoder 5 b 31 MUX 32_bus out 1

Latch, Flip. Flop クラス public class Latch { public Latch(Path clock, Path data, Path

Latch, Flip. Flop クラス public class Latch { public Latch(Path clock, Path data, Path q 2) { : } public void run() { // 出力を安定させるためにNOR回路を 2回実行する必要がある // 実行結果のqとq 2の値をNOR回路への入力とするため } } public class Flip. Flop { public Flip. Flop(Path clock, Path data, Path q 2) { // 初期値を 0にするには、2つのLatchの出力をq=0, q 2=1に設定しておく } public void run() { : } }

Register クラスの使い方 Path reg. Write = new Path(); // 書き込み制御フラグ Path clock = new

Register クラスの使い方 Path reg. Write = new Path(); // 書き込み制御フラグ Path clock = new Path(); // クロック Bus wdata = new Bus(32); // 書き込むデータ Bus rdata = new Bus(32); // 読み出したデータ Register reg = new Register(reg. Write, clock, wdata, rdata); // クロックが1の間に書き込みたい値を入力する clock. set. Signal(new Signal(true)); reg. Write. set. Signal(new Signal(true)); wdata. set. Value(100); reg. run(); System. out. println(rdata. read. Signal()); // まだ読み出せない // 下降クロックエッジ(1→ 0)で実際に書き込み clock. set. Signal(new Signal(false)); reg. run(); System. out. println(rdata. read. Signal()); // 出力に反映される