法政大学国際文化学部

情報システム概論

担当 重定 如彦

20081014

 

4回 ハードウェア(その2)

1.      主記憶装置(メモリ)の内容

メモリには、中央処理装置(以下CPUと記述します)に指令を与えるための「プログラム」と、プログラムで使われる「データ」の2種類のものが格納されます。例えば、「メモリの4000番地から4128番地に格納されている数字の合計を計算せよ」という指令の手順を示したものが「プログラム」であり、「メモリの4000番地から4128番地に格納されている数字」が「データ」です。

プログラムは、機械語と呼ばれる言語で記述されます。機械語にはCPUに処理(=計算)を実行させるための様々な命令が用意されており、それぞれの命令は数バイトの数字で符号化されています。例えば、(00)16という数字が足し算を行うための命令、
(01)16が引き算を行う為の命令のように、一つの数字がCPUに何らかの処理をおこなわせるための命令の意味を持っているのです。プログラムは、これらの機械語の数字の羅列で表現され、メモリの中に格納されます。プログラムは、プログラムが格納されたメモリのアドレスをCPUに渡す(知らせる)ことで実行されます。その際にCPUは指示されたアドレスに記述されている機械語の命令を順番に実行します。下の図は、プログラムがメモリの「2000番地から3500番地」、プログラムが扱うデータがメモリの「4000番地から4128番地」に格納されている状態を表しています。

 

メモリの中ではプログラムとデータはいずれも数字の羅列で表現されているため、見た目にはメモリの中身がプログラムであるかデータであるかの区別はできません。従って、データの部分をプログラムとして実行しようとすると正しく動かない点に注意が必要です。一見これは不便なことのように思えますが、プログラムとデータを混在させるということは非常に重要なアイディアです。メモリの中にプログラムとデータを混在させることができるコンピュータのことをプログラム内蔵式、別名「フォンノイマン型」コンピュータと呼び、現在のほとんどのコンピュータがこの方式で作られています。

プログラム内蔵型のコンピュータの利点は、メモリの中にプログラムを読み込むことができるため、同じ機械でいろんな作業を行うことができるという点にあります。プログラム内蔵式でない計算機の例としては、電卓がありますが電卓は四則演算などの限られた動作しか行えず、例えばワープロなどの他の用途には使うことはできません。一方コンピュータはプログラム(ソフト)をメモリに読み込んで実行することで例えばワープロとして使ったり、インターネットを見たり、メールを書いたりといろんなことに使うことができます。このように、コンピュータが一つのことだけでなく、いろんな用途につかうことができるのは、プログラム内蔵式の発明のおかげです。

2.      中央処理装置(CPU)の仕組み

CPUの仕事を一言で表すと、「メモリに格納されている機械語で書かれたプログラムを読み込み、その内容に従って計算を行う」となります。これを行う為に、CPUは以下の装置で構成されています。

·           演算装置(算術演算回路)

機械語の命令に従って数値の演算を行う為の計算回路で、固定小数点演算装置浮動小数点演算装置10進数演算装置論理演算装置などがあります。最初の3つの装置は、それぞれの形式で表現された数値の四則演算などを行う装置です。論理演算装置は、後述する論理演算や、数値の大小の比較などを行う装置です。

·           レジスタ

レジスタは、演算装置などで使うデータを一時的に記憶させるための装置で、専用の目的をもったものと、汎用的につかうことができるものがあります。代表的なレジスタには以下のものがあります。

Ø  プログラムカウンタ

CPUはメモリに格納されているプログラムを一つ一つ順番に実行します。プログラムカウンタは、CPUが現在メモリの中のプログラムのどの部分を実行しているかを指すためのレジスタです。プログラムカウンタは機械語の命令をCPUが実行するたびに加算され、次に実行する機械語命令のアドレスを指すようになります。

Ø  メモリアドレスレジスタ

メモリのデータの読み書きを行う場合に、メモリのどの番地に対して処理を行うかを格納する為のレジスタで、メモリのアドレス選択部に送られます。

Ø  メモリデータレジスタ

メモリに対して読み書きしたデータを格納する為のレジスタです。このレジスタの内容はメモリの制御部につながっています。

Ø  命令レジスタ

メモリから読み込んだ機械語の命令を一時的に蓄えるためのレジスタです。

Ø  アキュムレータ

演算回路の演算に使うデータを一時的に蓄えるためのレジスタです。

Ø  フラグレジスタ

演算結果の数値の符合や、数字の大小関係を表すためのレジスタです。

Ø  汎用レジスタ

