「汎用ロジックでコンピュータを作る」のトップページ(目次)はこちら 管理人のメインページはこちら
【変更記録】
2013-12-15 : 初稿(Rev 01.00)おそらく誤字脱字が大量にあると思われる
ステージ設計
ステージ(stage)とは
【お断り】ステージの意味は用法は時代や話者により異なります。ここでは一つの機械語命令を実行する際にCPU内部で行う処理の単位時間とします。
RETROF-16は全ての機械語命令を6つのステージ(Φ1~Φ6)で処理します。
1つのステージは1クロック(内部クロック)で実行します。但し第6ステージはメモリ書込時のホールドタイムを確保するだけなので、他のステージの半分の時間となっています。
下図はそのステージとクロックの関係です。クロックには外部クロックと、それを分周して作る内部クロックがありますが、以降本ページでの「クロック」とある記述は全て内部クロックを意味します。
状態 | 停止中 | 最初の命令の実行処理中 | 次の命令の実行処理中 | |||||||||||||||||||||||||||||||||||||||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | Φ4 | Φ5 | 6 | Φ1 | Φ2 | Φ3 | Φ4 | Φ5 | 6 | Φ1 | |||||||||||||||||||||||||||||||||||||||
内部クロック | ||||||||||||||||||||||||||||||||||||||||||||||||||||
外部クロック | ||||||||||||||||||||||||||||||||||||||||||||||||||||
(13.5MHz) | 1ステージは約150ns、但し第6ステージのみ約75ns |
各ステージ(Φ1~Φ6)で、素子(以下、素子とはメモリやレジスタ、カウンタ等を示す)から素子へのデータ転送等を行います。どの素子からどの素子へデータが渡るのかは実行する命令とステージにより異なります。例えば上図には第5ステージ(赤でΦ5と書いた区間)は2箇所にありますが、両者は実行中の命令が異なるので必ずしも同じ動作をするとは限りません。
またデータの受渡可能な素子の組合せは各素子間の配線の有無で制限されます。全ての素子の入力端子と出力端子を接続するとこの制限は無くなりますが、伝達路(バス)の交通整理を司る回路が巨大となってしまうので現実的ではありません。本当にデータの受渡が必要な素子間はどこなのかを見極める作業をタイミング設計の前に終わらせておくことは必須です。
ブロック図とステージ
下図はRETROF-16を構成する素子と、素子間の接続を示した図(ブロック図)です。実用的なCPUとして成り立つ極限まで素子を減らし、素子間の伝達路も必要最小限に抑えています。結果的に僅か50個ほどの標準TTL(74LSシリーズ)でBASICインタプリタやインベーダーゲームを走らせる事ができる回路を実現しています。
VRAM:ビデオメモリ(256×256画素、1画素は4bit)
MEM:主メモリ(64Kワード、1ワードは16bit)
PC:プログラムカウンタ(16bit)
IR:インストラクションレジスタ(8bit)
X:インデクスレジスタ兼被演算子レジスタ(16bit)
ALU:演算ユニット(16bit 加算/減算/AND/OR/EXOR)
ACC:アキュムレータ(16bit)
OUT PORT:出力ポート(16bit × 2組)
IN PORT:入力ポート(16bit)
各ステージでは、上記の矢印で接続されている素子間で矢印方向にデータを渡すことができます。それを一定の規則に従って何度か(RETROF-16の場合は全命令6回)行う事によって1つの命令を実行します。例えば「レジスタ間接アドレッシングモードでのロード命令」の場合は以下の6つのステージが順に実行されます。
ロード命令(レジスタ間接アドレッシングモード)の各ステージの動作
ステージ1.PCで示される番地のメモリ内容の上位8bitを命令レジスタに、下位8bitをXに転送する。Xの上位8ビットはクリアする
ステージ2.Xで示される番地のメモリ内容をX自身にに転送する(Xはリテラル値から、レジスタ値に変化する)
ステージ3.更にXで示される番地のメモリ内容をX自身にに転送する(Xはレジスタ値からレジスタ間接値に変化する)
ステージ4.ACCをゼロクリアする。プログラムカウンタの値をゼロクリアする
ステージ5.Xの値からACCの値(=ゼロ)を引いた値(=Xの値)をACCに転送する
ステージ6.何もしない(他の命令との整合性をとる為のダミーステージ)
ステージ設計とは全ての命令に対し、各ステージでどの様な動作を行うかを決める作業です。複雑な動作をするステージは一般にそのステージを実現する回路が複雑になりますので、極力単純なステージのみで実現するのが理想です。また特定のステージ動作を複数の命令で共有できる様に設計するとステージ動作の種類が減りますので、これも回路の簡易化が狙えます。
前半ステージと後半ステージについて
RETROF-16は各命令の実行を前半の3ステージと後半の3ステージに分けて処理します。前半ステージは原則として全命令共通であり命令フェッチとアドレッシングモードの処理を担当、後半ステージは各命令固有の処理を担当します。前半ステージと後半ステージを独立させた理由は、6ステージという長いステージを設計するよりも、3ステージという短いステージを2組設計する方が設計が容易であったからです。また実際の回路も6ステージを一気に処理する大きな回路を1つ組むよりも、3ステージという短いステージを処理する回路を2つ組んだ方が回路規模が小さくなるという利点もあります。
前半ステージの内部動作
前半ステージに関わるメモリとレジスタ群
左図は前述のRETROF-16の全体ブロック図から、前半ステージに関連する部分だけを抜粋(注)したものです。前半ステージの役割は図中のIRに命令コードを、同じくXにアドレッシングモードとオペランドで決定する実効値を格納することです。
注:前半ステージではメモリ(図中のM)とプログラムカウンタ(同PC)への書込みは発生しませんので、それらに相当する矢頭(矢印の▲)は省略しています。
第1ステージと8bitイミディエイトアドレッシング
最初のステージでPCが示すメモリ内容(=命令コード)の上位8bitをIRに、下位8bitをXに転送します。このときにXの上位8bitをゼロクリアすることにより、このステージが終了した時点でXにはイミディエイト値(即値=0~255のいずれか)が格納されます。
アドレッシングモードが8bitイミディエイトならば、これで前半ステージは終わりです。
第1ステージをC言語風に表現すると IR=MEM[PC]&0xFF00,X=MEM[PC]&0x00FF; となります。
8bitイミディエイトアドレッシングのタイミングチャート
クロック | ||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | |||||||||
アドレスバスの状態 | PCの値を出力 | 何もしないので任意 | ||||||||||
データバスの状態 | MEM内容を出力 | 何もしないので任意 | ||||||||||
ALUクリア | (下記※参照) | |||||||||||
X上位8bitクリア | クリアする | |||||||||||
Xのロード許可 | 許可する | |||||||||||
IRのロード許可 | 許可する | |||||||||||
↑1 |
Φ1期間中、主メモリはプログラムカウンタの出力をアドレス線に受け取り、その番地に格納されている値(すなわち、実行する命令コード)をデータバスに吐き出します。
同時にX(実体は74LS173)とIR(実体は74LS377)はそれぞれロードイネーブル端子をアクティブにしてクロックの立ち上がりを待ちます。
図中の1の時点でクロックが立上り、命令コードがXとIRに格納されます。但しXの上位8bitはクリア信号をアクティブにしているためロードされずゼロとなります。
結果、Xには8bitイミディエイト値である(0~255)が、IRにはオペコードとアドレッシングモードが格納されます。
※ 第3ステージにあるALUクリアは、特定の命令(LD命令、VLD命令、PLD命令、IN命令)の特定の演算コードの場合のみアクティブになります。
このアキュムレータクリアの存在理由の詳細は「後半ステージの説明」で行います。
これに関しては、他のアドレッシングモードでも同様に存在しますがですが、以下のタイミングチャートでは記述を省略します。
第2ステージとレジスタアドレッシング
第1ステージが終了した時点では、Xには0~255のいずれかの値が格納されています。この状態でXが示すメモリ番地の内容をX自身に転送すると、Xには0~255番地のいずれかのメモリ内容が格納されます。RETROF-16では主メモリの0~255番地を仮想レジスタとして扱いますので、これは指定レジスタの値をXに転送するのと同じ意味になります。
レジスタアドレッシングのタイミングチャート
クロック | ||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | |||||||||
アドレスバスの状態 | PCの値を出力 | Xの値を出力 | 任意 | |||||||||
データバスの状態 | MEM内容を出力 | 任意 | ||||||||||
Xの上位クリア | クリアする | |||||||||||
Xのロード許可 | 許可する | |||||||||||
IRのロード許可 | 許可する | |||||||||||
↑1 | ↑2 |
図中の1の時点でXには0~255のいずれかの値が格納されます。Φ2ではその値をアドレスバスに出力します。
Xのロードイネーブル端子をΦ2期間中もアクティブにする事により、図中の2の時点でも再度Xにロードされます。
このときロードされる値は0~255番地(仮想レジスタ領域)の内容ですので、レジスタアドレッシングとなります。
第3ステージと間接レジスタアドレッシング
第2ステージが終了した時点で、更にもう一度Xが示すメモリ内容をX自身に転送すると、Xにはレジスタが指定する番地の内容が格納されます。これが間接レジスタアドレッシングに相当します。
C言語風に表現すると、第2ステージと第3ステージは共に X=MEM[X]; となります。
間接レジスタアドレッシングのタイミングチャート
クロック | ||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | |||||||||
アドレスバスの状態 | PCの値を出力 | Xの値を出力 | ||||||||||
データバスの状態 | MEM内容を出力 | |||||||||||
Xの上位クリア | クリアする | |||||||||||
Xのロード許可 | 許可する | |||||||||||
IRのロード許可 | 許可する | |||||||||||
↑1 | ↑2 |
図中の1の時点でXには0番レジスタ~255番レジスタのいずれかの値が格納されます。Φ2ではそのレジスタの値をアドレスバスに出力します。
Xのロードイネーブル端子をΦ3期間中もアクティブにする事により、図中の2の時点でも再度Xにロードされます。
このときロードされる値は0番レジスタ~255番レジスタのいずれかのレジスタ値をアドレスとしたメモリの内容ですので、間接レジスタアドレッシングとなります。
16bitイミディエイトアドレッシングの実現方法
16bitイミディエイトアドレッシングは、第1ステージ実行後、第2ステージでPCをインクリメントし、第3ステージでPCの示す番地のメモリ内容をXに転送することにより実現します。
C言語風に表現すると X=MEM[++PC]; となります。
16bitイミディエイトアドレッシングのタイミングチャート
クロック | ||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | |||||||||
アドレスバスの状態 | PCの値を出力 | 任意 | PCの値を出力 | |||||||||
データバスの状態 | MEM内容を出力 | 任意 | MEM内容を出力 | |||||||||
PCインクリメント | インクリメント | |||||||||||
X上位8bitクリア | クリアする | |||||||||||
Xのロード許可 | 許可する | 許可する | ||||||||||
IRのロード許可 | 許可する | |||||||||||
↑1 |
Φ1期間中、主メモリはプログラムカウンタの出力をアドレス線に受け取り、その番地に格納されている値(すなわち、実行する命令コード)をデータバスに吐き出します。
同時にX(実体は74LS173)とIR(実体は74LS377)はそれぞれロードイネーブル端子をアクティブにしてクロックの立ち上がりを待ちます。
図中の1の時点でクロックが立上り、命令コードがXとIRに格納されます。但しXの上位8bitはクリア信号をアクティブにしているためロードされずゼロとなります。
結果、Xには8bitイミディエイト値である(0~255)が、IRにはオペコードとアドレッシングモードが格納されます。
LDV命令における前半ステージの特殊処理について
アドレッシングモード | Xに格納される値の意味 | ステージ1の内部動作 | ステージ2の内部動作 | ステージ3の内部動作 |
---|---|---|---|---|
8bitイミディエイトアドレッシング | 0~255のいずれか | 全モードで共通 IR←命令コード上位8bit X ←命令の下位8bit X上位8bitをゼロクリア |
何もしない | 何もしない |
レジスタアドレッシング | 指定レジスタの値 | 何もしない | X←MEM[X] | |
間接レジスタアドレッシング | レジスタが示す番地の値 | X←MEM[X] | X←MEM[X] | |
16bitイミディエイトアドレッシング | 0~65535のいずれか | PCをインクリメント | X←MEM[PC] |
上の表は前半ステージの動作と結果的にXに格納される値をまとめたものですが、上記の4種類のモードでは何れもVRAMの値をXに格納する事ができません。ところがLDV命令(ビデオメモリからアキュムレータへのロードする命令)の場合は、前半ステージでXレジスタにVRAMの値を格納しておく必要があります。このため、LDV命令では第3ステージのアクセス対象メモリを主メモリからVRAMに強制的に変更することでVRAMの値をXに格納します。VLD命令の場合に限り上記の表は以下の様に変わります。
アドレッシングモード | Xに格納される値の意味 | ステージ1の内部動作 | ステージ2の内部動作 | ステージ3の内部動作 |
---|---|---|---|---|
8bitイミディエイトアドレッシング | 意味のない値 ※1 | 全モードで共通 IR←命令コード上位8bit X ←命令の下位8bit X上位8bitをゼロクリア |
何もしない | 何もしない |
レジスタアドレッシング | 意味のない値 ※2 | 何もしない | X←VRAM[X] | |
間接レジスタアドレッシング | レジスタが示すVRAM | X←MEM[X] | X←VRAM[X] | |
16bitイミディエイトアドレッシング | VRAMの指定番地の内容 | PCをインクリメント | X←VRAM[PC] |
LDV命令の8bitイミディエイトアドレッシングモードとレジスタアドレッシングモードは意味を持ちません。但し命令コード自体はは存在しますので実行は可能です。前者を実行するとXには単に0~255の値(表中※1)が、後者を実行するとVRAMの0番地~255番地の内容(表中※2)がXに格納されます。この実行結果は意味を持たないので便宜上「未定義命令」とします。
間接レジスタアドレッシングの場合はオペランドで指定した番号のレジスタが示すVRAMの内容が、16bitイミディエイトアドレッシングの場合は命令の2ワード目で指定した番地のVRAMの内容がXに格納されます。
間接レジスタアドレッシングでのVLD命令のタイミングチャート
クロック | ||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | |||||||||
アドレスバスの状態 | PCの値を出力 | Xの値を出力 | ||||||||||
データバスの状態 | MEM内容を出力 | VRAM内容を出力 | ||||||||||
Xの上位クリア | クリアする | |||||||||||
Xのロード許可 | 許可する | |||||||||||
IRのロード許可 | 許可する | |||||||||||
↑1 | ↑2 | ↑3 |
図中の1の時点でXに0~255のいずれかの値が格納されます。Φ2ではその値をアドレスバスに出力します。
図中の2の時点でXに主メモリの0番地~255番地(すなわちレジスタのいずれか)の値が格納されます。Φ3ではその値をアドレスバスに出力します
図中の3の時点でVRAMの(レジスタで指定されたアドレスの)値がXに格納されます。
16bitイミディエイトアドレッシングでのVLD命令のタイミングチャート
クロック | ||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | |||||||||
アドレスバスの状態 | PCの値を出力 | 任意 | PCの値を出力 | |||||||||
データバスの状態 | MEM内容を出力 | 任意 | VRAM内容を出力 | |||||||||
PCインクリメント | インクリメント | |||||||||||
Xの上位クリア | クリアする | |||||||||||
Xのロード許可 | 許可する | 許可する | ||||||||||
IRのロード許可 | 許可する | |||||||||||
↑1 | ↑2 | ↑3 |
図中の1の時点でXに0~255のいずれかの値が格納されます。
図中の2の時点でPCをインクリメントされる。Φ2は他には何もしない。
Φ3の区間はアドレスバスにはインクリメントされたPCの値が出力され、データバスにはそれをアドレスとするVRAMの内容が出力されます。図中の3の時点でVRAMの(命令の2ワード目で指定されたアドレスの)値がXに格納されます。
後半ステージの内部動作詳細
後半ステージ概略
前半ステージ終了時点で、内部レジスタXにはアドレッシングモードに応じた値が格納されます。但しVRAMロード命令の場合のみ他の命令とはXに格納される値が異なります。またHLT命令(停止命令)の場合は後半ステージに移行前に実行を停止しますので、下記の表は意味を持ちません。
命令の種類 | 8bitイミディエイト | レジスタ | レジスタ間接 | 16bitイミディエイト |
---|---|---|---|---|
VRAMロード命令 | このモードは禁止 | このモードは禁止 | レジスタが示すVRAMの内容 | 16bitオペランドが示すVRAMの内容 |
その他の命令 | 0~255の定数 | 指定レジスタの値 | レジスタが示す主メモリの内容 | 16bitオペランドが示す主メモリの内容 |
後半ステージ(第4~第6ステージ)では、この前半ステージで作られたXの値を用いて様々な命令を実行します。
Xが被演算子として用いられるか、アドレス値として用いられるかは命令より異なります。
演算/ロード命令
演算/ロード命令はXとAccの演算結果をAccに格納します。演算は、Clear(使用しない)、加算、減算(Acc-X)、減算(X-Acc)、論理積、論理和、排他的論理和、Set(常に結果がFFFFhになる演算)の8種類があります。但し「X-Acc」が指定された場合は第3ステージでAccをゼロクリアし、強制的に X-Acc を X-0 とします。これにより単にXの値をAccに格納する「ロード命令」を演算命令の一種として実現します。
演算/ロード命令のタイミングチャート
RETROF-16ではALUに74LS382を用います。74LS382は4bitの並列演算器ですが、これを4つカスケード接続し16bitの演算器としています。74LS382を4つカスケード接続すると入力値を与えてから正しい計算値(出力値)が求まるまで最大約150nsを要します。従ってクロックが一定速度以上の場合1ステージ分の時間では正しく計算できないことがあります。このためRETROF-16は実際の計算を第4ステージ冒頭から行い、計算結果の取込を第5ステージ末尾で行う事により必要な時間を確保します。以下にそのタイミングチャートを示します。
クロック | ||||||||||||||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | Φ4 | Φ5 | Φ6 | ||||||||||||||||||
アドレスバスの状態 | PCの値を出力 | アドレッシングモード依存 | アドレッシングモードで決定したXの値を出力 | |||||||||||||||||||||
データバスの状態 | アドレスバスで指定された番地のMEM内容を出力 | Accの値を出力 | ||||||||||||||||||||||
ALUバスの状態 | アドレスバス上の値とデータバス上の値を出力 | 不定(演算中) | AccとXの演算結果 | |||||||||||||||||||||
ALUクリア要求 | LD演算時のみ | |||||||||||||||||||||||
ACCのクロック | ACC(74LS395)はクロックの立下りでデータを取込む | |||||||||||||||||||||||
↑1 | ↑2 | ↑3 |
被演算子(演算の対象となる値)であるXは(アドレッシングモードにより異なりますが)図中の1の時点で値が確定します。もう一方の被演算子であるAccは図中の2の時点で値をデータバスに放出します。従って演算に必要な2つの被演算子が揃うのは、両者の遅い方の2の時点になります。ALUは入力を与えてから演算結果が出力されるまで最大約150nsを要しますので、演算結果のAcc(74LS395)への取込は第5ステージの終わり(図中の3の時点)で行います。
図中の2の時点と3の時点の間隔は250ns(8MHzクロックの場合)となり必要な長さを満たします。
尚、ロード命令の場合は第3ステージの全区間に渡ってAccに対するクリア信号(非同期)を送ります。
【注意】上記のタイミングチャートはALUの演算遅延時間のみを考慮し、他の素子の遅延や配線遅延は考慮していません。他の遅延も考慮すると更に微妙なタイミングとなりますが、本ページでは詳細を割愛します。(後日、オシロスコープでの実波形を添付予定です)。
またALUとして74LS382よりも高速演算が可能な74F382を用いると、上記のタイミングにはかなりの余裕が望めます。
ストア命令
ストア命令はXで指定された番地にAccの値を書込む命令です。使用するSRAMにより書込の許容タイミングは大きく異なります。今回使用したHM62256P-10の場合は、書込信号(下記チャートのWR#)は最低75ns必要です。また書込期間の前後も一定時間アドレスとデータを保持する必要があります。HM62256-10はこの保持時間が前後共に0nsでも可のSRAMですが、他のSRAMを使用する場合に備え第4ステージと第6ステージをアドレスとデータの保持時間とし、第5ステージの全期間(125ns)を書込時間としています。
ストア命令のタイミングチャート
WR#の「#」はこの信号が負論理(Lでアクティブ)であることを意味します。信号名に上線を引く代りです。
クロック | ||||||||||||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | Φ4 | Φ5 | Φ6 | ||||||||||||||||
アドレスバスの状態 | PCの値を出力 | アドレッシングモード依存 | アドレッシングモードで決定したXの値を出力 | |||||||||||||||||||
データバスの状態 | アドレスバスで指定された番地のMEM内容を出力 | Accの値を出力 | ||||||||||||||||||||
主メモリWR#端子 | 書込期間 | |||||||||||||||||||||
VRAMロード命令
VRAMロード命令はビデオRAM(256×256画素16色の情報を保持)の内容をAccに転送する命令です。
この命令に限り前半ステージのΦ3で、主メモリの指定アドレスの内容ではなくビデオメモリの指定アドレスの内容をXに格納されています。従って後半ステージの動作は演算/ロード命令と全く同じです。
演算命令とロード命令のタイミングチャート
前半ステージのΦ3ステージのみ他の命令と異なる動作となります。詳細は本ページ内で解説済(そこに移動)に付、省略します。
クロック | ||||||||||||||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | Φ4 | Φ5 | Φ6 | ||||||||||||||||||
アドレスバスの状態 | PCの値を出力 | アドレッシングモード依存 | アドレッシングモードで決定したXの値を出力 | |||||||||||||||||||||
データバスの状態 | アドレスバスで指定された番地のMEM内容を出力 | Accの値を出力 | ||||||||||||||||||||||
ALUバスの状態 | アドレスバス上の値とデータバス上の値を出力 | 不定(演算中) | AccとXの演算結果を出力 | |||||||||||||||||||||
ALUクリア要求 | LD演算時のみ | |||||||||||||||||||||||
ACCのクロック | ACC(74LS395)はクロックの立上りでデータを取込む | |||||||||||||||||||||||
↑1 | ↑2 | ↑3 |
VRAMストア命令
VRAMストア命令はビデオRAM(256×256画素16色の情報を保持)への書込みを行う命令です。この命令の詳細は書込みの対象となるRAMが異なる以外はストア命令と全く同じです。但しVRAMは命令の種類やその実行とは関係なく常時LCD(液晶ディスプレイ)へデータを出力する必要があるためそのアドレスラインは通常はラスタアドレスジェネレータに接続されています。
このため、ビデオ出力命令の後半ステージの時のみバスの所有権を切替え、内部レジスタXにアドレスラインを渡す方法で書き込みを行います。
左図はVRAM回りの詳細です。紫と緑の三角形は3Sバッファを表し、通常は紫の3Sが貫通し緑の3Sは遮断されています。ビデオ出力命令の後半ステージの期間は逆に紫が遮断され緑が貫通します。
OSC:画像用基本クロック RasterADRS:ラスターアドレス発生器
SYNC:同期信号発生器 DAC:DAコンバータ (これらの詳細は回路図編を参照)
ビデオ出力命令のタイミングチャート
VRAMは後半ステージのみ、アドレスとデータの制御をXとAccに渡します。この間表示は中断されLCDには細かなノイズが現われます。
クロック | ||||||||||||||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | Φ4 | Φ5 | Φ6 | ||||||||||||||||||
アドレスバスの状態 | PCの値を出力 | アドレッシングモード依存 | アドレッシングモードで決定したXの値を出力 | |||||||||||||||||||||
データバスの状態 | アドレスバスで指定された番地のMEM内容を常に出力 | Accの値を出力 | ||||||||||||||||||||||
VRAMのアドレス線 | ラスターアドレスが占有 | 内部レジスタXの出力が占有 | ||||||||||||||||||||||
VRAMのデータ線 | ラスターアドレスで指定された画素のデータを出力 | Accからのデータ値が与えられている | ||||||||||||||||||||||
VRAMのWR#端子 | 書込期間 | |||||||||||||||||||||||
入力命令
入力命令はデータバスに接続されている入力ポート(16bit)の値とXの値を演算結果をAccに格納します。入力ポートの内容をそのままAccに転送したい場合は、イミディエイトモードでXに0を指定し、「入力ポート+X」の演算を実行します。また、演算にANDを指定する事によりポート入力とビットマスクを1命令で実行可能です。
入力ポートの実体は3ステートバッファ(74LS173)です。このバッファの入力は基板上で16個のトグルスイッチに直結しています。入力ポートはこの1組ですがワイヤードORでキーボードなども接続可能です。
入力命令のタイミングチャート
図中の1の時点でALUバスの内容がAccに取り込まれます。ALUの入力の一方がAccから入力ポートに変わるだけで詳細は演算/ロード命令と同じです。
クロック | ||||||||||||||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | Φ4 | Φ5 | Φ6 | ||||||||||||||||||
アドレスバスの状態 | PCの値を出力 | アドレッシングモード依存 | アドレッシングモードで決定したXの値を出力 | |||||||||||||||||||||
データバスの状態 | アドレスバスで指定された番地のMEM内容を出力 | 入力ポートの内容を出力 | ||||||||||||||||||||||
ALUバスの状態 | アドレスバス上の値とデータバス上の値を出力 | 不定(演算中) | ポートとXの演算結果を出力 | |||||||||||||||||||||
↑1 |
出力命令
出力命令はXの内容とAccの内容を出力ポートに渡します。出力ポートはレベルトリガのFF(フリップフロップ)を32bit分並べ、FFの出力にはLEDを直結しています。
出力ポートとして用いているFFの実体は74ALS563です。LSではなくALSを使用したのは、単にLSが入手できなかった為であり深い意味はありません。
出力命令のタイミングチャート
タイミングはストア命令と同じです。但しLE(ラッチイネーブル)の論理はメモリのWR#と逆で、LEがHの時にデータが書込まれます。また74LS563は書込前/書込後に10ns程度のデータ保持期間が必要です。この保持期間はそれぞれ第4ステージと第6ステージが担います。
クロック | ||||||||||||||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | Φ4 | Φ5 | Φ6 | ||||||||||||||||||
アドレスバスの状態 | PCの値を出力 | アドレッシングモード依存 | アドレッシングモードで決定したXの値を出力 | |||||||||||||||||||||
データバスの状態 | アドレスバスで指定された番地のMEM内容を常に出力 | Accの値を出力 | ||||||||||||||||||||||
出力ポートのLE端子 | 書込期間 | |||||||||||||||||||||||
分岐命令
分岐命令はXの値をPCに転送するだけで実現できます。
ALUは用いないので演算を指定する3bitは意味を持ちませんので、分岐命令ではこの3bitを分岐条件指定bitとしています。分岐条件は無条件分岐も含め8種類あり、条件に一致したときのみ分岐します。
条件分岐分岐命令で条件不一致の場合はPCに書き込む信号は出力しません。
(条件一致判断の仕組の詳細は回路図編を参照してください)
分岐命令のタイミングチャート
クロック | ||||||||||||||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | Φ4 | Φ5 | Φ6 | ||||||||||||||||||
アドレスバスの状態 | PCの値を出力 | アドレッシングモード依存 | アドレッシングモードで決定したXの値を出力 | |||||||||||||||||||||
データバスの状態 | アドレスバスで指定された番地のMEM内容を出力 | Accの値を出力 | ||||||||||||||||||||||
PCのLD端子 | 書込期間 | |||||||||||||||||||||||
PCの実体は74LS569です。ロードは非同期です。
プログラムカウンタ取得命令
プログラムカウンタの値を知るための命令です。PCとAccとの演算で実現します。
(サブルーチンコールを行う際の戻り番地を保存する為の命令です)
この命令はXを用いないので命令コードにおける「アドレッシングモード」と「オペランド」は意味をもちません。
タイミングチャートはXがPCに変わる点を除き、演算/ロード命令と同じです。
クロック | ||||||||||||||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | Φ4 | Φ5 | Φ6 | ||||||||||||||||||
アドレスバスの状態 | PCの値を出力 | 意味を持たない | PCの値を出力 | |||||||||||||||||||||
データバスの状態 | アドレスバスで指定された番地のMEM内容を出力 | Accの値を出力 | ||||||||||||||||||||||
ALUバスの状態 | アドレスバス上の値とデータバス上の値を出力 | 不定(演算中) | AccとPCの演算結果を出力 | |||||||||||||||||||||
ALUクリア要求 | LD演算時のみ | |||||||||||||||||||||||
ACCのクロック | ACC(74LS395)はクロックの立上りでデータを取込む | |||||||||||||||||||||||
シフト命令
シフト命令はAccの内容を右に1bitシフトします。(左シフトは命令としてはありません。AccとAcc自身の加算で行います
この命令はアドレッシングモードも演算種別も関係ありません。単にAccのロードとシフトの切替端子をシフトとしてAccへクロックを与えるだけです。
クロック | ||||||||||||||||||||||||
ステージ | Φ1 | Φ2 | Φ3 | Φ4 | Φ5 | Φ6 | ||||||||||||||||||
ACCの動作指定 | 任意(実際には「クロックでロード」を指定) | クロックでシフトを指定 | ||||||||||||||||||||||
ACCのクロック | ACC(74LS395)はクロックの立上りでシフトする | |||||||||||||||||||||||
実行停止命令
実行停止命令は命令フェッチ(Φ1期間の中央)の時点で、オペコードが「停止」であると認識した瞬間にステージカウンタのカウントアップを停止する事で実現します。従って特にタイミングチャートは存在しません。
NOP命令
NOP命令は意味の無い命令(例えばAcc+0→Acc等)をNOPと呼称するだけであり、NOP命令専用のステージがあるわけではありません。
ステージ設計とタイミング検証を終えて
本ページは、TTLのみで作る16bitコンピュータの設計にあたり、シミュレーター等のEDAを一切使わずにタイミング設計とその検証を試みたものです。
勿論、最新のEDAでなくともPC上で動くフリーの回路シミュレーター等でも、本ページの様な「手作業」の検証よりも遥かに効率が良いのも事実です。
「なぜこの様な時間の無駄をわざわざするのか?」と尋ねられる方が稀におりますが、私はいつもこう答えています。
「山登りが好きな人は、時間の無駄だからと言ってヘリで山頂に移動しますか?」
あるいは「魚釣りが好きな人は、時間の無駄だからと言って魚屋で魚を買って済ませますか?」と。
2013年12月吉日初出