コンピュータシステムの
理論と実装③
横山 周平
本日の予定
組み合わせ回路と順序回路(p41)
各種順序回路について(p42~p55)
まとめ
本日の予定
組み合わせ回路と順序回路(p41)
各種順序回路について(p42~p55)
まとめ
組み合わせ回路とは? (組み合わせ回路と順序回路)
 1,2章で構築した回路のこと
※入力値の組み合わせだけで値が確定する!!
例:ORの場合は、必ず入力に1がある場合のみでしか1になりえない
 特徴
単純な処理のため、たくさん処理出来る
 欠点
状態(値)を保てない ※例:呼ぶ度に加算される回路など
組み合わせ回路とは? (組み合わせ回路と順序回路)
 1,2章で構築した回路のこと
※入力値の組み合わせだけで値が確定する!!
例:ORの場合は、必ず入力に1がある場合のみでしか1になりえない
 特徴
単純な処理のため、たくさん処理出来る
 欠点
状態(値)を保てない ※例:呼ぶ度に加算される回路など
→時間が経過しても記憶出来る機能。記憶素子が必要!!
記憶素子とは? (組み合わせ回路と順序回路)
 時間経過してもデータを記録出来る回路のこと
上記を備えた論理回路を順序回路と呼ぶ
 仕組み
同期,クロッキング,フィードバックループなど
複雑な技法を組み合わせて実現されている
 順序回路 ~フリップフロップ(flip-flop)~
複雑な記憶素子の機能を備えたプリミティブな順序回路。
本誌では、flip-flopを使用し、他の順序回路の構築を行う
本日の予定
組み合わせ回路と順序回路(p41)
各種順序回路について(p42~p55)
まとめ
背景 (各種回路について)
 記憶するという行為について