特定の目的に使われるのではなく、汎用的な目的で一時的にデータを蓄えるためのレジスタです。通常、汎用レジスタは複数個存在します。

·           バス

CPUの中でデータが流れる線の事をバスと呼び、以下の2種類があります。バスの太さ(バスに流すことができるデータのビット数)が太ければ太いほど一度に大きな桁数の計算を行えるのでコンピュータの性能が向上します。コンピュータの性能の指標のひとつに16ビットパソコン、32ビットパソコンといったように○○ビットパソコンと呼ぶ方法がありますが、この○○ビットは、バスの太さのことを表しています。

 

Ø  データバス

 計算などに使用するデータが流れるバスでメモリの制御部に繋がっています。

Ø  アドレスバス

 メモリのアドレスを指すデータが流れるバスでメモリのアドレス制御部に繋がっています

·           制御装置

CPUの各装置に対して制御命令を出す装置であり、以下の装置で構成されます。

Ø  命令制御部

命令レジスタに蓄えられた、次に実行する機械語の命令の種類をデコーダと呼ばれる装置を使って解読し、演算装置に適切な演算をおこなわせるための信号を送るための装置です。

Ø  記憶制御部

命令の実行に必要なデータをメモリからレジスタに読み込んだり、演算回路が行った演算結果をメモリに書き込むなど、メモリやレジスタに対するデータの読み書きの制御を司る装置です。記憶制御部はアドレスバスと呼ばれる信号線を使ってアドレス信号をメモリのアドレス選択部に送ります。また、メモリやレジスタで読み書きされるデータは、データバスと呼ばれる信号線を使って送られます

Ø  シーケンス制御部

機械語では、例えばある値が1より大きければメモリの2000番地に記述されている命令を実行、そうでなければメモリの3000番地に記述されている命令を実行するといった、条件によって命令の実行順序を制御する命令が用意されています。シーケンス制御部はこの命令の実行順序を制御するための制御装置です。シーケンス制御については次回以降の授業で解説します。

3.      CPU制御の流れの例

それでは、具体的に例をあげて、CPUがどのように計算を行うかを見てみましょう。この例では、メモリの(2000)16番地から以下のようなプログラムが機械語で格納されておりそれを実行した場合CPUの中でどのような動作が行われるかを詳しく述べます。

 

1.         (2000)16:メモリの(4000)16番地の内容を汎用レジスタ1に読み込む。

2.         (2001)16:メモリの(4001)16番地の内容を汎用レジスタ2に読み込む。

3.         (2002)16:汎用レジスタ1と汎用レジスタ2の中身を加算し、結果を汎用レジ
        スタ3に格納する。

4.         (2003)16:汎用レジスタ3の内容をメモリの(4002)16番地に書き込む。

 

 

上記のプログラムを実行すると、メモリの(4000)16番地の内容とメモリの(4001)16番地の内容が加算され、メモリの(4002)16番地に書き込まれます。

前準備として、あらかじめメモリの(4000)16番地に数字の1、(4001)16番地には数字の2、プログラムカウンタにはこれから実行するプログラムが格納されているメモリの先頭の番地である(2000)16を格納されているものとします。従ってプログラムの実行前では、それぞれのレジスタやメモリの内容は以下のようになっています。

なお、PCはプログラムカウンタ、GR1〜GR3は汎用レジスタ1〜汎用レジスタ3を表し、?は値が設定されていないため内容が不明であることを表します。また、表の中の数値はすべて16進数です。

 

レジスタ

 

メモリ

PC

GR1

GR2

GR3

 

4000

4001

4002

2000

 

 

1.         PCの指すメモリの内容を読み込み、命令レジスタに格納する。具体的にはまずPCの内容をアドレスバスを経由してアドレス選択部に送り、これから実行する機械語の命令が格納されたメモリのアドレスの番地を指定します。そして、同時にメモリの制御部のR/W信号に読み込み信号を送ることで、メモリから(2000)16番地の内容が読み出だされ、その内容がデータバスを通って命令レジスタに格納されます。

2.         命令レジスタの内容をデコーダに送り、(2000)16番地の命令の内容を解読する。

3.         命令の内容は「メモリの(4000)16番地の内容を汎用レジスタ1に読み込む」なので、メモリの(4000)16番地の内容を読み込んでGR1に格納する。読み込む具体的な手順については1と同様です。

4.         命令の実行が終了したので、PCの内容を1加算する。この結果レジスタとメモリの内容は以下のように変化します(変更された部分は灰色でぬりつぶされています)。

 

レジスタ

 

メモリ

