竹下徹の応用電磁気学II-2002 第九回

論理回路によるコンピュータとその動作

ここでいうコンピュータとは、現在我々が使用している通常の計算機であるノイマン(Von Neumann) 型計算機のことで、実行すべき指示(プログラム)をあらかじめすべてメモリ上においておき、一気に実行する機械のことである。利点は実行速度が速い、繰り返しに強い(面倒な計算をさせるのに向いている)、一方で学習能力(計算機自身が自分のプログラムを書き換えて周りの状況に合わせてゆく能力)は無いので必ず一から始める必要がある。この方のコンピュータが現在みなさんが使っている通常の計算機である。従ってあらかじめ作られたようにしか動作しない。例えばワープロを使うときも、ワープロプログラムのメニューやポップアップのできることしか、変更できない。設定を変更できるかもしれないが、それもメモリ上のプログラム本体を変更するものではない。その意味で全てあらかじめ仕組まれた部分で計算しているににすぎない。

主要部分の全体の構成図を示す。

計算機を作る上で始めに決定しておく事項
扱うデータおよび命令のビット幅、最近は32や64ビットが主流だが、
ここでは、最低限の事ができれば良いので簡単のため5ビット計算機とする。
一方メモリーの容量に直接関連する奥行きはアドレス(番地)として管理される。こうしてアドレスバスの幅も決まる。つまりメモリーはビット幅(ここでは5ビット=1ワードとも呼ぶ)と奥行き(メモリ容量)を有する2次元的な存在である、各ビットはD-FFで作られている。ここでは奥行きを4個とする。つまり、5*4=20個のD-FFが必要になる。
この、4ワードメモリのコンピュータの場合、アドレスバス幅は2ビットで十分である:2^2=4、ついでにデータバスも存在するがその幅も2ビットとする。

メモリからのデータ・命令の出し入れ(やりとり)

メモリーはビット幅(ここでは5ビット)と奥行き(4ワード)を有する2次元的な存在である、各ビットはD-FFで作られている。つまり、5*4=20個のD-FFから構成される。この奥行きを番地またはアドレスとよび、データ(メモリー内の情報はこのワード単位のデータとして、恒に5ビット=1ワードづつ移動する。
これを制御するにはどの奥行き(番地、アドレス)を指示するアドレス制御回路と一つの番地データをコピーしたレジスター(命令レジスター)がメモリーのデータの出し入れに使われる〔今は出す一方で入れることは考えてない:どうやってプログラムをメモリー上に持ってくるかってこと)。メモリー制御はアドレスの設定4ワードあるので、4本のラインのどれかがONになる事により、命令レジスターへコピーが起こる。これをを作るのがアドレス解読回路である。メモリー内部のデータ(ビット)をなんと解釈するかは人間の定義である。ここでは5ビットのデータを3ビット命令部と2ビット(アドレスレジスターのビット数と一致)の番地部に当てた場合を考える。メモリのデータは1ワードづつ命令レジスタへコピーされる。その際どのアドレスからデータをと取って来るかはアドレス制御回路が決める。3ビット命令部とでは23=8種類の命令を持つことができる。2ビットの番地部に当てた場合を考える。

メモリーからのデータは命令ばかりでなく単なる数値の事もある、計算をするためである。そう言うときは命令レジスターは命令を保存するのでは無く、データを保存する。load, store,add,subtract, stop, jump, jump-minus合計7個の命令を考える。上の図でsubtract は文字通り引き算を行うときsubtract=1となる。これで減算ができることはすでに述べた。一方load=1とはこのときsubtract=0なので、ANDの入力側が0なのでANDは必ず0を出力する。よってFAの片側の入力は00000である。つまり、命令レジスタのデータと0の和を取ることになる。その結果はACCに納められるので、結局loadとは命令レジスタのデータをACCにコピーする事を行う。これがloadである。subtractが減算を行うことはすでに述べた。異なる点は、減算結果はACCレジスタに入ることである。load 命令ではload=1となり(その他のすべての命令は0であることに注意) 命令Mレジスタの内容にゼロを加えてその結果をACCに入れたので、load:"0"+M->ACCと表示する。同様にaddとsubtractは, add: ACC+M->ACC,subtract:ACC+M->ACC=>ACC-M->ACC

またstore命令は,メモリにデータを書き込む作業を行う。このときどのアドレス(番地)にデータを書き込むのかを指定できるように、命令は命令そのもの(3ビット)とアドレス(2ビット)からなっている。store addressという構造をとる。