記憶という行為は、時間に依存する行為である。
つまり「前に記憶したものを今思い返す」ことである。
そのため、回路構築には、
時間の経過を表す方法を考察しなければならない。
クロック (各種回路について)
継続的に行き来する信号を全ての順序回路に送信する。
例:tick→tock→tick→tock…
tick→tockまでを周期(cycle)と呼ぶ
フリップフロップ (各種回路について)
順序回路の最も基本(下位レベル)となる回路。
いくつか種類があるが、本誌ではD型フリップフロップ(DFF)のみ使用する。
DFFにより「時間に基づく振る舞い」が可能になる
また、全ての順序回路は、DFFの組み合わせで構成されている。
t:現在のタイムユニット
out:出力値
in:入力値
要約:1つ前の値を出力してるだけ
out(t)=in(t-1)
DFF(in=入力,out=出力);
hdl式
式
2値素子(Bit)/レジスタ(p43~44,p49~50)
データの格納、呼び出しできる記憶装置。
・読み込み(read)
レジスタの値を読み込む。out(t)=out(t-1)
・書き込み(write)
loadが1の場合は書き込み。out(t)=in(t-1)
次のクロック周期から値が変わる≒読み込みは常に1つ前の周期
※前回の値を毎周期、書き込むことで記憶を実現している!!
If load(t-1) then out(t)=in(t-1)
else out(t)=out(t-1)
Register(in=入力,load=上書き有無,out=出力);
hdl式
関数
(各種回路について)
p43. p50図参照
Bit/レジスタ の実装(p54)
nand2tetries/03/aの「Bit.hdl」と「Register.hdl」の実装を行う。
※RegisterはBitを配列にしただけ(一般的には16,32,64)
このサイズをワードと言う
(各種回路について)
Register(in=入力[16],load=上書き有無,out=出力[16]);
hdl式
Bit(in=入力,load=上書き有無,out=出力);
hdl式
実装方法について
・p43図3-1参照
・p50
動作確認手順
nand2tetries/tools/HardwareSimulator.bat(macならsh)を実行
・hdlファイルの読み込み
・testファイルの読み込み
・実行
(各種回路について)
2値素子(Bit) (各種回路について)
CHIP Bit {
IN in, load;
OUT out;
PARTS:
//loadが1の場合のみv1にinを設定
Mux(a=v2,b=in,sel=load,out=v1);
DFF(in=v1,out=out,out=v2);
}
Register (各種回路について)
CHIP Register {
IN in[16], load;
OUT out[16];
PARTS://Bitを16並べるだけ
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[14],load=load,out=out[14]);
Bit(in=in[15],load=load,out=out[15]);
}
メモリ (p44~p46,p51~52)
・任意の長さのワード(レジスタ)を記憶出来るもの。
・レジスタをたくさん積み重ねることで、
RAM(Random Access Memory)を構築できる。
・RAMは物理的に存在する場所に関係なく、同じ時間で、
直接アクセスが可能となるようユニークなアドレスを割り振っている。
RAM8(in=入力,load=上書き有無,address=アドレス,out=出力);
hdl式
(各種回路について)
p45図参照
メモリの実装(p51,52)
nand2tetries/03/aの「RAM8.hdl」と「RAM64.hdl」の実装を行う。
※RAM512以降は、RAM64と同じ為スキップ
・読み込み
addressから対応するRAMを読み込む。out(t) = RAM[address(t)](t)
・書き込み
loadを1に設定でaddressから対応するRAMに、
次のクロック周期で書き込む。 RAM[address(t-1)](t)=in(t-1)
※対象以外のaddressはload=0
■ヒント
1章で作成した「DMux8Way、Mux8Way16」を使用
(各種回路について)
out(t) = RAM[address(t)](t)
If load(t-1) then RAM[address(t-1)](t)=in(t-1)
関数 p51,52参照
RAM8 (各種回路について)
CHIP RAM8 {
IN in[16], load, address[3];
OUT out[16];
PARTS:
// アドレスに対応するLoad値取得
DMux8Way(in=load,sel=address,a=loadA,b=loadB,c=loadC,d=loadD,e=loadE,f=loadF,g=loadG,h=loadH);
Register(in=in,load=loadA,out=outA);
Register(in=in,load=loadB,out=outB);
// 略
Register(in=in,load=loadG,out=outG);
Register(in=in,load=loadH,out=outH);
// アドレスのout値取得
Mux8Way16(a=outA,b=outB,c=outC,d=outD,e=outE,f=outF,g=outG,h=outH,sel=address,out=out);
}
RAM64 (各種回路について)
CHIP RAM64 {
IN in[16], load, address[6];
OUT out[16];
PARTS://3bit単位で分けてRAM8を呼ぶ
DMux8Way(in=load,sel=address[3..5],a=loadA,b=loadB,c=loadC,d=loadD,e=loadE,f=loadF,g=loadG,h=loadH);
RAM8(in=in,load=loadA,address=address[0..2],out=outA);
RAM8(in=in,load=loadB,address=address[0..2],out=outB);
// 略
RAM8(in=in,load=loadG,address=address[0..2],out=outG);
RAM8(in=in,load=loadH,address=address[0..2],out=outH);
// アドレスのout値取得
Mux8Way16(a=outA,b=outB,c=outC,d=outD,e=outE,f=outF,g=outG,h=outH,sel=address[3..5],out=out);
}
RAM8*8のイメージ
[000][000] RAM8A
[001][000] RAM8B
[010][000] RAM8C
[011][000] RAM8D
[100][000] RAM8E
[101][000] RAM8F
[110][000] RAM8G
[111][000] RAM8H
カウンタ (p46,p52~53)
・タイムユニットが進むごとに値が加算される。
out(t)=out(t-1)+c ※cには通常1が用いられる
・一般的なCPUにはプログラムカウンタが含まれ、
次に実行されるプログラム演算のアドレスとして解釈される。
・加算以外に値の設定(load)とクリア(reset)が可能
PC(in=入力,lnc=加算有無,load=書込,reset=初期化,out=出力);
hdl式
(各種回路について)
p45図参照
カウンタの実装(p52~54)
nand2tetries/03/aの「PC.hdl」の実装を行う。
・読み込み
load,inc,resetが0の場合は、out(t)=out(t-1)
・加算
incが1の場合は、out(t)=out(t-1)+1 ※読み込んだ値+1
・書き込み
loadが1の場合は、out(t) = in(t-1) ※前回の値に関わらず入力値を使う
・リセット
resetが1の場合は、out(t)=0 ※前回の値,入力 に関わらず0を使う
上記の処理完了後に値を保存
(各種回路について)
If reset (t-1) then out(t)=0
else if load(t-1) then out(t) = in(t-1)
else if inc(t-1) then out(t) = out(t-1)+1
else out(t) = out(t-1)
関数
P54 図3-5参照
PC (各種回路について)
CHIP PC {
IN in[16],load,inc,reset;
OUT out[16];
PARTS:
Inc16(in=r1,out=v1);
Mux16(a=r1,b=v1,sel=inc,out=v2);// inc
Mux16(a=v2,b=in,sel=load,out=v3);// load
Mux16(a=v3,b[0..15]=false,sel=reset,out=v4); // reset
Register(in=v4,load=true,out=out,out=r1);
}
本日の予定
組み合わせ回路と順序回路(p41)
各種順序回路について(p42~p55)
まとめ
まとめ(p46-p48,p56)
 組み合わせ回路
組み合わせ回路とは、入力値のみで時間に関係なく出力値が直ちに決まる
回路
 順序回路
順序回路とは、ひとつ以上のDFF回路が直接または間接的に組み込まれ、
出力値は、現在のクロック周期から次のクロック周期に移行した、
タイミング変化する。※同じく周期においては変化しない。
 最後に
組み合わせ回路と順序回路を作成してきました。
これで、コンピュータ全体を構築するために必要な回路は全て
出揃ったことになります。
次回は、機械語です。少し、ソフトウェアよりになります。
(まとめ)

コンピュータシステムの理論と実装3