PC

GR1

GR2

GR3

 

4000

4001

4002

2001

 

 

5.         上記の1〜4の作業を再び行い、メモリの(2001)16番地に記述されていた、「メモリの(4001)16番地の内容を汎用レジスタ2に読み込む」を実行する。

レジスタ

 

メモリ

PC

GR1

GR2

GR3

 

4000

4001

4002

2002

?

 

6.         次に、(2002)16番地の「汎用レジスタ1と汎用レジスタ2の中身を加算し、結果を汎用レジスタ3に格納する」を実行する。この時、GR1とGR2の内容がデータバスを通り算術演算回路に渡される。演算回路は合計の演算を行い、その出力結果をGR3に格納する。

レジスタ

 

メモリ

PC

GR1

GR2

GR3

 

4000

4001

4002

2003

 

7.         最後に(2003)16番地の「汎用レジスタ3の内容を(4002)16番地に書き込む」が実行され、(4002)16番地に1+2の演算結果である3が格納される。

レジスタ

 

メモリ

PC

GR1

GR2

GR3

 

4000

4001

4002

2004

 

上記の例は非常に小さなプログラムの実行例でしたが、大きなプログラムでもこの手順は変わらず、こうしたことの繰り返しでCPUはプログラムを実行します。

4.      演算回路の仕組み

CPUの具体的な制御の流れは大体上記のとおりですが、次に具体的な演算を行う演算回路がどうやって計算を行っているかについて説明します。

·           論理演算

演算回路の説明をおこなう前に、演算回路で使われる論理演算について説明します。論理演算は1つまたは、2つの1ビットの数字の演算で、AND、OR、NOTの3種類の演算があります。ANDは2つの1ビットの数字が共に1であった場合のみ1を計算結果として返すという演算で、日本語でいえば、「かつ」に相当します。2つの1ビットの数字の組み合わせは4通りあるので、

   0 AND 0 = 0
    0 AND 1 = 0
    1 AND 0 = 0
    1 AND 1 = 1

となります。これを表にまとめると以下のようになります。

AND演算

 

ORは2つの1ビットの数字のどちらか片方が1の場合1を返すという演算です。日本語でいうと「又は」になり、表になおすと以下のようになります。

OR演算

NOTはANDとORとは異なり一つの1ビットの数字を反転、すなわち1を0に、0を1にする演算です。

      NOT 0 = 1

      NOT 1 = 0

ここまでは、1ビットの数字の論理演算を説明しましたが、複数ビットの数字の論理演算も可能です。複数ビットの場合、それぞれの桁ごとに演算をおこないます。2進数以外の数の論理演算をおこなう場合は、一旦2進数になおしてから計算する必要がある点に注意して下さい。なお、ANDやORの演算で片方の数字の桁の数が少ない場合は足りない部分に0をおぎなって計算します。また、NOTの場合は何桁で計算するかをあらかじめ決めておく必要があります。

例1: (10011) AND (1110) を演算する場合、以下のように縦に数字を並べ、それぞれの桁をAND演算すればよい。

        (10011)

   AND  (01110)

   答えは  (00010)

例2: 10進数の9を8桁の2進数でNOT演算するには、まず9を一旦8桁の2進数になおしてから演算します。9を8桁の2進数に直すと(00001001) になり、この各ビットの数字を反転すれば良いので答えは (11110110) です。

·           課題1
以下の論理演算を行い、答えを2進数で示せ。

Ø  (11011) OR (1101)

Ø  NOT 109     (ただし、109は10進数。答えは2進数8桁で)

Ø  (6C)16 AND (D9)16

·           論理回路
 上記のAND、OR、NOTは、電気回路になおすことが出来ます。例えばAND回路はリレーを使って以下のように作成することが出来ます。

上記の回路では電球にランプを点灯させるには、内側の2つのスイッチを両方ともONにする必要がありますが、これはまさに、両方とも1(スイッチがON)の場合だけ1(電球が点灯する)を返すというAND回路を表します。同様の方法で、OR回路やNOT回路を作ることができます。

なお、実際の論理回路はリレーではなく、高速な電子回路を使って作られていますが、原理はリレー回路と同じです。

·           1桁の2進数の加算回路
それでは、実際も上記のAND、OR、NOTの論理演算回路をどのように組み合わせれば、演算を行う電子回路で作成できるかの例を1桁の2進数の足し算をおこなう回路で説明します。1ビットの足し算は以下の4通りに場合わけできます。なお、下の式で()は省略します
 
0+0=00  0+1=01  1+0=01  1+1=10

