汎用ロジックで作る16bitコンピュータ   

ステージ設計とタイミング検証

Copyright © 2013-2014 T.GATARO All Rights Reserved.

「汎用ロジックでコンピュータを作る」のトップページ(目次)はこちら   管理人のメインページはこちら

【変更記録】
 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月吉日初出