電子計算機工学 II
NAGASAKA Yasunori
2002/09/20
|
http://edu.isc.chubu.ac.jp/naga/index.html で公開中
1 割り込み
1.1 割り込みの概念
1.1.1 割り込みが効果のある例
1.2 Z80 における割り込みの扱い
1.2.1 NMI を受け取ったときの処理
1.2.2 INT を受け取ったときの処理
1.2.3 割り込みの優先順位の決定(デイジーチェイン)
1.2.4 多重割り込み
1.2.5 練習問題
2 CPU の周辺回路
2.1 メモリアドレスの扱い
2.1.1 メモリ空間と IO 空間
2.1.2 アドレスデコーダ
2.1.3 練習問題
2.2 その他の周辺回路
2.2.1 バスバッファ
2.2.2 リセット
2.3 Z80CPU を用いた簡単なシステムの構成例
2.3.1 例1
2.3.2 例2
2.3.3 例3
2.3.4 練習問題
3 PIO を用いた入出力
3.1 Z80PIO
3.1.1 機能の特徴
3.1.2 モード 0 (出力モード)
3.1.3 モード 1 (入力モード)
3.1.4 モード 2 (入出力、双方向モード)
3.1.5 モード 3 (ビットモード)
3.2 8255
3.2.1 機能の特徴
3.2.2 スイッチと LED
3.2.3 練習問題
3.2.4 プリンタの制御
3.2.5 練習問題
4 CPU を高速化する技術
4.1 CPU 発展の歴史
4.1.1 4004
4.1.2 8080
4.1.3 8086
4.1.4 80286
4.1.5 i386
4.1.6 i486
4.1.7 Pentium
4.1.8 Pentium Pro
4.1.9 Pentium with MMX Technology
4.1.10 Pentium II, III
4.1.11 Pentium 4
4.2 高速化の技術
4.2.1 パイプライン
4.2.2 ワイヤードロジック
4.2.3 キャッシュ
4.2.4 スーパースケーラ (スーパースカラー)
4.2.5 分岐予測
4.2.6 ハーバードアーキテクチャ
4.2.7 RISC (Reduced Instruction Set Computer)
4.2.8 アウトオブオーダ実行
4.2.9 投機実行
4.2.10 スーパーパイプライン
4.2.11 SMP (Simmetric Multi Processing)
4.2.12 レジスタリネーミング
4.2.13 SIMD (Single Instruction Multiple Datastream)
4.2.14 ハイパースレッド
4.3 その他の技術
4.3.1 仮想記憶
4.3.2 特権レベル
4.4 練習問題
1 割り込み
1.1 割り込みの概念
割り込みとは ?
→ 周辺装置がCPUと通信するための手段
CPU と周辺装置
通常のプログラムはメモリから命令を取り出して順に実行する。周辺装置の相手はしない。
プログラムの実行
JP, CALL, RET などがあると命令実行の順序は変化するが、プログラムに書かれているとおり
いつでも同じように実行される。
もし割り込みを使わずに周辺装置を利用するには、次のような方法が考えられる。
- プログラムの途中、所々に周辺装置の状態を調べるサブルーチンを入れる。
ソフトウェアによるデータの確認
サブルーチン TEST の処理内容は次のようになる。
TEST: キーボードを調べる → もしデータがあれば処理 → マウスを調べる → もしデータがあれば処理 → NIC を調べる → もしデータがあれば処理 → シリアルポートを調べる → もしデータがあれば処理 ・・・ RET
(ヒント): このような処理をポーリングと呼ぶ。
一般的には割り込みを使用するよりも効率は悪いとされるが、
場合によっては割り込みを使用するよりもよい場合もある。
- 本体のメインルーチンをイベント駆動型に作る。
無限ループ {
もしキーボードのデータがあれば処理
もしマウスのデータがあれば処理
もしモデムのデータがあれば処理
もし NIC のデータがあれば処理
:
:
何もなければ計算を実行
}
(ヒント): Windows などで一般に利用されるウィンドウ, GUI ベースのプログラムは
上記の考え方で作られている。
両方式ともにいつ発生するかわからない周辺装置のデータの有無をソフトウェアで
検出するため効率が悪い。
それに対して、
割り込みは周辺装置でデータが発生したときにのみ CPU に信号を送り、
必要な時だけ処理ルーチンを起動できる。
よって普通のプログラムを作るときは周辺装置のことを気にする必要がない。
割り込み処理ルーチン
割り込み処理ルーチンは、普通のプログラムとは独立して用意しておけばよく、
両者の実行のタイミングなどは考えなくてよい。
1.1.1 割り込みが効果のある例
プリンタで印字する場合の処理
- 割り込みが使えない場合は、次のデータをいつ送ってよいかわからないので、頻繁に
プリンタの状態を確認しなければならない。
- 割り込みが使える場合は、次のデータが必要になったら割り込みを使ってプリンタから
要求が来るので、それまでは他の仕事ができる。
- CPU における命令の実行と、プリンタでの印字は時間にしておよそ 1000 倍程度の違い
がある。よってプリンタが印字中に CPU が解放されれば多くの命令を実行することが
できる。
1.2 Z80 における割り込みの扱い
割り込みには、CPU が無視できない割り込みと、設定によって無視できる割り込み
の2 種類がある。
Z80 ではこの 2 種類を異なる信号 NMI と
INT で区別する。これらは重要度によって使い分けがされる。
NMI : Non Maskable Interrupt
無視できない割込みで CPU は必ず処理する。
INT : INTerrupt
通常の割込みで設定によって無視できる。
1.2.1 NMI を受け取ったときの処理
NMI を検出するタイミング
(ヒント):
もし上の図で 3 番目のタイミングでNMIが変化したとすると、
次の命令は普通に実行され、次の次の命令が無効となる。
処理の流れ
-
次の命令のフェッチサイクルは実行されるが無効
-
PC(無効になった命令を指す)をスタックに退避する
-
PC に 0066H を入れ、そこから実行。NMI処理ルーチンを実行
-
RETN(RETurn from NMI)が実行されると、スタックから戻り番地が取り出され PC に
セットされる。その後、もとのプログラムの実行を続ける。
例
0066 EX AF, AF' ; レジスタ退避
0067 EXX
...
割り込み処理本体
...
00A0 EX AF, AF' ; レジスタ復帰
00A1 EXX
00A2 RETN ; ★★
...
1024 LD A, (2003H)
1027 LD B, (IY+D)
102A RRCA ; ★
102B CP (IX+D)
★
この命令実行中に割り込みが発生したとすると、次の命令が無効となる。
102B はスタックに退避され、0066H から割り込み処理が実行される。
★★
割り込み処理が終了したので、もとのプログラムに戻る。102B の CP から
再開される。
(ヒント):
EX, EXX は(レジスタの値を保存したい時に)裏レジスタと変換する命令。
レジスタの値を保存する他の方法として、スタックへの退避もよく使われる。
- 裏レジスタと変換するのは、高速だが 1 回しか実行できない。
- スタックにレジスタの値を保存するのは、低速だが何回でも実行可能。
上記の割り込み処理をスタックを使って書き直すと以下のようになる。
0066 PUSH AF
PUSH BC
...
割り込み処理本体
...
POP BC
POP AF
RETN
CPUには通常割込みの許可/不許可を示すフリップフロップの
IFF1、IFF2がある。
NMIを受け取ると、IFF2(バックアップ用)にIFF1
がコピーされ、IFF1は(通常割込み不許可)になる。
RETNを実行するとIFF1にIFF2
がコピーされ元に戻る。
(ヒント):
(まずこのようなことは起こらないが)
NMI処理ルーチン実行中に再度
NMIを受け取ると、IFF1の
情報がIFF2にコピーされ、
もともと許可/不許可のどちらだったかわからなくなる。これを防ぐために、ハード的に連続した
NMIを受け取らないような仕組みが用意されることもある。
1.2.2 INT を受け取ったときの処理
INT を検出するタイミング
(ヒント):
検出のタイミングは、NMI, INT
ともに同じで、命令実行時の最後の CLK の立ち上がりであるが、検出する状態が異なる。
割り込み応答サイクルの特徴
- M1は L になるが、MREQ,
RDはならない。AB に次の命令の番地は出力されるが、
メモリは反応しない。
- IORQが L になる。よって割り込みを要求した装置は
M1, IORQが同時に L になる
ことで要求が受け付けられたことがわかる。
-
T2の後に、TWが自動的に
2 個入れられる。これは周辺装置が反応する時間を作るためである。2 個で足らなければ、
周辺装置からWAITを送ってTW
を増やすことができる。
処理の流れ
-
次の命令のフェッチサイクルは無効
- M1, IORQの L を確認して、
周辺装置はジャンプする先を DB を通して指定する。(T3
で読み込まれる、実際の指定の仕方はモードにより異なる)
-
PC(無効になった命令を指す)をスタックに退避する
-
PC にジャンプ先の番地を入れ、そこから実行。INT 処理ルーチンを実行
-
RETI(RETurn from INT)が実行されると、スタックから戻り番地が取り出され PC に
セットされる。その後、もとのプログラムの実行を続ける。
割り込みには 3 種類のモード(0,1,2)があり、それぞれ処理が異なる
モードの設定には IM (Interrupt Mode) という命令で 0,1,2 の値を指定する。
また、EI (Enable Interrupt) で割り込み許可を、DI (Disable Interrupt) で
不許可を設定できる。
モード 0 の処理
割り込み処理ルーチンを DB で指定する。この場合、先頭アドレスを指定するのではなく、
命令自体を指定する。RST か CALL 命令を使うことが多い。
(ヒント):
RST, CALL のどちらを使うかは、周辺装置の設計者、プログラマが決める
例として、装置 1, 装置 2 が接続されており、装置 1 の処理ルーチン
は 0020H 番地、装置 2 の処理ルーチンは 0100H 番地から配置されるとする。装置
1 の割り込み処理ルーチンの指定は、RST 20H (E7) または CALL 0020H (CD
20 00) のどちらかで指定できる。装置 2 の割り込み処理ルーチンの指定は、
CALL 0100H (CD 00 01) となる。この場合 RST は使用できない(RST で指定で
きる番地と異なる)。)
モード0における割込処理ルーチンの指定
モード 1 の処理
割り込み処理ルーチンは 0038H 番地からに決められており、常にそこにジャンプする。
DB から指定する必要はない。
モード 2 の処理
モード 2 では割り込み処理ルーチンの先頭アドレスをあらかじめ一覧表に
して、メモリに置いておく。そして割り込みが受け付けられた時に、周辺装置
は先頭アドレスを指定するのではなく、一覧表の中の位置
を指定する。この位置を割り込みベクタと呼ぶ。
例として、1000H からを一覧表として使う場合は、I レジスタに 10H を入れておく。
これで、1000H -- 10FFH が一覧表となる。例えば装置 2 の割り込み処理ルーチンが
3000H からあるとすると、1004H, 1005H に 3000H を登録しておく。
モード2における割込処理ルーチンの指定
割り込みが受け付けられると、装置 2 は 04H を DB から送る。この場合 I レジスタに
登録されている 10H と 04H を合成してできる 1004H が表中の位置となり、そこに登録
されている 3000H にジャンプする。
各モードにおける指定可能な割り込み処理ルーチンの個数
モード別割り込み処理ルーチンの個数
モード |
バイト数 |
指定可能なルーチン |
備考 |
0 |
1 |
8 |
RST 命令を指定 |
0 |
3 |
65536 |
CALL 命令を指定 |
1 |
0 |
1 |
番地固定 |
2 |
1 |
128 |
割込ベクタを指定 |
1.2.3 割り込みの優先順位の決定(デイジーチェイン)
割り込みをかける装置を複数接続する場合は、以下の仕組みにより優先順位を指定できる。
デイジーチェインによる優先順位の指定
すべての装置において、
-
IEI が H のときは割り込み可能で、割り込みをかけたら IEO=L、かけなかったら IEO=H とする。
-
IEI が L のときは割り込み不可で、IEO=L とする。
-
割り込み処理が終って RETI が実行される時に、IEO=H に戻して割り込み可能な状態にする。
優先順位の高いものは、たとえ優先順位が低い装置が割り込み処理中でも優先
的に割り込みをかけられる。その場合、優先順位が低い装置が割り込み処理は
一時中断され、優先順位の高い装置の割り込み処理に制御が移る。これを
多重割り込みという。
1.2.4 多重割り込み
通常割り込みが発生すると、連続して割り込みを受け付けないように CPU 内部で自動的に
IFF1=0 になる。
多重割り込みを可能にするには、割り込み処理ルーチンの先頭で EI を実行しておく必要がある。
多重割り込みを受け付けない/受け付ける処理ルーチンの例
INT1 EX AF, AF' ; ★
EXX
...
割り込み処理本体 1
...
EX AF, AF' ; レジスタ復帰
EXX
EI ; ★★
RETI
INT2 EI ; ★★★
EX AF, AF' ; レジスタ退避
EXX
...
割り込み処理本体 2
...
EX AF, AF' ; レジスタ復帰
EXX
RETI
★
多重割り込みは困るので割り込み処理の間ずっと EI を実行しない
★★
割り込み処理が終了して、もとのプログラムに戻る直前に EI を実行して
再び割り込み可能にする
★★★
多重割り込みをかけられても問題ないので、最初に EI を実行する
1.2.5 練習問題
指定された条件を満たすように割り込み処理ルーチンを作成しなさい。
- NMI の処理ルーチンで、レジスタの退避は表裏レジスタの交換で行なう。
退避するレジスタは A,B,C,D,E,F とする。
A,B,C,D,E,F レジスタをこの順番で 1000H 番地からメモリに記録する。
- INT の処理ルーチンで、レジスタの退避は表裏レジスタの交換で行なう。
退避するレジスタは A,B,C,D,E,F とする。多重割り込みは禁止する。
A,B,C,D,E,F レジスタをこの順番で 1000H 番地からメモリに記録する。
- INT の処理ルーチンで、レジスタのスタックを使用する。
退避するレジスタは A,B,C,D,E,F とする。多重割り込みを許可する。
A,B,C,D,E,F レジスタをこの順番で 1000H 番地からメモリに記録する。
2 CPU の周辺回路
2.1 メモリアドレスの扱い
2.1.1 メモリ空間と IO 空間
メモリ空間と IO 空間
- メモリは、MREQがアクティブの時のみ AB の内容を
解析する
- 周辺装置は、IORQがアクティブの時のみ
AB(A0--A7) の内容を解析する
2.1.2 アドレスデコーダ
アドレスデコーダとは、指定されたアドレスの値を解析して適切なメモリの記憶場所
を選択する信号を生成する回路である。アドレスデコーダにはメモリLSI内部に組み込まれ
ているものと、メモリLSI外部で回路として実現されていて、メモリLSIを選択するものの
2 種類がある。
メモリLSI内部のアドレスデコーダ
複数のメモリLSI、チップを用いて主記憶を構成する場合は、チップ選択のためのデコーダが
必要となる。
例
1K × 1Byte のメモリLSI 4 個を組み合わせて、4KB の主記憶を構成する場合
アドレスデコーダ
この場合、アドレスデコーダの入出力の対応関係は次のようになる。* は
Don't care、その値が何であってもよいことを表す。A0 〜 A9 は各メモリチッ
プに共通に接続される。A10, A11 の 2bits の値の組合せで 4 個のメモリチッ
プのどれを選択するかが決まる。4KB の主記憶のアドレスを表現するのは
12bits で十分であり、この場合 A15 〜 A12 はアドレスの決定に必要ないので * とな
る。
ただし、アドレスを 0000H 〜 0FFFH のように 64KB 中で
固定させる必要がある場合は A15 〜 A12 の値も決める必要がある。
例として、0000H 〜 0FFFH では A15 〜 A12 はすべて 0 である必要がある。
入出力の対応関係
A15 〜 A12 |
A11 |
A10 |
MREQ |
出力 |
* |
0 |
0 |
0 |
0 |
* |
0 |
1 |
0 |
1 |
* |
1 |
0 |
0 |
2 |
* |
1 |
1 |
0 |
3 |
* |
* |
* |
1 |
なし |
例2
8K × 1Byte のメモリLSI 8 個を組み合わせて、主記憶を構成する場合の
AB の分配法、アドレスデコーダ、アドレスデコーダの入出力の対応関係、
DB との接続法を示しなさい。
アドレスデコーダ
入出力の対応関係
A15 |
A14 |
A13 |
MREQ |
出力 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
2 |
0 |
1 |
1 |
0 |
3 |
1 |
0 |
0 |
0 |
4 |
1 |
0 |
1 |
0 |
5 |
1 |
1 |
0 |
0 |
6 |
1 |
1 |
1 |
0 |
7 |
* |
* |
* |
1 |
なし |
例3
8K × 1bit のメモリLSI 8 個を組み合わせて、主記憶を構成する場合の
AB の分配法、アドレスデコーダ、アドレスデコーダの入出力の対応関係、
DB との接続法を示しなさい。
アドレスデコーダ
この場合、すべてのメモリチップが同時に動作するため、外部のアドレスデコーダは存在しない。
よって入出力の対応関係は必要ない。
2.1.3 練習問題
以下の組合せで主記憶を構成する場合の、AB の分配法、アドレスデコーダ、
アドレスデコーダの入出力の対応関係、DB との接続法を示しなさい。
- 8K × 1Byte のメモリLSIを組み合わせて、64KB の主記憶を構成する
- 8K × 1bit のメモリLSIを組み合わせて、8KB の主記憶を構成する
- 1K × 1Byte のメモリLSIを組み合わせて、16KB の主記憶を構成する
- 1K × 1bit のメモリLSIを組み合わせて、4KB の主記憶を構成する
- 8K × 4bits のメモリLSIを組み合わせて、16KB の主記憶を構成する
2.2 その他の周辺回路
2.2.1 バスバッファ
システムバスに接続されている装置は、配線の長さ、波形の乱れ、ノイズ等の
影響を受けないようにバスバッファというアンプを介して接続することがある。
バスバッファ
データバスはデータの流れが双方向なので、それに対応したバスバッファが使
用される。
アンプにゲート機能を組み合わせて、装置が選択されていない時は信号を取り
込まないようにすることもある。
2.2.2 リセット
RESET に与える信号は負論理なので、通
常は H であり、L になると CPU がリセットされる。
リセット信号を受けると、PC ← 0, I ← 0, R← 0, IM=0, DI が実行される。
RESET が L → H になると CPU は動作を再開する。
0 番地の命令から実行を始める。
2.3 Z80CPU を用いた簡単なシステムの構成例
2.3.1 例1
簡単なシステムの例1
このシステムは 512 Bytes の ROM からプログラムを読み込んで、実行し、
4 bits のデータを出力することができる。
ラッチ回路の選択信号
(1)IORQ |
M1 |
(2)M1の否定 |
(1) OR (2) |
(1) NOR (2) |
H |
H |
L |
H |
L |
H |
L |
H |
H |
L |
L
|
H
|
L |
L |
H
|
L |
L |
H |
H |
L |
よって、IORQ=L かつ M1=H
の場合のみラッチ回路が機能し、外部にデータを出力できる。IORQ=L で
M1=L の場合は割り込み要求を受け付けた場合の反応なので、除外する必要がある。
メモリの構成は、AB の下位 9bits が 16 進数で 000 から 1FF の部分に割り当てられる。
例として上位 7bits が 0 とすると、0000 〜 01FF に存在することになる。
メモリの構成
ROM のアドレスの範囲
**** ***0 0000 0000 |
**** ***1 1111 1111 |
2.3.2 例2
簡単なシステムの例2
このシステムは 1K Bytes の ROM からプログラムを読み込んで、実行する。処理途中のデータは 256 Bytes
まで RAM に保持できる。また外部と 8 bits のデータを入出力することができる。メモリ容量は少ないがある程度
実用性がある。
各回路の選択信号
ROM の選択信号は 2 本あるが、それぞれの意味は以下の通り。
ROMの選択信号
MREQ |
RD |
NOR |
H |
H |
L |
H |
L |
L |
L |
H |
L |
L |
L |
H |
よって MREQ=L, RD=L, A15=0 のとき選択される。
メモリにアクセス要求かつ読みだし要求で、アドレス指定が前半32KBの領域である場合となる。
RAM の選択信号は 2 本あるが、それぞれの意味は以下の通り。
ROMの選択信号
MREQ |
A15 |
NOR |
H |
H |
L |
H |
L |
L |
L |
H |
L |
L |
L |
H |
よって MREQ=L, A15=1 のとき選択される。また、WR=L
のとき書き込み、そうでないときは読み込みとなる。
メモリにアクセス要求があり、アドレス指定が後半32KBの領域である場合となる。
ラッチ回路の選択信号は 2 本あるが、それぞれの意味は以下の通り。
ラッチ回路の選択信号
(1)IORQ |
M1 |
(2)M1の否定 |
(1) OR (2) |
(1) NOR (2) |
H |
H |
L |
H |
L |
H |
L |
H |
H |
L |
L
|
H
|
L |
L |
H
|
L |
L |
H |
H |
L |
よって、IORQ=L かつ M1=H
の場合のみラッチ回路が機能し、外部にデータを出力できる。IORQ=L で
M1=L の場合は割り込み要求を受け付けた場合の反応なので、除外するのは例1と同様。
また、WRについては、WR=H で DISABLE、つまり
WR が OFF ではラッチが機能しない。(ラッチは外部への出力なので WR
が ON である必要がある)
ゲート回路の選択信号の意味は以下の通り。
ゲート回路の選択信号
(1)IORQ |
M1 |
RD |
M1 の否定 |
NOR |
H |
H |
H |
L |
L |
H |
H |
L |
L |
L |
H |
L |
H |
H |
L |
H |
L |
L |
H |
L |
L |
H |
H |
L |
L |
L |
H |
L |
L |
H |
L |
L |
H |
H |
L |
L |
L |
L |
H |
L |
よって、IORQ=L, M1=H,
RD=L のとき選択される。割り込み要求の反応を除外するのはラッチ回路
の場合と同様。
割り込み要求の反応ではなく、外部へのアクセス要求で読み出しの時選択される。
メモリの構成は、A15=0 の時 ROM が、A15=1 の時 RAM が選択される。
1KB の ROM は、AB の下位 10bits が 16 進数で 000 から 3FF の部分に割り当てられる。
例として上位 6bits が 0 とすると、0000 〜 03FF に存在することになる。
メモリの構成
ROM のアドレスの範囲
0*** **00 0000 0000 |
0*** **11 1111 1111 |
256B の RAM は、AB の下位 8bits が 16 進数で 00 から FF の部分に割り当てられる。
例として上位 8bits が 1000 0000 とすると、8000 〜 80FF に存在することになる。
また、上位 8bits が 1111 1111 とすると、FF00 〜 FFFF に存在することになる。
RAM のアドレスの範囲
1*** **** 0000 0000 |
1*** **** 1111 1111 |
このシステムでは AB の上位の数 bits を利用していないのでメモリのアドレスを
64KB のメモリ空間中で確定させることができない。
2.3.3 例3
このシステムは外部装置とのデータの入出力の管理を専用の機能を備えた PIO で行う。
PIO と SIO
PIO : Parallel Input/Output Interface, Controller
複数の信号線を用いる入出力を制御する。一般的には 8bits のデータをまと
めて扱えるように 8 本の信号線を持つものが多い。Z80CPU は DB が 8bits
なので PIO も信号線が 8 本のものがちょうど合う。
SIO : Serial Input/Output Interface, Controller
単一の信号線を用いる入出力を制御する。CPU とのデータのやりとりは
Parallel で行うが、外部とのやりとりは単一の信号線でデータを送るために、
時分割でデータを直列のビットの並びに変換する。
簡単なシステムの例3
メモリの構成は、A12, A13 の組合せにより ROM、RAM が選択される。A13=0 の場合 ROM が、
A13=1 の場合 RAM が選択される。RAM については更に A12 の値によって 2 個のチップのうち 1
個が選択される。
8KB の ROM は、AB の下位 13bits が 16 進数で 0000 から 1FFF の部分に割り当てられる。
例として上位 3bits が 0 とすると、0000 〜 1FFF に存在することになる。
メモリの構成
ROM のアドレスの範囲
**00 0000 0000 0000 |
**01 1111 1111 1111 |
8B の RAM は、AB の下位 13bits が 16 進数で 0000 から 1FFF の部分に割り当てられる。
例として上位 3bits が 001 とすると、2000 〜 3FFF に存在することになる。
RAM のアドレスの範囲
**10 0000 0000 0000 |
**11 1111 1111 1111 |
このシステムでは AB の上位 2 bits を利用していないのでメモリのアドレスを
64KB のメモリ空間中で確定させることができない。
アドレスデコーダの詳細
アドレスデコーダ
74139 は Dual 2to4 Demultiplexers という IC で以下のような入出力の関係
がある。A, B の組合せで、Y0 〜 Y3 のどれか一つが負論理で選択される。
74139 の入出力の関係
ENABLE |
B |
A |
Y0 |
Y1 |
Y2 |
Y3 |
L |
L |
L |
L |
H |
H |
H |
L |
L |
H |
H |
L |
H |
H |
L |
H |
L |
H |
H |
L |
H |
L |
H |
H |
H |
H |
H |
L |
H |
* |
* |
H |
H |
H |
H |
アドレスデコーダの入出力の関係
A15,A14 |
A13 |
A12 |
MREQ |
出力 |
* |
0 |
0 |
0 |
Y0 |
* |
0 |
1 |
0 |
Y1 |
* |
1 |
0 |
0 |
Y2 |
* |
1 |
1 |
0 |
Y3 |
* |
* |
* |
1 |
なし |
S1 の出力
Y0 |
Y1 |
負論理の OR |
H |
H |
H |
H |
L |
L |
L |
H |
L |
L |
L |
L |
実際には 4 番目の L,L の組合せはデマルチプレクサの出力としては存在しない。
Y0 〜 Y3
は選択されたものが L, 残りは H になる。S1は Y0,Y1 のどちらかが L の時 L, そうでない場合 H にな
る。
CPU の WR はメモリの WR
に接続され、読み出し/書き込みの区別に使用される。
PIO と CPU は同名の信号線 INT, IORQ,
RD, M1 を接続する。
PIO の端子 A/B はポート A, B のどちらかを選択するためにある。端子
C/D は制御用のデータ (Controll) と通常のデータ (Data) を指定するために
ある。
2.3.4 練習問題
以下の条件を満たすシステムの回路図、アドレスデコーダの入出力の対応関係を示しなさい。
- 4K × 1Byte の ROMLSIを組み合わせて、8KB の ROM を、
1K × 1Byte の RAMLSIを組み合わせて、8KB の RAM を構成する。
0000H から ROM を、8000H から RAM を配置する。
ROMLSI, RAMLSI の Chip Select 信号は正論理とする。RAMLSI の R/W 信号は、
正論理で H のとき書き込みを表す。外部装置とのデータの入出力は、
ラッチ回路とゲート回路で実現する。割り込みは考慮しなくてよい。
- 4K × 1Byte の ROMLSIを組み合わせて、16KB の ROM を、
4K × 1Byte の RAMLSIを組み合わせて、16KB の RAM を構成する。
0000H から ROM を、C000H から RAM を配置する。
ROMLSI, RAMLSI の Chip Select 信号は正論理とする。RAMLSI の R/W 信号は、
正論理で H のとき読み込みを表す。外部装置とのデータの入出力は、PIO で実現する。
3 PIO を用いた入出力
3.1 Z80PIO
3.1.1 機能の特徴
Z80PIO
Z80PIO は 2 個のポート (ポート A, B) を介して外部の装置とデータの入出力を行う。
B/A はポート選択の信号、C/D は制御用のデータ、通常のデータの区別を表す。
IEI, IEO はデイジーチェインで割り込みの優先順位を決める場合に使用する。
開発当初は 40pin DIL パッケージで提供されていた。現在は CPU、その他の
機能と統合された 1 チップの LSI として提供される場合が多い。
Z80CPU を開発したメーカの製品であるため、Z80CPU と組み合わせた場合に便
利な機能が用意されている。
- CPU の信号と同じ名前の端子はそのまま接続すればよい。
- 各ポート独立に入力、出力、入出力が指定可能。
またビット単位の入力、出力の指定も可能。
- Z80CPU の割り込みモードに合わせて、優先順位の決定や割り込み処理ルーチンからの
リターン、割り込みベクトルの発行などを行う。
- 各ポートにハンドシェイク機能が用意されている
各ポートはモード 0 〜 3 の 4 種類の入出力動作を行う。
3.1.2 モード 0 (出力モード)
ポートを指定して DB から PIO にデータを送ると、PIO 内部のラッチ回路に保持されポートに
出力される。その後 ARDY(BRDY) が H になり、出力されたことを外部装置に通知する。
ASTB を受け取ると ARDY は L に戻り、一回の転送が終了する。
モード 0 のタイムチャート
- DB から PIO 内部のバッファにデータを読み込む。読み込みの動作は次の
信号の組合せが成立した場合に行われる。
- RD : H, CPU からの出力を表す
- IORQ : L, IO の要求がある
- CE : L, Chip Enable になっている
- C/D : L, データが指定されている
- データをポートに出力する
- ARDY=H にして外部装置にデータが出力されていることを伝える
- 外部装置はデータを読み込んだら ASTB=L にして読み込みが
完了したことを PIO に伝える
- PIO は ASTB の立ち上がりを検出した時に、割り込みが
許可されていたら CPU に割り込みをかけて転送が終了したことを伝える。
- ARDY=L に戻して転送終了、次に備える
ASTB は外部から PIO への"返事"で、この場
合は「データを受け取りました。」ということを伝えるために使われる。PIO
は ASTB を受け取ると、データが(正しく)伝
えられたことがわかるので、その後 ARDY を L に戻す。
3.1.3 モード 1 (入力モード)
PIO は ASTB(データをポートに送ったよ) を受け取るとポート上のデータ
を内部のラッチに保持し、ARDY=L にして外部装置に通知する(データを受け
取ったよ、次はまだ送らないでね)。同時に割り込みが許可されていたら、INT
を CPU に送る。割り込みが受け付けられたら INT を戻す。
モード 1 のタイムチャート
- 外部装置が ASTB を PIO に送ると、PIO は読み込んで外部装置から
データが送られることを認識する。
- ポートに出力されているデータを PIO 内部に取り込む。
- 割り込みが許可されていれば、INT=L にして CPU にデータがあることを伝える。
- ARDY=L にして外部装置にデータを読み込んだこと、バッファが埋まっていること、
次のデータを送ってはいけないことを伝える。
- CPU は割り込み処理ルーチンで PIO からデータを読み出す。INT は割り込みが
受け付けられたら戻る。
- CPU のデータの読み出しが終ったら、ARDY=H に戻して転送終了、次のデータを受け取れるようになったことを
外部に伝える
CPU がデータを読み込んだら ARDY=H に戻す。読んだかどうかはモード 0 と同じく、
RD, IORQ, CE,
C/D の組合せでわかる。RD,
IORQ が L → H になれば読み込みが終ったことになる。
- RD : L, CPU が読み込むことを表す
- IORQ : L, IO の要求がある
- CE : L, Chip Enable になっている
- C/D : L, データが指定されている
3.1.4 モード 2 (入出力、双方向モード)
このモードはポート A でしか使うことができない。また、ARDY, BRDY,
ASTB, BSTB のすべ
てを使う必要があるので、もしポート B を使う場合はモード 3 でしか使うこ
とができないという制約がある。
モード 0,1 を同時に行うような処理内容となる。
CPU → PIO → 外部装置
モード 2 のタイムチャート (PIO → 外部装置)
CPU からのデータを取り込むのは、モード 0 と同様で取り込んだら ARDY=H
にして外部に通知する(データがあるよ)。しかしモード 0 と異なるのは、
- ASTB を受け取るまでは出力をしない。
ここでは ASTB は「送って下さい」及び
「受け取りました」という二つの意味で使用される。
- ASTB=H に戻ると外部装置がデータを読み込んだ
ことがわかるので、出力データを消して ARDY=L, INT=L
にして CPU にデータが送り出されたことを通知する。
外部装置 → PIO → CPU
モード 2 のタイムチャート (外部装置 → PIO)
外部装置はデータをポート A に送り、BSTB=L にする。
PIO はデータをラッチし、BRDY=L にする(受け取ったよ、バッファが埋まっているよ)。
また INT=L にして CPU にデータがあることを通知する。
CPU が割り込みを受け付けてデータを読むと、BRDY=H に戻り、次のデータを送ってもよいことを
外部に伝える。
ハンドシェイク用の信号の意味
- ARDY : CPU からのデータがあるよ
- ASTB : 送って下さい、受け取りました
- BRDY : データを送っていいよ、受け取ったよ
- BSTB : 外部からデータを送ったよ
3.1.5 モード 3 (ビットモード)
ポートの各ビットを独立に入力、出力に指定できる。ハンドシェークの機能
は使用しない。
CPU からデータが送られると出力に指定したビットだけが出力される。逆に、
入力されたデータについては入力指定したビットだけが CPU に送られる。
その他のビットは内部ラッチの状態がそのまま残る。
CPU から見た場合、データを出力する時は単にデータバスから送るだけでよい。
外部装置からデータを入力する場合は、いつデータが発生するか CPU は知る
ことができないので定期的に読み出す。その時読み出されるデータは、直前(
RDの立ち下がり)に
ポートから PIO 内部にラッチされたデータとなる。
3.2 8255
3.2.1 機能の特徴
8255
8 bit サイズの 3 個のポート(A, B, C ポート)を介してデータの入出力を行
うパラレルインタフェースのコントローラである。当初は 40pin の DIL パッ
ケージで販売されていたが、現在は CPU 等と 1 chip に統合された形で提供
されることが多い。
端子は CPU のデータバスに接続する D0 〜
D7、A, B, C ポートの PA0 〜
PA7, PB0 〜
PB7, PC0 〜
PC7、ポート選択用の A0,
A1、RD、
WR、CS、RESET、
Vcc、GND となる。
- ハンドシェイク専用の信号線はない。必要な場合は C ポートで代用する。
- 各ポート独立に入出力の指定が可能。入出力、ビット毎の指定はできない。
- CPU からは A 〜 C ポートの他にコントロールレジスタに制御用のデータを
送って様々な設定ができる。
コントロールレジスタに指定する値は以下のような形式になる。
8255 の制御用データ
bit7 |
bit6 |
bit5 |
bit4 |
bit3 |
bit2 |
bit1 |
bit0 |
1 |
0 |
0 |
A ポート |
C ポート上位 |
0 |
B ポート |
C ポート下位 |
|
|
|
0 : 出力 |
0 : 出力 |
|
0 : 出力 |
0 : 出力 |
|
|
|
1 : 入力 |
1 : 入力 |
|
1 : 入力 |
1 : 入力 |
bit7,6,5,2 はそれぞれ意味を持っているが、一般的な使い方の場合上記の値の組合せとなる。
3.2.2 スイッチと LED
A ポートには LED が接続されており、C ポートにはスイッチが接続されている。
C ポートのスイッチの状態を読んで、A ポートの LED を点灯させる。
値 1 はスイッチの ON 及び LED の点灯状態に対応する。
スイッチと LED
PORTA EQU 0F0H ; 各ポートには固
PORTB EQU 0F1H ; 有のアドレスが
PORTC EQU 0F2H ; 割り当てられる
CTRL EQU 0F3H
ORG 1000H
START LD A, 8BH ; 各ポートの入出力の指定
OUT (CTRL), A ; A:出力, B,C:入力
LOOP IN A, (PORTC) ; C ポートから読んで
OUT (PORTA), A ; A ポートに出力する
JP LOOP ; 繰り返し
HALT
END
3.2.3 練習問題
- A,B,C ポートのすべてに LED を接続して、A ポートは右端の、
B ポートは右から 2 番目の、C ポートは右から 3 番目の
LED を点灯させる。
- A,B,C ポートのスイッチから読み込んだ値を加えて RESULT に記録する。
- A,B ポートのスイッチから読み込んだ値を加えて、C ポートの
LED に 2 進数で表示する。
- A ポートのスイッチから読み込んだ値が奇数なら C ポートの
LED を全点灯、偶数なら全消灯させる。
- A,B ポートのスイッチから入力して、両ポートのスイッチともに
ON の位置だけ C ポートの LED を点灯させる。
- A,B,C ポートのスイッチから読み込んだ値をそれぞれ DATA1, DATA2,
DATA3 に記録する。
3.2.4 プリンタの制御
この例では、プリンタと 8255 の接続に A,C ポートが使用されている。
A ポートからは文字データが送られる。C ポートは上位 4 bits が出力として、
下位 4 bits が入力に設定される。bit6 が STRB として
、また bit1 が BUSY として使用される。
プリンタ
プリンタ制御のタイムチャート
PORTA EQU 0F8H ; 各ポートには固
PORTB EQU 0F9H ; 有のアドレスが
PORTC EQU 0FAH ; 割り当てられる
CTRL EQU 0FBH
ORG 1000H
START LD A, 83H ; 各ポートの入出力の指定
OUT (CTRL), A ; A:出力, B:入力, C上:出力, C下:入力
LD A, 40H
OUT (PORTC), A ; STRB を H にセット
MAIN LD C, 'A' ; 'A' 印字
CALL PRINT
LD C, 'B' ; 'B' 印字
CALL PRINT
CALL NEWLINE ; 改行
HALT
NLINE LD C, 0DH
CALL PRINT
LD C, 0AH
CALL PRINT
RET
PRINT IN A, (PORTC)
AND 2 ; bit1 だけ残す
JR NZ, PRINT ; BUSY==1 なら上へ
LD A, C ; C に入っているデータを
OUT (PORTA), A ; 印字
LD A, 0 ; 00000000
OUT (PORTC), A ; STRB を L に
LD A, 40H ; 01000000
OUT (PORTC), A ; STRB を H に
RET
END
AND 2 の意味
11101011
AND 00000010
------------
00000010
アセンブリ言語における文字列の指定
DB 'A'
DB 'B'
DB 'C'
DB 'D'
DW 'AB'
DW 'CD'
TXT 'ABCD'
これらはすべて同じ内容を表す。文字列はこれで表現できるが、何文字あるか
が指定できないので、(1)文字数は別のデータで表現するか、(2)文字列の終端
に特別な値(0 など)を付加して表現する必要がある。
(1)
DATA TXT 'ABCDEF'
NUM DB 6
(2)
DATA TXT 'ABCDEF'
DB 0
プリンタの応用プログラム(文字列を印字する)
PORTA EQU 0F8H
PORTB EQU 0F9H
PORTC EQU 0FAH
CTRL EQU 0FBH
ORG 1000H
START 省略
MAIN LD HL, DATA ; 文字列の先頭アドレスを HL にセット
LD A, (NUM)
LD B, A ; 文字数を B にセット
CALL PLINE1
HALT
PLINE1 LD A, 0
CP B ; 文字数が 0 か確認
JP Z, BACK ; もし 0 なら印字しないで戻る
LOOP LD C, (HL) ; 文字を C にセット
CALL PRINT
INC HL ; 次の文字に進める
DEC B ; カウンタを 1 減らす
JP NZ, LOOP ; 0 になるまで繰り返し
CALL NLINE
BACK RET
NLINE 省略
PRINT 省略
DATA TXT 'ABCDEFGHIJKLMN'
NUM DB 14
END
3.2.5 練習問題
以下のプログラムを作成しなさい。サブルーチン PRINT, NLINE は用意されて
いて利用してもよいことにする。
- 'A' を 20 文字 × 5 行印字する。
- 'A' 〜 'Z' まで順に印字する。('A'=41H, 'B'=42H)
- 自分の名前を印字する。
- 'ABCD' を A B C D のように印字するサブルーチンを PLINE1 を
改良して作成しなさい。
- 文字列の終端に 0 を付加して表現する形式のデータを印字する
サブルーチン PLINE2 を作成しなさい。また PLINE2 を利用する
MAIN ルーチンを作成しなさい。
4 CPU を高速化する技術
4.1 CPU 発展の歴史
以下では Intel 社の CPU を開発された順に取り上げ、各時期にどのような技
術が導入されていったか紹介する。
参考文献
- 特集記事「Pentium II アーキテクチャの徹底研究」, Interface, 1998/03 号, CQ 出版社
- 特集記事「これでわかる! マイクロプロセッサのしくみ」, Interface, 2002/06 号, CQ 出版社
- D. A. Patterson, J. L. Hennessy, 「コンピュータの構成と設計 第 2 版 上/下」, 日経 BP 社
- Gerry Kane, 「mips RISC アーキテクチャ」, 共立出版
4.1.1 4004
- レジスタサイズは 4bits である。
- 2,300 個のトランジスタを 12mm2 に集積している。
- LSI は 10um のプロセスで製造された。
- 動作周波数は 750kHz
- 世界で初めて開発されたマイクロプロセッサ
4.1.2 8080
- レジスタサイズは 8bits
- メモリ空間は 64KB
- 6,000 個のトランジスタを集積している。
- LSI は 6um のプロセスで製造された。
- 動作周波数は 2MHz
4.1.3 8086
- レジスタサイズは 16bits
- メモリ空間はセグメント機能により 1MB 使用できる。
- 129,000 個のトランジスタを集積している。
- LSI は 3um のプロセスで製造された。
- 動作周波数は 10MHz
- 浮動小数点演算コプロセッサ 8087 が提供されるようになった。
4.1.4 80286
- レジスタサイズは 16bits、メモリ空間は 16MB
- 仮想記憶をサポートする。
- 134,000 個のトランジスタを集積している。
- LSI は 1.5um のプロセスで製造された。
- 動作周波数は 12MHz
- 特権レベルによりメモリ保護が可能になった。
4.1.5 i386
- レジスタサイズは 32bits
- アドレスバスが拡張されメモリ空間は 4GB 使用できる。
- 275,000 個のトランジスタを集積している。
- LSI は 1.5um のプロセスで製造された。
- 動作周波数は 33MHz
- 4 段のパイプライン処理が導入された。
4.1.6 i486
- レジスタサイズは 32bits、メモリ空間は 4GB
- 一部の命令実行をワイヤードロジックにして高速化した。
- 1,200,000 個のトランジスタを集積している。
- LSI は 0.8um のプロセスで製造された。
- 動作周波数は 100MHz
- 5 段のパイプライン処理が導入された。
- 浮動小数点演算装置が内蔵された。
- チップ上に 1 次キャッシュが搭載された。
4.1.7 Pentium
- レジスタサイズは 32bits、メモリ空間は 4GB
- 3,300,000 個のトランジスタを集積している。
- LSI は 0.35um のプロセスで製造された。
- 動作周波数は 233MHz
- 2 way のスーパースケーラ方式が導入され命令の並列実行が可能になった。
- 分岐予測機構が導入された。
- 命令アクセス用とデータアクセス用のバス、領域が分離された
ハーバードアーキテクチャの
1 次キャッシュが搭載された。
- 外部データバスが 64bits に拡張された。
4.1.8 Pentium Pro
- レジスタサイズは 32bits
- アドレスバスが 36bits に拡張され、メモリ空間は 64GB になった
- 5,500,000 個のトランジスタを集積している。
- LSI は 0.35um のプロセスで製造された。
- 動作周波数は 200MHz
- プロセッサ内部の動作が RISC 型に変更された。アセンブリ言語の命令は過去の CPU との
命令互換性のためほとんど変更されていないが、命令を読み込んだ後で内部 RISC
命令に変換してから実行する。
- CPU のパッケージ上に大容量の 2 次キャッシュが搭載された。チップは別となっている。
- 通常のデータバスと、2 次キャッシュをアクセスする専用のバスを独立して備えている。
2 次キャッシュ用バスは CPU コアと同周波数で転送が可能。
- 3 way のスーパースケーラ方式が導入され命令の並列実行が可能になった。
- アウトオブオーダ実行が導入された。
- 命令の投機実行が導入された。
- 12 段のスーパーパイプラインが導入された。
- 4 プロセッサまでの SMP (Simmetric Multi Processing) に対応した。
- レジスタリネーミングが導入された。
4.1.9 Pentium with MMX Technology
- マルチメディア処理に対応するため
SIMD (Single Instruction Multiple Datastream)
型演算機構が導入された。これは 64bits のレジスタに 1 Byte, 2Bytes, 4Bytes の
データを複数パックして、並列演算を行う。音声や画像処理では同種の演算が繰り返
されるため、効果がある。
- 1 次キャッシュの容量が 2 倍になった。
4.1.10 Pentium II, III
- MMX Technology による SIMD 型並列演算機構が導入された。
- 2 次キャッシュの容量が 2 倍になった。ただし動作クロックは CPU コアの半分になった。
4.1.11 Pentium 4
- 20 段のスーパーパイプラインが導入された。その結果クロック周波数を高くすることが
可能となった。
- ハイパースレッドと呼ばれる機能で、1 個のプロセッサ内に
プログラムの制御機構を 2 組備えることにより、2 個のプログラム(スレッド)を並列に動作
させることが可能となった。効果としては 2 個のプロセッサを用いるのに近い。
4.2 高速化の技術
4.2.1 パイプライン
CPU における命令実行は、以下のような複数の処理の組合せと考えられる。
- 命令の読み込み (Fetch)
- 命令の解析 (Decode)
- レジスタ、メモリの参照 (Addressing)
- 演算実行 (Execution)
- 結果の保存 (Store)
各処理は専用の回路で実行されるため、それぞれの回路での処理内容を連続し
て実行できるようにすると処理速度が向上する。
パイプライン
例として、上記の図では命令実行を 5 個の処理(パイプライン処理では「ステー
ジ」と呼ぶ)に分割した場合に、従来の命令実行の仕方とパイプライン方式に
よる実行との違いを表している。各ステージが 1 クロックサイクルで実行可
能と仮定すると、4 個の命令を実行する場合従来は 20 クロックサイクル必要
であったが、パイプラインにより 8 クロックサイクルで完了している。
パイプライン方式では、連続して命令実行が可能な場合は高い実行効率が得ら
れる。しかし、命令実行を細かな処理に分割して各処理を並行して進めるため、
以下のような理由によりパイプラインの処理を中断(ストール)する必要が出てくる。
- 命令間でのデータの依存関係 (データハザード)
- 分岐命令の実行 (制御ハザード)
- 同一クロックで複数のアクセスに装置が対応できない (構造ハザード)
命令間でのデータの依存関係は以下のような場合に発生する。
ADD A, B
ADD A, C
ADD A, D
この場合、A+B の結果が A に書き込まれる前に、次の命令のために A の以前
の値が読み込まれてしまい、そのままパイプラインでの処理を進めると正しい
演算結果が得られない。この場合は A+B の結果が A に書き込まれた「後に」
A を読みだして A+C を計算する必要がある。
分岐命令の実行は以下のような場合である。
CP 0
JP Z, L1
ADD A, B
ADD A, C
...
L1 LD (RESULT), A
この場合 JP Z, L1 の内容を解読して実行の段階に入る時には、次の命令の解
読やその次の命令の読み出しが行われている。A の値によっては JP Z, L1 の
次には LD (RESULT), Aを実行する必要があるため、ADD A, B や ADD A, C に
関して進めていた処理をすべて取り止めて LD (RESULT), A の読み出しからや
り直す必要がある。
同一クロックで複数のアクセスに装置が対応できない例としては、古い形式の
キャッシュに対して読み出しと書き込みが同時に行われる場合、データバスが一
系統しかないと読み出し/書き込みのどちらかしか実行できないという場合がある。
4.2.2 ワイヤードロジック
CPU 内部で機械語命令を実行する方式はマイクロプログラミングとワイヤード
ロジックがある。
- マイクロプログラミングは機械語命令を、 CPU 内部の動作を表す機械語命令
より更に基本的な命令の組合せ(マイクロプログラム)に翻訳して実行する方式である。
複雑な機械語命令であっても単純な動作の組合せとして実現できるため、
多くの命令を用意することができ設計も容易である。そのかわり、内部で
プログラムに翻訳、実行する手間がかかるため高速な処理には向いていない。
- ワイヤードロジックは機械語命令を実行する部分や制御用の信号をすべて
配線により実現する方式である。各命令毎に用意しておいた配線に信号を
流せばすぐに動作が可能であるため高速な処理が可能となる。そのかわり、
命令毎に専用の論理回路を実現する配線部を設計する必要があるため、多くの命令や
複雑な命令に対応するのは難しい。
4.2.3 キャッシュ
CPU のクロック周波数が高くなり処理能力が向上してくると、主メモリとの処
理速度の差が問題となってきた。具体的にはメモリからデータを 1 個読み出
す間に CPU では数十命令実行可能という状況となる。その場合 CPU がメモリ
からデータを読み出す命令を実行すると、メモリからデータが到着するまで
CPU はずっと待っている必要があり実行効率が上がらない。
キャッシュ
この問題を解決するためにキャッシュ(メモリ)という技術が使用される。CPU
と 主メモリとの間に Static RAM で構成した小容量だが高速なメモリを用意
しておき、CPU がメモリアクセスを行う場合キャッシュを対象とする。キャッ
シュにはその時点で頻繁にアクセスされるであろうデータを入れておく。アク
セスの予測は「メモリアクセスの時間的、空間的局所性」という性質がもとになっている。こ
れは CPU がメモリのある場所をアクセスした場合、高い確率で、
- 短時間のうちに同じ場所をアクセスする (時間的局所性)
- アドレスの近い場所をアクセスする (空間的局所性)
ということがいえる。
具体的な例では、繰り返しの処理は時間的、空間的局所性の両方を備えており、
配列などのまとまった構造を持つデータのアクセスでは空間的局所性がある。
繰り返し
LD B, 10
L1 ADD A, B
DEC B
JP NZ, L1
LD (RESULT), A
配列のアクセス
LD A, 0
LD B, 10
LD HL, DATA
L1 ADD A, (HL)
DEC B
JP NZ, L1
LD (RESULT), A
DATA DB 3
DB 5
DB 2
DB 7
DB 11
DB 13
DB 17
DB 19
DB 23
DB 29
RESULT DS 1
よって、CPU がメモリ上のあるデータをアクセスした時に合わせてその付近の
データをキャッシュに読み込んでおけば、近い将来アクセスされる確率が高い。
その場合、キャッシュからのみ読み出せばよいので CPU を待たせる必要がない。
4.2.4 スーパースケーラ (スーパースカラー)
命令でアクセスされるデータの依存関係を CPU 内部で自動的に調べて、依存
関係がなく独立して実行可能な命令を並列に実行する技術を表す。CPU 内部に
命令実行部を複数持つことになる。並列実行可能な命令が 2 個なら 2 way の
スーパースケーラとなる。
具体的なプログラムでは以下のようになる。
LD A, 10
LD B, 2
LD C, 20
INC D
DEC E
LD HL, 0
ADD A, B
ADD A, C
ADD HL, DE
LD (RESULT), A
LD (RESULT2), HL
RESULT DS 1
RESULT2 DW 0
このプログラムでは先頭から LD HL, 0 までは各命令に全く依存性がないため
にすべて並列実行が可能となる。6 way のスーパースケーラなら 6 命令が同
時に実行できる。ADD A, B と ADD A, C は A に依存するため同時には実行で
きない。ただし、ADD HL, DE は並列実行が可能である。最後の LD (RESULT),
A と LD (RESULT2), HLは依存関係がないので並列に実行できる。
4.2.5 分岐予測
分岐命令でジャンプする先のアドレスを調べて、次に実行される命令を予測す
る技術である。これには静的分岐予測と動的分岐予測がある。
- 静的分岐予測では分岐命令のアドレスとジャンプする先のアドレスから
次のような予測を行う。(1) PC が減少する方向への分岐は成立する確率が高い。
(2) PC が増大する方向への分岐は成立する確率が低い。これらはプロ
グラムの統計的な分析から導かれた性質である。
(1) は繰り返しの処理が典型であるが、何回か繰り返した後に最後に 1 回
不成立となるパターンが当てはまる。
(2) はプログラムの本来の流れから外れる場合となるので成立する確率は
(1) 程高くならない。
- 動的分岐予測では分岐命令が実行された時に、成立/不成立の履歴を取り、
繰り返して分岐命令が実行された場合にどちらの確率が高くなるかを統計
的に予測する方法である。
通常は両者を組み合わせて使用する。分岐予測の結果、次に実行されると予測された
命令がプリフェッチの対象となりメモリから読み込まれパイプラインに投入される。
4.2.6 ハーバードアーキテクチャ
メモリ、キャッシュ及びデータバスの構造を表し、命令用とデータ用を分離す
るのがハーバードアーキテクチャである。命令用とデータ用を単一のキャッシュ
及びバスで実現する方法をプリンストンアーキテクチャと呼ぶ。
メモリアクセスの局所性から命令、データは別々のメモリ、キャッシュで扱っ
た方が処理の効率がよい。また、データバスが二重化されることにより命令を
読み出しながらデータを書き込むといった処理が可能となり、パイプラインや
スーパースケーラ方式と相性がよい。ただし二重化するという点でコストがか
かるのですべてをハーバードアーキテクチャで実現することは少ない。典型的
には主メモリはプリンストンアーキテクチャにして、速度が要求されるキャッ
シュをハーバードアーキテクチャにすることが多い。
4.2.7 RISC (Reduced Instruction Set Computer)
従来のプロセッサ設計の考え方は、複雑な動作をする命令もなるべく機械語命令として
用意し、同時に豊富なアドレッシングモードを提供し、なるべく高機能なもの
にしようというものであった。別の表現をすると、ハードウェアレベルで複雑
な機能、豊富な機能を実現しようとするものである。この考え方、設計原理を
CISC (Complex Instruction Set Computer), 複雑命令セットコンピュータと
呼ぶ。
CISC 型のプロセッサの特徴として以下の点を挙げることができる。
- 可変長の命令フォーマットを採用する。
- 複雑な動作をする多くの命令が存在する。
- 処理に多くのクロックを必要とする多くの命令が存在する。
- 多くの命令で豊富なアドレッシングモードが利用できる。よって機械語命令の
オペランドに指定するレジスタ、メモリなどの組合せが非常に多くなる。
利点として、プログラムの実行する内容を多くの命令を組み合わせなくても、
少数の高機能な命令で記述できる。よってプログラムの記述性が増し、人間に
とっては高級言語的な考え方でプログラムが作成できる。
欠点として、可変長の命令フォーマット、複雑な動作をする命令、豊富なアド
レッシングモードについては、プロセッサ内部の命令デコード部分が非常に複
雑になり設計が難しい。また命令デコード部分の動作速度を向上させることが
できない。また、多くのクロックを必要とする命令は、パイプラインの各ステー
ジの処理時間を一定に保つことができないためパイプラインの動作効率を低下
させてしまう。
複雑、高機能な命令は使用するために一定の条件を満たす必要があるが、現実
のプログラムではその条件を満足する機会は少なく使用頻度が低い。また、コ
ンパイラで使いこなすことが難しく、コンパイラで作成した実行ファイルには
ほとんど登場しない。
結論として、CISC は人間がアセンブリ言語でプログラムを作成するのには向
いているが、反面、複雑な命令は使用される機会が少なくコンパイラでの処理に向いていな
い。コンパイラが使われる機会が増えると、高機能なプロセッサが高速なプロ
セッサであるとはいえなくなった。
上記の問題点を分析した結果に基づいて、新しいプロセッサ設計の原理 RISC
(Reduced Instruction Set Computer), 縮小命令セットコンピュータが考案された。
RISC 型のプロセッサの特徴として以下の点を挙げることができる。多くは
CISC の逆の考え方になる。
- 固定長の命令フォーマットを採用する。すべての機会語命令は同じ長さを持つ。
- 単純な動作をする少数の命令だけが存在する。複雑な処理を行うには多くの命令の組合せとして
実現する。
- すべての命令の実行時間を短くする。また命令間での実行時間のバラツキを抑える。
- 一般の命令では極少数のアドレッシングモード、具体的にはレジスタのみが利用できる。
メモリアクセスは、レジスタとメモリ間の転送を行うロード命令とストア命令のみに限定する。
RISC では少数の命令のみを用意することによって、プロセッサ内部の命令デ
コード部分を単純化する。またアドレッシングモードを制限することにより、
演算に使用するデータをレジスタに限定する。その結果個々の命令の実行時間
は非常に短くなり高速化が図れる。命令の実行時間のバラツキを抑えることに
よりパイプラインの処理を乱さなくなる。ほとんどの命令はパイプラインの各
ステージの処理を 1 クロックで行うことができる。命令デコード部分の単純
化は、回路の規模を小さくすることに結び付き、最先端のプロセス技術の導入
が可能となる。また多数のレジスタや、チップ上に大容量のキャッシュを搭載
することが可能となり、これらの点も高速化に結び付く。
結論として、RISC はコンパイラの使用を前提とした高速で単純な命令群、パイ
プライン処理に適した内部構造により高速化を実現しているといえる。
複雑な処理をする場合、CISC では高機能だが実行に時間のかかる少数の命令
の組合せで実現され、RISC では単純だが高速な命令を多数組み合わせること
により実現する。同時代の CISC と RISC を比較すると RISC の方が圧倒的に
高速だったため、現実の性能において RISC の優位性が認められた。
4.2.8 アウトオブオーダ実行
スーパースケーラ方式で各命令間の依存関係を調べた結果、本来の命令の並び
とは関係なくある程度異なったタイミングで実行しても結果に影響しない命令
が検出できる。アウトオブオーダ実行とは、このような実行順序に依存しない
命令を異なったタイミングで実行することを表す。効果としては、依存関係の
ある命令の間に依存関係のない命令を挟み込むことによって、命令の並列実行
の機会を増やすことができる。
具体的な例では以下のような場合が考えられる。
LD B, 2
LD C, 20
LD D, 20
ADD A, 10
ADD A, 20
ADD A, 30
この命令列を 2 way のスーパースケーラプロセッサで実行する。2 系統のパ
イプラインはデータの転送、算術演算を担当すると仮定する。本来の命令の並
びでは LD 命令を 3 個連続してデータの転送用パイプラインで実行した後で
ADD 命令を 3 個連続して算術演算用パイプラインで実行する。この場合 2 系
統のパイプラインは並列に利用されていない。
上記の命令列をアウトオブオーダ実行の機能で次のような順序でパイプライン
に投入すると、LD 命令と ADD 命令を並列に利用できる
LD B, 2
ADD A, 10
LD C, 20
ADD A, 20
LD D, 20
ADD A, 30
LD 命令と ADD 命令は互いのパイプラインの処理に関係しないので完全に並列
に実行できる。
4.2.9 投機実行
分岐予測の結果、分岐命令の次に実行される命令を予測したら、その命令を読
み出すだけではなく実行までしてしまうことを表す。予測が成功した場合はパ
イプラインのストールは発生せず処理を続けることができる。予測が失敗した
場合はパイプラインはストールして投機実行した命令の実行結果は破棄するこ
とになる。分岐予測の推定精度が向上すれば、分岐命令の次の命令を単純にパ
イプラインに送るより、投機実行した方がパイプラインのストールを減らせる。
分岐予測は現在のプロセッサでは 80% 以上の確率で成功するので投機実行の
効果は大きい。
4.2.10 スーパーパイプライン
パイプラインのステージ数を非常に多くすることを表す。例として 5 ステー
ジで各ステージの処理が 2 nsec のパイプラインを変更して、10 ステージで
各ステージの処理が 1 nsec にできれば理想的な処理では 2 倍の高速化が図
れる。
またステージ数が多くなると、各ステージでの処理が単純になる。各ステージ
での処理が単純になると、設計が容易になり処理の高速化が図れ、クロック周
波数を向上させることができる。
スーパーパイプライン
スーパーパイプラインでは性能向上の効果も大きいが、パイプラインの処理が
ストールするとペナルティも大きくなるので、パイプラインをストールさせな
いための技術が重要になる。
4.2.11 SMP (Simmetric Multi Processing)
4.2.12 レジスタリネーミング
4.2.13 SIMD (Single Instruction Multiple Datastream)
4.2.14 ハイパースレッド
4.3 その他の技術
4.3.1 仮想記憶
コンピュータシステムが搭載している実メモリ(実アドレス空間とする)よりも
大きなメモリ空間(仮想アドレス空間とする)でプログラムを実行したり、デー
タを扱うための技術。プログラムからは実メモリ以上のメモリが利用可能にな
る(ように見える)。
CPU が入出力するプログラム、データは実メモリに置く必
要があるが、もし仮想アドレス空間に対して CPU からアクセスがあった場合
は、実メモリの一部に仮想アドレスを割り当てることにより、その場所を CPU
が指定した場所として扱えるようにする。
大量のプログラムやデータを扱う場
合には実メモリの容量を超えてしまうが、その場合は補助記憶装置 (主として
HDD)に設けた専用の領域 (swap) に対してデータを入れ換えることにより、
CPU がアクセスするデータは常に実メモリに存在するようにする。
仮想アドレ
ス空間と実アドレス空間の変換は専用の装置 (MMU: Memory Management Unit)
で行う。
仮想記憶
4.3.2 特権レベル
プログラム実行時の CPU の状態にレベルを設定することにより、あるレベル
で動作するプログラムには周辺装置やメモリの特定の領域へのアクセスを禁止
したり、CPU の特定の命令を実行することを禁止したりする。通常、OS が動
作する時はすべてのハードウェア資源へのアクセスを許可するが、一般のアプ
リケーション、プログラムによるアクセスには制限をかける。高級な CPU では
この機能をハードウェアで提供する。
4.4 練習問題
2003/01/10 13:30 までに 5355 室まで提出する。解答は提出期限の後 WWW で公開する。
1. パイプラインの処理について次の問いに答えなさい。パイプラインのストール
は発生しないものとする。
- 5 段のパイプラインで、各ステージの処理が 2 nsec で完了する場合、100 個の命令を
実行するのに要する時間を求めなさい。
- 10 段のパイプラインで、各ステージの処理が 1 nsec で完了する場合、100 個の命令を
実行するのに要する時間を求めなさい。
- 20 段のパイプラインで、各ステージの処理が 0.5 nsec で完了する場合、100 個の命令を
実行するのに要する時間を求めなさい。
2. 次の用語が表す技術の内容を説明しなさい。
- SMP
- レジスタリネーミング
- SIMD
3. PIO のプログラミング、以下のプログラムを作成しなさい。
- A ポートのスイッチから読み込んだ値が奇数なら C ポートの
LED を全点灯、偶数なら全消灯させる。
- A,B ポートのスイッチから入力して、両ポートのスイッチともに
ON の位置だけ C ポートの LED を点灯させる。
- A,B,C ポートのスイッチから読み込んだ値をそれぞれ DATA1, DATA2,
DATA3 に記録する。
4. 以下の条件を満たすシステムの回路図、アドレスデコーダの入出力の対応関係を示しなさい。
- 2K × 1Byte の ROMLSIを組み合わせて、8KB の ROM を、
512 × 1Byte の RAMLSIを組み合わせて、4KB の RAM を構成する。
0000H から ROM を、4000H から RAM を配置する。
ROMLSI, RAMLSI の Chip Select 信号は正論理とする。RAMLSI の R/W 信号は、
正論理で H のとき書き込みを表す。外部装置とのデータの入出力は、
ラッチ回路とゲート回路で実現する。割り込みは考慮しなくてよい。
- 1K × 1Byte の ROMLSIを組み合わせて、4KB の ROM を、
512 × 1Byte の RAMLSIを組み合わせて、2KB の RAM を構成する。
8000H から ROM を、E000H から RAM を配置する。
ROMLSI, RAMLSI の Chip Select 信号は正論理とする。RAMLSI の R/W 信号は、
正論理で H のとき読み込みを表す。外部装置とのデータの入出力は、Z80PIO で実現する。