これを桁ごとに表になおすと以下のようになります。

2の位の答え

 

1の位の答え

 

 

ここで、2の位の答えをよくみると、ANDの表と全く同じであることがわかります。従って、1ビットの数字の足し算の2の位の答えは、AND回路を一つ使った回路で答えを求める回路を作成できることがわかります。 

一方1の位ですが、こちらはそれほど単純ではありませんが、計算する数をそれぞれA,Bとすると 

(NOT(A AND B)) AND (A OR B)

 という論理演算で答えを表すことができます。この式の求め方はこの授業の範囲外なので説明しませんが、この式で1の位の答えが求められることを確かめてみましょう。式の左の部分の (NOT(A AND B)) の部分は、 A AND B をNOT演算によって1と0を反転させたものなので表になおすと、

NOT(A AND B)

 となります。この表に A OR B の各値を AND 演算すればよいので、結果として以下のように正しく計算できていることがわかります。

NOT(A AND B)

 

A OR B

 

1の位の答え

AND

 

 

 

これを回路図になおすと以下のようになります。一桁の足し算をおこなうためにずいぶん複雑な回路が必要だと思うかもしれませんが、実際の複数桁の計算を行うなどの演算回路はこれをもっと複雑にしたもので、コンピュータの演算回路のほとんどはこの3種類の論理演算回路の組み合わせによって作られているのです。

 この回路の動作例として、この回路で1+0を計算した場合の動作を手順を追って説明します。1+0を計算するにはまず、Aに電流を流し(=1)、Bに電流をながさない(=0)状態にします。この後はa〜kの値を順番に見ていくことで、この回路の出力結果であるjとkを求めることができます。

1.         まず、Aとa、c、eは直接繋がっているので、aとcとeの値は1に、Bとb、d、fも直接繋がっているのでbとdとfの値は0になります。

2.         j = a AND b = 1 AND 0 なので jの値は0になります。

3.         g = c AND d = 1 AND 0 なので gの値は0になります。

4.         h = NOT g = NOT 0 なので hの値は1になります。

5.         i = e OR f = 1 OR 0 なので iの値は1になります。

6.         k = h AND i = 1 AND 1 なので kの値は1になります。

上記の結果から、j=0、k=1 となり、 0+1=01 とこの回路が正しい答えを出していることがわかります。

 

·         課題2

 A=1、B=1の場合、上記の回路のaからkの値が何になるかを計算し、それぞれの値を述べよ。また、A+Bの計算結果がいくつになるかを答えよ。

 

·         その他の論理演算

論理演算には実はANDORNOT以外にもいくつか種類があります。例えばビットシフトという論理演算は、数字の各ビットを一つ左(又は右)にずらす論理演算です。左にずらした場合、一番左の桁は捨てられ、一番右の桁には0が代入されます。

比較演算は、2つの数字の大小を比べる論理演算です。CPUの比較演算回路では、比較した結果を2ビットのフラグレジスタに格納します。フラグレジスタの片方のビットは比較結果が等しかった場合に1になり、もう片方のビットは比較した結果前者の数字のほうが大きければ1になります。下にABの数字を比較回路で演算した結果のフラグレジスタの内容を表にまとめます。

 

フラグレジスタ

上位ビット

下位ビット

A>B

A=B

A<B

 

5.      課題

このプリントの課題1〜2を行い課題のメールとして提出して下さい。

締め切りは来週の授業までです。

 

6.      前回の課題の答え

(9ABC)16番地を2進数に直すと以下のようになります。
 
(1001101010111100)


 

  それぞれ16進数の   9   A   B   C   に対応する。
 

従ってアドレスバスには以下のような信号を流します。

 

A0

A1

A2

A3

A4

A5

A6

A7

A8

A9

A10

A11

A12

A13

A14

A15

 

 

 

 

(6E)162進数に直すと以下のようになります。
 
(01101110)
 

      それぞれ16進数の   6   E   に対応する。
 

従ってデータバスには以下のような信号を流します。

 

D0

D1

D2

D3

D4

D5

D6

D7

 

この問題ではデータを書き込むので R/W 信号には「書き込み」を表す「0」を送ります。

また、書き込みまたは読み込み時にはCE信号には「1」を送ります。

 

問2 答えは無数にあるので省略します。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
出席、課題のメールはta080017@mail.edu.i.hosei.ac.jpにお願いします。

質問のメールなどは、sigesada@.hosei.ac.jpまでお願いします。

授業の資料の最新版はhttp://www.edu.i.hosei.ac.jp/~sigesada/にあります。