メモリの構造はつぎのようであった。ACCレジスタの出力は左から各アドレスへ流れる。どのアドレスのD-FFに書き込まれるかは番地解読回路の出力による。タイミングはT4を使う、同様にload,subtract, addのタイミングもT4である。stop命令:もちろん実行を止める命令である。T4とANDをとって、クロック発生回路にResetをかけてclockがそれ以上出ないようにする。

jump命令あるいはjump-minus命令は命令レジスタの番地部のデータ(2ビット)を無理やりアドレスレジスタに書き込むことにより、実行をjump させる事ができる。

クロック:コンピュータ内のすべての回路はタイミングパルス(クロック)に従い同期して動いている。このためコンピュータの動作の速さの目安ともなっている。ここで作っているコンピュータにはT1,T2,T3,T4の4つのタイミングパルスを用意している。これらをここにまとめる。通常のクロッbク周波数とは、例えばT1の1秒間の個数を言う。
このT1と次のT1の間を4つに分けて仕事をこなし、次のT1で再び戻ってくる。

コンピュータ内の命令とプログラム(ソフトウエア)の関係
計算をさせるレジスタにはメモリを引っ張り出した命令レジスタ、計算結果をいれて
おくACCレジスタがあった。数値が入るときは5ビット全部数値のつもりで扱うが、
命令の場合3ビットを命令そのもの、のこり2ビットを命令に付属するアドレス情報
として扱う事にしている。
例えば   add命令は add M(i) と  addという命令を表す部分と M(i)というアドレスを表す(M(i)はメモリのi 番地のデータをACCに加える事を示す。
つまり  add M(i) は ACC+memory(i) -> ACC という ACCに入っている内容(数値)とmemoru(i) というメモリのi番地に入っている内容(数値)を加えて、その結果をACCに入れるという作業を行えという事を表す。
同様にsubtract M(i) は ACC- memory(i) -> ACC という ACCに入っている内容(数値)からmemoru(i) というメモリのi番地に入っている内容(数値)を引いて、その結果をACCに入れるという作業を行えという事を表す。
またstore M(i) は ACC -> memory(i) という ACCに入っている内容(数値)をmemoru(i) というメモリのi番地に入れるという作業を行えという事を表す。ACCの内容は変化しない。
まワた load M(i) は memory(i) -> ACC という メモリのi番地に入っている内容(数値)をACCに入れるという作業を行えという事を表す。実はmemory(i)+"0"->memory(i)を行っている事はすでに述べた。
以上をまとめると;
add M(i) :   ACC+memory(i) -> ACC
subtract M(i): ACC- memory(i) -> ACC
store M(i):   ACC -> memory(i)
load M(i) :   memory(i) -> ACC

メモリー上のA番地の内容を ”A”と書く。同様に メモリー上のB番地の内容を ”B”,メモリー上のC番地の内容を”C”と書くことにする。
”A”+”B”->”C” はA番地の内容とB番地の内容を加えてC番地の内容に置き換える事を示す。
load A : とはメモリのA番地の内容をACCにコピーする
add B : でACCの内容とメモリのB番地の内容を加えてその結果をACCに入れる
store C : でACCの内容をC番地へ納める。 よって”A”+”B”の計算結果ハが”C”に格納される。ユーザはメモリのC番地のデータを見に行けば良い。
同様に”A”ー”B”の計算結果を”C”に入れるには
load A
subtract B
store C
と書けば良い。このような計算機のレジスタに密着したプログラム言語をアセンブラという。

コンピュータ内の命令とプログラム(ソフトウエア)の関係
計算機のレジスタに密着したプログラム言語をアセンブラを使ってみる。ところで、いままで使って居なかったjump-minusとjumpを使った例を示す。問題は"A"の絶対値を ”B”に格納せよ、という物である。
このためフローチャートを考える。これは思考を図式化したものである。
そのアセンブラプログラム

start load A
jump-minus X
store B
stop
X subtract A
subtract A
store B
end stop

ここでのjump_minusは実はACCの先頭ビットを見てこれが1ならば(符号ビットと解釈して)負の数と判断している。さらにjumpを付随してXという肩書きのあるメモリアドレスへ飛ぶ。どうようにjumpの場合は判断なしに飛ぶだけ。

問題2:計算機の得意(人間が苦手)なloop(繰り返し)を使ったアセンブラプログラム 1+2+3+,,,,+100を計算せよ。

start load zero
store S
load one
store N
loop load S
add N
store S

load N
add one
store N
load hundred
subtract N
jump_minus end
jump loop
end stop

ここでzeroやoneやhundred はそれぞれ0という数値、1という数値、また100
という数値が格納されたメモリ上のアドレスを示す。最終結果はSという名のメモリアドレスに納められるので、これを参照すればよい。