(57)【要約】【課題】データ処理動作の高速化を図る。【解決手段】ＣＰＵの命令リードを１６ビット（第１の語数）で行うか、３２ビット（第２の語数）で行うかを選択する手段（ＦＦ）を設ける。１６ビット／３２ビットの命令リードに応じて、プログラムカウンタ（ＰＣ）のインクリメント値を（＋２／＋４）切替える。データのリード／ライトは前記選択手段にかかわらず、所要のデータサイズで行う。バスコントローラは、ＣＰＵ（２）が１６ビット／３２ビットで命令リードまたはデータのリード／ライトを発行すると、そのアドレスに示される資源に指定されたバス幅に対応して、所定の回数のリード／ライトを行い、ＣＰＵが発行した１６ビット／３２ビットの命令（リードデータ）が用意されるまで、ＣＰＵにウェイトを要求する。【選択図】図１
2007048316.tif 000002
【特許請求の範囲】
【請求項１】
命令を読み込んで解読し、その解読結果に従って命令を実行する命令実行手段を有し、
前記命令実行手段は、データまたはアドレスを格納可能なレジスタと、
命令リードを行なう語数を選択する選択手段と、
前記選択手段によって選択された語数の命令リードのためのバス制御信号を生成すると共に、前記選択された語数に応じて命令のプリフェッチカウンタのインクリメント値を切替える制御手段と、を有し、
データのリード及びライトは前記選択手段にかかわらず、所要の語数で行うことを特徴とするデータ処理装置。
【請求項２】
前記選択手段で選択可能な語数は１６ビット又は３２ビットであることを特徴とする請求項１記載のデータ処理装置。
【請求項３】
前記制御手段は、命令リードの量が少ないときには、前記選択手段にかかわらず、相対的に少ない語数で命令リードを行うことを特徴とする請求項１記載のデータ処理装置。
【請求項４】
前記制御手段は、分岐命令の命令コードをデコードして実行する際に、分岐先の命令のリードを行い、分岐先の命令のリード内容を入力した時点で、前記分岐先の命令リード内容の解読を行うことを特徴とする請求項１又は３記載のデータ処理装置。
【請求項５】
内蔵ＲＯＭと、外部に接続したメモリをアクセス可能な外部バス手段とを更に有し、
前記内蔵ＲＯＭのバス幅よりも、前記外部バス手段のバス幅を狭くする選択が可能であることを特徴とする請求項１又は３記載のデータ処理装置。
【請求項６】
内蔵ＲＯＭと、外部に接続したメモリをアクセスする外部バス手段とを更に有し、
前記内蔵ＲＯＭのバス幅は前記外部バス手段のバス幅よりも広いことを特徴とする請求項１又は３記載のデータ処理装置。
【請求項７】
前記選択手段は、前記語数選択のための制御情報が命令の実行によって設定可能にされ、制御情報の初期値は相対的に大きな方の語数であることを特徴とする請求項１又は３記載のデータ処理装置。
【請求項８】
命令を読み込んで解読し、その解読結果に従って命令を実行する命令実行手段を有し、
前記命令実行手段は、異なるシフトビット数の第１シフタと第２シフタを直列に接続したシフタと、前記シフタと並列に接続された算術演算器とを有することを特徴とするデータ処理装置。
【請求項９】
前記命令実行手段は、前記第１シフタと第２シフタのシフト動作を独立にシフト動作の可否を選択可能であることを特徴とする請求項８記載のデータプロセッサ。
【請求項１０】
前記命令実行手段は、第１のステートで、第１シフタ及び第２シフタの少なくとも一方で、所定のシフト動作を実行し、残りのシフトビット数を示す情報を生成し、前記情報に基づいて、第２のステートで、第１のステートで実行したシフト動作と異なるシフト動作を、第１シフタ又は第２シフタの少なくとも一方で実行することを特徴とする請求項９記載のデータ処理装置。
【請求項１１】
前記命令実行手段は、前記情報に基づいて、割り込みを抑止することを特徴とする請求項１０記載のデータ処理装置。
【請求項１２】
命令を読み込んで解読し、その解読結果に従って命令を実行する命令実行手段を有し、
前記命令実行手段は、第１のビット数の被乗数と第１のビット数の乗数とを乗算して第２のビット数の積を得る乗算手段を有し、この乗算手段を使用して、
第１のビット数の被乗数と第１のビット数の乗数とから第１のビット数の積の下位を得る第１乗算命令と、
第２のビット数の被乗数と第２のビット数の乗数とから第２のビット数の積の下位を得る第２乗算命令と、
第２のビット数の被乗数と第２のビット数の乗数とから第２のビット数の積の上位を得る第３乗算命令とを実行可能であることを特徴とするデータ処理装置。
【請求項１３】
第１のビット数は１６ビット、第２のビット数は３２ビットであることを特徴とする請求項１２記載のデータ処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ処理装置に関し、例えば中央処理装置（ＣＰＵ）、これを搭載するマイクロコンピュータ若しくはデータプロセッサ等に利用して有効な技術に関するものである。
【背景技術】
【０００２】
半導体集積回路でなるマイクロコンピュータは、アドレス空間の拡張や、命令セットの拡大、高速化などが図られてきた。オブジェクトレベルで互換性を保ちつつ、アドレス空間の拡張や、命令セット拡大を実現した例として、例えば、特開平５−２４１８２６号又は特開平６−５１９８１号に記載されたものがある。
【０００３】
また、２ステートで基本命令を実行していたＣＰＵとの互換性を保ちつつ１ステートで基本命令を実行するように高速化し、さらに、ＣＰＵとは独立した乗算器を内蔵して高速化を図った例として、特開平８−２６３２９０号に記載のものがある。
【０００４】
高速化によって、マイクロコンピュータによって制御される機器の高速化や高機能化、或は、従来複数の半導体集積回路で構成したものを、統合したりすることによる小型化などを図ることができる。
【０００５】
本発明者は先の出願（特開２０００−３５７０８９）において、以下の提案を行った。すなわち、内部データバス幅を、少なくとも命令の基本単位（例えばワード）よりも大きくし、リードした命令を複数単位保持する命令レジスタを持ち、この命令レジスタに存在する命令の量を監視する手段を設け、命令を、実行の基本単位時間（ステート）にしたがって、命令のリードとプログラムカウンタ（ＰＣ）インクリメントのみの制御を行うステートと、実効アドレスの計算やデータの演算処理の制御を含むステートに分割し、命令のリードのみの制御を行うステートを省略可能にした。即ち、前記監視手段の指示に従い、前記命令レジスタに存在する命令量に従って、前記命令のリードのみの制御を行うステートを省略（スキップ）するようにした。これによって、各命令の実行時における命令リードの量を、自命令の命令長に対して、多くしたり、少なくしたりすることによって、実行ステート数を短縮し、高速化を図ろうとする。
【０００６】
【特許文献１】特開平５−２４１８２６号
【特許文献２】特開平６−５１９８１号
【特許文献３】特開平８−２６３２９０号
【発明の開示】
【発明が解決しようとする課題】
【０００７】
本発明者らは、マイクロコンピュータなどにおいて高速化を実現するためのハードウェアについて検討した。その検討過程では以下の点を考慮した。
【０００８】
シングルチップ型のマイクロコンピュータ、ないしは機器制御においては、割込み応答時間を短縮することが重要であると認識している。制御対象やマイクロコンピュータ内部の各種のイベントを割込みとして、ＣＰＵが認識し、これに対応した所定のプログラムを実行することで、マイクロコンピュータの各種の資源を用いて、所望の制御を実現するとき、所定のイベントの発生に対して、所望の制御を、所定の時間内に実行するリアルタイム性を向上することが必要だからである。
【０００９】
論理的・物理的規模を最小限にすることが望ましいことにも着目した。プログラム用のメモリであるＲＯＭ（Read Only Memory）を内蔵した、シングルチップ型のものにあっては、内蔵ＲＯＭの容量が、外部にメモリを接続するのに比較して少ないため、プログラム容量を削減することが望ましい。
【００１０】
また、近年、シングルチップ型のマイクロコンピュータのＲＯＭとして、電気的に書込み消去が可能なフラッシュメモリ、ＥＥＰＲＯＭ（電気的に書込み消去可能なＲＯＭ）が用いられることが多い。これらの電気的に書込み消去が可能なメモリは、記憶素子が大きく、また、書込み消去用の高電圧発生回路などが必要であって、その物理的規模が大きくなってしまうため、より一層、プログラム容量の削減が望ましい。内蔵ＲＡＭ（Random Access Memory ）についても同様であり、使用するデータの容量を小さくできる方が望ましい。
【００１１】
マイクロコンピュータのプログラムを、Ｃ言語などの高級言語で記述することが増えてきている。高級言語で記述する場合、アセンブリ言語で記述する場合に比較して、プログラム容量および使用するデータの容量が大きくなり易い。  本発明者は、上記観点より、高速化に関し、ハードウェアの点より、以下の点を実現することが重要であることを見出した。
【００１２】
（１）［バスモード］
内部バスを３２ビット化して、高速化する手段については、内蔵ＲＯＭなどのようにバス幅を広げられる場合は有効であるが、マイクロコンピュータの応用範囲は広く、外部メモリにプログラムを格納して使用する場合も多く、外部メモリの場合、３２ビットバスは、配線領域・マイクロコンピュータのピン数・使用するメモリの価格といった面で制約が大きいことを見出した。そこで、ＣＰＵが、３２ビットで命令リードを要求して、これを２回の１６ビットリードとして実現することは可能である。しかし、ＣＰＵは要求した３２ビットがリードされるのを待つことになる。命令リードは、分岐命令などがあると余分にリードしても無駄になってしまう（使用されない）ことがある。この間、ＣＰＵがウェイトされることになり、二重の無駄になるとともに、割込みも受付けられなくなってしまい、いわゆる割込み応答時間が増加してしまう。なお、特開昭５６−１３２６２４号にはＩ／Ｏからバス幅指定信号を入力し、動作を切替える例が記載されている。命令については、考慮されていない。
【００１３】
（２）［遅延分岐］
ＲＩＳＣ型のマイクロコンピュータなどのようにパイプラインが固定化されたものにあっては、分岐命令を高速化し、かつ内部論理構成を簡単にするために、遅延分岐を行うものがある。分岐命令とその前の命令を入れ替えて実行するようにし、入れ替えた分岐命令を遅延分岐命令、入れ替えたその前の命令を遅延スロット命令と呼ぶ。可変長の命令コードに対して、遅延分岐を適用する例に、特開平１０−２１０７４号がある。この例では、ハーバードバスを前提にしており、パイプラインステージは均一になっている。また、同一の分岐を行う命令が遅延分岐しかないと、遅延スロットに配置可能な命令がなく、ＮＯＰ命令を配置することになり、不所望な命令増加、プログラム容量の増加を招く。
【００１４】
（３）［複数ビットシフト］
複数ビットシフトを行う場合、いわゆるバレルシフタを用いることが知られている。バレルシフタについては、例えば、特開平１０−１９８５５０号に記載されている。
【００１５】
一方、ＣＰＵの演算の種類は複数あり、これに対応した演算器を持つ必要がある。例えば、シフト演算のほか、算術演算、論理演算等がある。これらは、直列に配置する（加算結果をシフトする、など）必要がないので、並列に配置するとよい。ＣＰＵの動作周波数を向上するためには、これらの最大の遅延を持つ演算器を高速化する必要がある。換言すれば、最大の遅延を持つ演算器に相当する遅延を、他の演算器が許容できることになる。一般に算術演算器は桁上がりを有するために遅延が大きくなり易い。
【００１６】
複数ビットシフトを行なう場合に、バレルシフタを用いない場合は、１ビットのシフト命令を必要個数配置するか、プログラムループ処理を行うことになる。５ビットシフトを行う場合、前者の例は、
ＳＨＬＬ．Ｌ  ＃１，ＥＲ１
ＳＨＬＬ．Ｌ  ＃１，ＥＲ１
ＳＨＬＬ．Ｌ  ＃１，ＥＲ１
ＳＨＬＬ．Ｌ  ＃１，ＥＲ１
ＳＨＬＬ．Ｌ  ＃１，ＥＲ１
となり、また、後者の例は、
ＭＯＶ．Ｂ  ＃５，Ｒ０Ｌ
Ｌ１    ＳＨＬＬ．Ｌ  ＃１，ＥＲ１
ＤＥＣ．Ｂ  ＃１，Ｒ０Ｌ
ＢＮＥ              Ｌ１
となる。出現頻度は高くないにしても、プログラム容量の増加を招く。
【００１７】
（４）［乗算器］
乗算器を内蔵する場合、８ビット×８ビットの積が１６ビットといったように積が拡張されるものよりも、Ｃ言語ソースプログラム上のデータ型に応じて、１６ビット×１６ビットの積が１６ビットのように、乗数、被乗数、積が夫々同じサイズである場合が多い。また、定数除算の代わりに、乗算を用いるプログラム手法が、特開２０００−３５７０９６で知られている。
【００１８】
本発明の目的は、ハードウェアの観点よりデータ処理の高速化を図ることにある。詳しくは、同一の動作周波数での高速化、換言すれば、所定の処理を行うのに必要な実行ステート数を短縮することにある。
【００１９】
本発明の別の目的は、資源の利用効率を向上させることができるデータ処理装置を提供すること、使い勝手を向上させることができるデータ処理装置を提供すること、プログラム容量を低減することができるデータ処理装置を提供することにある。
【００２０】
本発明の前記並びにその他の目的と新規な特徴は本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【００２１】
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば下記の通りである。
【００２２】
（１）［バスモード］
ＣＰＵの命令リードを例えば１６ビット（第１の語数）で行うか、３２ビット（第２の語数）で行うかを選択する手段を設ける。１６ビット／３２ビットの命令リードに応じて、プログラムカウンタのインクリメント値を（＋２／＋４）切替える。データのリード／ライトは前記選択手段にかかわらず、所要のデータサイズで行う。即ち、バスモードに関する本願発明に係るデータ処理装置は、命令を読み込んで解読し、その解読結果に従って命令を実行する命令実行手段（ＣＰＵ）を有する。前記命令実行手段は、データまたはアドレスを格納可能なレジスタと、命令リードを行なう語数を選択する選択手段と、前記選択手段によって選択された語数の命令リードのためのバス制御信号（ＢＣＭＤ）を生成すると共に、前記選択された語数に応じて命令のプリフェッチカウンタ（ｐｆｃ）のインクリメント値（＋２／＋４）を切替える制御手段（ＤＥＣ）と、を有し、データのリード及びライトは前記選択手段にかかわらず、所要の語数で行う。例えば、バスコントローラは、ＣＰＵが１６ビット／３２ビットで命令リードまたはデータのリード／ライトを発行すると、そのアドレスに示される資源に指定されたバス幅に対応して、所定の回数のリード／ライトを行い、ＣＰＵが発行した１６ビット／３２ビットの命令（リードデータ）が用意されるまで、ＣＰＵにウェイトを要求する。
【００２３】
分岐命令の実行開始時などのように必要な命令リードの量が少ないときには、強制的に１６ビット（少ない語数）で命令リードを行うようにする。分岐命令や割込み例外処理などの場合、最低限１ワード分のプリフェッチが完了した時点で、分岐先の先頭命令のデコードを開始し、実行するようにＣＰＵを構成する。
【００２４】
データは所要量のデータリード／ライトを発行するようにし、無駄が生じることがない。
【００２５】
前記制御手段は、分岐命令の命令コードをデコードして実行する際に、分岐先の命令のリードを行い、分岐先の命令のリード内容を入力した時点で、前記分岐先の命令リード内容の解読を行う。
【００２６】
データ処理装置は内蔵ＲＯＭと、外部に接続したメモリをアクセス可能な外部バス手段とを更に有してよい。このとき、前記内蔵ＲＯＭのバス幅よりも、前記外部バス手段のバス幅を狭くする選択が可能である。或は、前記内蔵ＲＯＭのバス幅は前記外部バス手段のバス幅よりも広い。
【００２７】
本発明の望ましい一つの態様では、前記選択手段は、前記語数選択のための制御情報が命令の実行によって選択可能にされ、制御情報の初期値は相対的に大きな方の語数であるのがよい。
【００２８】
（２）［遅延分岐］
遅延分岐命令での分岐先命令は、一旦、第２保持手段としての専用のレジスタ（ＩＲ）に保持するようにする。遅延スロット命令の終了時に、第１保持手段としての命令バッファ（ＦＢ）のクリアを行うようにする。即ち、データ処理装置は命令を読み込んで解読し、その解読結果に従って命令を実行する命令実行手段を有し、前記命令実行手段は、命令コードを保持する第１の保持手段（ＦＢ）と第２の保持手段（ＩＲ）を持ち、遅延分岐命令でリードした分岐先命令は、前記第２の保持手段（ＩＲ）に保持し、前記第１の保持手段（ＦＢ）は、それ以前の内容を保持し、遅延スロット命令の終了時に、前記第１の保持手段（ＦＢ）のクリアを行う。
【００２９】
同様に、分岐アドレスを示しているプリフェッチカウンタ（ｐｆｃ）を、一旦、一時的なレジスタ手段（ＴＲ）に保持することで、遅延スロットの命令の命令コード長が長い場合も、プリフェッチカウンタに基づいて、継続して命令リードを行うことができる。遅延スロットの命令は複数ステートで実行可能であってよい。これにより、遅延スロットに配置する命令を増やし、遅延分岐を利用し易くし、使い勝手を向上し、資源の利用効率を向上するとともに、高速化を実現できる。即ち、前記命令実行手段は、プリフェッチカウンタ（ｐｆｃ）と、一時的な情報保持に利用される一時レジスタ手段（ＴＲ）とを更に有し、遅延分岐命令で、分岐先アドレスまたはこれをインクリメントした値を、前記一時レジスタ手段（ＴＲ）に保持し、前記プリフェッチカウンタは、分岐先命令リード以前に命令リードを行ったアドレスに続く内容を保持し、遅延スロット命令実行には、前記プリフェッチカウンタを利用可能とし、遅延スロット命令の終了時に、前記一時レジスタ手段（ＴＲ）の内容またはこれをインクリメントした値を前記プリフェッチカウンタにプリセットする。  パイプラインの乱れを抑止する課題とは別に、分岐時に分岐命令リードのレイテンシを隠蔽する意味で、複数ステートで実行する命令を遅延スロットに配置することによって、実行ステート数を短縮することができる。
【００３０】
遅延スロットに配置された命令では、自命令の命令コードのリードデータを待つステートや実効アドレス計算のためのステートは命令リードを抑止する。これにより、利用されない命令リード（プリフェッチ）を抑止できる。ウェイトが挿入されたりして、実行ステート数が増加することを回避することができる。
【００３１】
前記命令実行手段は、前記遅延分岐命令と、前記遅延分岐命令と同一のアドレッシングモードである遅延分岐の無い分岐命令をともに実行可能である。要するに、同一のアドレッシングモードで分岐命令と遅延分岐命令を持つ。遅延スロットに配置可能な命令がない場合に、不所望なＮＯＰ（無操作）命令などを配置する必要がないようにする。
【００３２】
（３）［複数ビットシフト］
２の累乗といった固定的なビット数のシフタを、２段直列に配置し、直列配置された第１シフタ及び第２シフタを算術論理演算器と並列に配置する。例えば、３２ビット演算を可能にする場合、第１のシフタは、第１、第２のビット数（１、２）の左右シフトを行い、第２のシフタは、第３、第４、第５のビット数（４、８、１６）の左右シフトを行う動作を可能にし、かつ、シフトしない動作も選択可能にする。
【００３３】
制御部によって、２段のシフタの制御を行う。制御部は、命令実行時に、シフトビット数を判定して、第１方向のシフト及び第２方向へのシフト動作の指示、第１シフタ又は第２シフタの一方のみ、或いは両方のシフト動作を指示する。制御部は、命令実行時に、第１シフタ、第２シフタの１回の操作では十分でない場合、残りのシフトビット数を指示（ｓｆｔｃｎｔ）して、次のステートで引続きシフトを行うように構成する。この間、割り込みは禁止する。例えば、出現頻度の高いシフトビット（１、２、４、８、１６ビット）は１ステートで実行可能にし、３２ビットの演算の場合、最大でも、第１、第２、第３、第４、第５のビット数（１、２、４、８、１６）を１回ずつ、３ステートの動作を行うことにより、任意ビットのシフトを行うことができる。
【００３４】
バレルシフタは、左右６４選択のセレクタを有するのに対して、上記手段に係る複数ビットシフト回路では、シフト方向を含めたシフトビット数の選択及びシフトしない選択も含めて、第１シフタは５選択のセレクタがあればよく、第２シフタは７選択のセレクタがあればよい。これによって論理規模を縮小することができる。また、算術演算器と並列であって、上記手段に係る複数ビットシフト回路の遅延時間をその算術演算器の遅延時間と均等にして、遅延時間の増加を抑止できる。上記手段に係る複数ビットシフト回路は、前記１ビットのシフト命令を必要個数配置するか、プログラムループ処理を行う場合より、プログラム容量を削減することができる。
【００３５】
（４）［乗算器］
本発明に係るデータ処理装置は命令実行手段を有し、前記命令実行手段は、第１のビット数の被乗数と第１のビット数の乗数とを乗算して第２のビット数の積を得る乗算手段を有し、この乗算手段を使用して、第１のビット数の被乗数と第１のビット数の乗数とから第１のビット数の積の下位を得る第１乗算命令（ＭＵＬ．Ｗ）と、第２のビット数の被乗数と第２のビット数の乗数とから第２のビット数の積の下位を得る第２乗算命令（ＭＵＬ．Ｌ）と、第２のビット数の被乗数と第２のビット数の乗数とから第２のビット数の積の上位を得る第３乗算命令（ＭＵＬ／ＵＰ）とを実行可能である。例えば、１６ビット×１６ビットの積３２ビットを１ステートで実行可能な乗算論理を持つ乗算器で、１６ビット×１６ビットの乗算命令を１ステートで実行可能にするとともに、３２ビット×３２ビットの積の下位の３２ビットを得る乗算命令を４ステートで、３２ビット×３２ビットの積の上位の３２ビットを得る乗算命令５ステートで実行可能にする。
【００３６】
乗算器は、スタート信号（ｓｔａｒｔ）と、乗算のサイズを示す制御信号（ｍｕｌ＿ｌｏｎｇ）と、乗算器の上位演算結果を採る制御信号（ｕｐｐｅｒ）を得て動作するようにし、状態遷移を行う。３２ビット×３２ビットの積の上位の３２ビットを得る乗算命令を除算に用いることにより、除算の効率化に寄与する。
【発明の効果】
【００３７】
本願において開示される発明のうち代表的なものによって得られる効果を簡単に説明すれば下記の通りである。
【００３８】
すなわち、ハードウェアの観点より、同一の動作周波数での高速化、換言すれば、所定の処理を行うのに必要な実行ステート数を短縮することができ、データ処理の高速化を図ることができる。更に、データ処理装置もしくはこれを適用するデータ処理システムにおける資源の利用効率を向上させることに寄与できる。データ処理装置の使い勝手を向上させ、また、プログラム容量を低減させることに寄与できる。
【発明を実施するための最良の形態】
【００３９】
図２には本発明に係るデータ処理装置が適用されたシングルチップマイクロコンピュータのブロック図が例示される。
【００４０】
同図に示されるシングルチップマイクロコンピュータ１は、全体の制御を司るＣＰＵ２、バスコントローラ（ＢＳＣ）３、割込コントローラ（ＩＮＴ）４、ＣＰＵ２の処理プログラムなどを格納するメモリであるＲＯＭ５、ＣＰＵ２の作業領域並びにデータの一時記憶用のメモリであるＲＡＭ６、タイマ７、シリアルコミュニケーションインタフェース（ＳＣＩ）８、Ａ／Ｄ変換器９、第１乃至第９入出力ポート（ＩＯＰ１〜ＩＯＰ９）１０Ａ〜１０Ｉ、クロック発振器（ＣＰＧ）１１の機能ブロック若しくはモジュールから構成され、公知の半導体集積回路製造技術により１つの半導体基板（半導体チップ）上に形成される。
【００４１】
前記シングルチップマイクロコンピュータ１は、電源端子として、グランドレベル（Ｖｓｓ）、電源電圧レベル（Ｖｃｃ）、アナロググランドレベル（ＡＶｓｓ）、アナログ電源電圧レベル（ＡＶｃｃ）、の印加端子を有し、更に専用制御端子として、リセット（ＲＥＳ）、スタンバイ（ＳＴＢＹ）、モード制御（ＭＤ０、ＭＤ１）、クロック入力（ＥＸＴＡＬ、ＸＴＡＬ）の各端子を有する。
【００４２】
各入出力ポート１０Ａ〜１０Ｉは、アドレスバス、データバス、バス制御信号あるいはタイマ７、ＳＣＩ８、Ａ／Ｄ変換器９の入出力端子と兼用されている。
【００４３】
ＣＰＧ１１の端子ＥＸＴＡＬ、ＸＴＡＬに接続される水晶発振子またはＥＸＴＡＬ端子に入力される外部クロックに基づいて生成される基準クロック（システムクロック）に同期して、シングルチップマイクロコンピュータ１は動作を行う。この基準クロック１周期をステートと呼ぶ。
【００４４】
シングルチップマイクロコンピュータ１の機能ブロックは、内部バス１２によって相互に接続さる。内部バス１２はアドレスバス、データバス、及びコントロールバスから成る。コントロールバスは、リード信号・ライト信号・バスサイズ信号をエンコードしたバスコマンド等を伝達する。
【００４５】
上記機能ブロック若しくはモジュールは内部バス１２を介して、ＣＰＵ２によってリード／ライトさる。内部バス１２のデータバス幅は、例えば３２ビットとする。内蔵ＲＯＭ５、ＲＡＭ６は１ステートでリード／ライト可能とされる。尚、バスコントローラ３、割込みコントローラ４、タイマ７、ＳＣＩ８、Ａ／Ｄ変換器９、入出力ポート１０Ａ〜１０Ｉ、及びＣＰＧ１１が有する制御レジスタを総称して、内部Ｉ／Ｏレジスタと呼ぶ。
【００４６】
前記バスコントローラ（ＢＳＣ）３は、ＣＰＵ２からバスコマンドＢＣＭＤ、アドレスバスＩＡＢからアドレス信号を入力して、所要のバス制御を行う。アドレスバスＩＡＢで指定されるアドレスに対して、それぞれ固有若しくは選択されたバス幅、アクセスステート数が与えられるので、これに対応して、ＣＰＵ２が要求した命令リードまたはデータリード／ライトを実現する。このとき、ＣＰＵ２が要求した命令リードまたはデータリード／ライト（バスコマンド）に対する応答信号して、レディ信号ｒｅａｄｙを返す。即ち、レディ信号ｒｅａｄｙが非活性の場合は、ＣＰＵ２はウェイトされる。
【００４７】
前記バスコントローラ３は、内部Ｉ／Ｏレジスタとして、制御ビットｂｍｏｄｅ１６を持つ。ｂｍｏｄｅ１６＝０のとき、３２ビット命令フェッチモード、ｂｍｏｄｅ１６＝１のとき、１６ビット命令フェッチモードであり、制御信号ｂｍｏｄｅ１６がＣＰＵ２に与えられる。制御ビットｂｍｏｄｅ１６は、リセット後に０にクリアされるようにする。３２ビット命令フェッチモードにおいて、１６ビットバスで接続されたメモリをリードしても、分岐命令や割込みなどでプログラムの流れを変えなければ、無駄は生じない。通常、リセット後には割込みはマスク或は禁止されているため、初期化処理に先立って、前記制御ビットｂｍｏｄｅ１６を設定すればよい。
【００４８】
上記シングルチップマイクロコンピュータ１にリセット信号ＲＥＳが与えられると、ＣＰＵ２を始めとし、シングルチップマイクロコンピュータ１はリセット状態になる。このリセットが解除されると、ＣＰＵ２は所定のアドレス（リセットベクタ）からスタートアドレスをリードして、このスタートアドレスから命令のリードを開始するリセット例外処理を行う。この後、ＣＰＵ２は逐次、ＲＯＭ５などから命令をリードし、解読して、その解読内容に基づいてデータの処理或はＲＡＭ５、タイマ７、ＳＣＩ８、入出力ポート１０Ａ〜１０Ｉ等とのデータ転送を行う。
【００４９】
タイマ７、ＳＣＩ８、外部信号などの状態を割込み信号として、ＣＰＵ２に伝達することができる。即ち、割込信号１３は、Ａ／Ｄ変換器９、タイマ７、ＳＣＩ８、入出力ポート１０Ａ〜１０Ｉの所定の回路が出力し、割込コントローラ４はその割込信号１３を入力して、所定のレジスタなどの指定に基づいて、ＣＰＵ２に割込要求信号ｉｎｔｆと受付けた割込みに対応したベクタｖｅｃを与える。割込要因が発生すると、ＣＰＵ２割込要求が発生され、ＣＰＵ２は実行中の処理を中断して、例外処理状態を経て、前記ベクタｖｅｃに対応したアドレスから、分岐先アドレスをリードして、所定の処理ルーチンに分岐し、所望の処理を行い、割込要因をクリアしたりする。所定の処理ルーチンの最後には、通常復帰命令が置かれ、この命令を実行することによって前記中断した処理を再開する。
【００５０】
図３にはＣＰＵ２に内蔵されている汎用レジスタ及び制御レジスタの構成例（プログラミングモデル）が示される。
【００５１】
ＣＰＵ２は、３２ビット長の８本の汎用レジスタＥＲ０〜ＥＲ７を持っている。汎用レジスタＥＲ０〜ＥＲ７は、全て同じ機能を持っており、アドレスレジスタとしてもデータレジスタとしても使用することができる。
【００５２】
データレジスタとしては３２ビット、１６ビットおよび８ビットレジスタとして使用きる。アドレスレジスタおよび３２ビットレジスタとしては、一括して汎用レジスタＥＲ（ＥＲ０〜ＥＲ７）として使用する。１６ビットレジスタとしては、汎用レジスタＥＲを分割して汎用レジスタＥ（Ｅ０〜Ｅ７）、汎用レジスタＲ（Ｒ０〜Ｒ７）として使用する。これらは同等の機能を持っており、１６ビットジスタを最大１６本まで使用することができる。８ビットレジスタとしては、汎用レジスタＲを分割して汎用レジスタＲＨ（Ｒ０Ｈ〜Ｒ７Ｈ）、汎用レジスタＲＬ（Ｒ０Ｌ〜Ｒ７Ｌ）として使用する。これらは同等の機能を持っており、８ビットレジスタを最大１６本まで使用することができる。各レジスタ独立に使用方法を選択することができる。
【００５３】
汎用レジスタＥＲ７には、汎用レジスタとしての機能に加えて、スタックポインタ（ＳＰ）としての機能が割り当てられており、例外処理やサブルーチン分岐などで暗黙的に使用される。例外処理は前記割込み処理を含む。
【００５４】
プログラムカウンタＰＣは３２ビットのカウンタで、ＣＰＵ２が実行中の命令のアドレスを示す。特に制限されないもののＣＰＵ２の命令は、全て２バイト（ワード）を単位としているため、最下位ビットは無効であり、命令リード時には最下位ビットは０とみなされる。
【００５５】
コンディションコードレジスタＣＣＲは８ビットのレジスタで、ＣＰＵ２の内部状態を示している。割込みマスクビット（Ｉ）とハーフキャリ（Ｈ）、ネガティブ（Ｎ）、ゼロ（Ｚ）、オーバフロー（Ｖ）、キャリ（Ｃ）の各フラグを含む８ビットで構成されている。
【００５６】
ベクタベースレジスタＶＢＲは３２ビットのレジスタで、下位１２ビットは０とされ、上位２０ビットが例外処理ベクタ等とされる。
【００５７】
図４にはＣＰＵのアドレス空間が例示される。ＣＰＵ２のアドレス空間は４ギガ（Ｇ）バイトあり、８つのエリアに分割されている。これらのエリアは、バスコントローラ３の設定によって、独立して、バス幅、アクセスステート数を設定可能にされている。
【００５８】
一方、マイクロコンピュータ２内部のＲＯＭ５、ＲＡＭ６、内部Ｉ／Ｏレジスタは、前記バスコントローラ３の設定にかかわらず、固有のバス幅、アクセスステート数で動作する。前記の通り、内蔵ＲＯＭ５、ＲＡＭ６は、３２ビットバスで接続され、１ステートでリード／ライトを行う。かかるアドレス空間やエリアの設定については、特開平５−３０７５１９号などに記載されている。
【００５９】
また、図４には、バスモードの切替えの好適な例が示される。１６ビットバスで接続され、２ステートでアクセス可能な外部ＲＯＭ５が、エリア１に接続されている場合の例である。内蔵ＲＯＭ５上でプログラムを実行している場合、３２ビットバスで接続されているため、３２ビットモードで動作すればよく、ｂｍｏｄｅ１６＝０とし、命令リードをロングワード単位で行う。単位リードサイクルでロングワード（２ワード）の命令をリードできるので、後の命令を実行しないことになっても、無駄は生じない。内蔵ＲＯＭ５上の分岐命令によって、外部ＲＯＭに分岐し、外部ＲＯＭ上のプログラム実行によって前記制御ビットｂｍｏｄｅ１６を１にセットする。以降、命令リードをワード単位で行う。
【００６０】
制御ビットｂｍｏｄｅ１６＝０であっても、分岐命令や割込みなどプログラムの流れを変えなければ、無駄は生じないので、制御ビットｂｍｏｄｅ１６の切替えは、外部ＲＯＭに分岐してから行えばよい。割込みが発生する可能性があり、割込み応答時間の増加が許容できない場合には、外部ＲＯＭへの分岐の直前に、制御ビットｂｍｏｄｅ１６を１にセットすればよい。
【００６１】
外部ＲＯＭから内蔵ＲＯＭ５へ分岐する場合は逆の動作を行えばよい。
【００６２】
図４では、内蔵ＲＯＭ５上のプログラム実行後、外部ＲＯＭへ分岐し、外部ＲＯＭのプログラム実行後、内蔵ＲＯＭ５に分岐するように表記しているが、分岐は随時行うことができる。メインプログラムを外部ＲＯＭに配置し、高速処理が必要なサブルーチンプログラム（関数）を内蔵ＲＯＭ５に配置して、外部ＲＯＭと内蔵ＲＯＭ５の間を随時、サブルーチン分岐／サブルーチンリターンすればよい。高速処理が必要なサブルーチンプログラム（関数）を内蔵ＲＡＭ６に配置することも可能である。また、内蔵ＲＡＭ、外部ＲＡＭにおいても同様の動作が可能となる。
【００６３】
図５にはＣＰＵ２の機械語の命令フォーマットの一例が示される。ＣＰＵ２の命令は、２バイト（ワード）を単位にしている。各命令はオペレーションフィード（ｏｐ）、レジスタフィールド（ｒ）、ＥＡ拡張部（ＥＡ）、およびコンディションフィールド（ｃｃ）を含む。
【００６４】
オペレーションフィールド（ｏｐ）は、命令の機能を表し、アドレッシングモードの指定オペランドの処理内容を指定する。命令の先頭４ビットを必ず含む。２つのオペレーションフィールドを持つ場合もある。
【００６５】
レジスタフィールド（ｒ）は汎用レジスタを指定する。レジスタフィールド（ｒ）はアドレスレジスタのとき３ビット、データレジスタのとき３ビット（３２ビットレジスタ）または４ビット（８または１６ビットレジスタ）である。２つのレジスタフィールドを持つ場合、またはレジスタフィールドを持たない場合もある。
【００６６】
ＥＡ拡張部（ＥＡ）は、イミディエイトデータ、絶対アドレスまたはディスプレースメントを指定する。８ビット、１６ビット、または３２ビットである。コンディションフィールド（ｃｃ）は条件分岐命令（Ｂｃｃ命令）の分岐条件を指定する。
【００６７】
図６には本発明の命令フォーマットの例（後述する命令）を示す。
【００６８】
［ＭＯＶ命令］
ＭＯＶ．Ｗ  ＠ｒｓ，ｒｄは、１ワードの命令で、ビット６〜４でアドレスレジスタ（ｒｓ）を、ビット３〜０でデータレジスタ（ｒｄ）を指定する。ＭＯＶ．Ｗ  ＠ａａ：１６，ｒｄは、２ワードの命令で、第１ワードのビット３〜０でデータレジスタ（ｒｄ）を指定し、第２ワードに絶対アドレス（ａａ）を含む。
【００６９】
［ＪＭＰ命令］
ＪＭＰ  ＠ａａ：３２は、３ワードの命令で、第２、第３ワードに絶対アドレス（ａａ）を含む。
【００７０】
［通常分岐命令／遅延分岐命令］
通常分岐命令ＢＲＡ  ｄ：８、遅延分岐命令ＢＲＡ／Ｓ  ｄ：８は、１ワードの命令で、ビット６〜１でディスプレースメント（ｄ）を指定する。ディスプレースメント（ｄ）は最下位ビットを０とし、上位を符号拡張して使用される。命令コードのビット０が０のとき、通常分岐命令とされ、命令コードのビット０が１のとき、遅延分岐命令とされる。
【００７１】
［シフト命令］
ＳＨＬＬ．Ｌ  ＃ｘｘ，ｒｄは、１ワードの命令で、ビット８〜４でシフトビット数を示すイミディエイト（ｘｘ）を、ビット３〜０でデスティネーションレジスタ（ｒｄ）を指定する。
【００７２】
［乗算命令］
１６ビット×１６ビットで積の下位１６ビットを得る命令ＭＵＬＵ．Ｗ  ｒｓ，ｒｄ、３２ビット×３２ビットで積の下位３２ビットを得る命令ＭＵＬＵ．Ｌ  ｒｓ，ｒｄ、３２ビット×３２ビットで積の上位３２ビットを得る命令ＭＵＬＵ／ＵＰ．Ｌ  ｒｓ，ｒｄ、は、夫々１ワードの命令で、ビット７〜４でソースレジスタ（ｒｓ）を、ビット３〜０でデスティネーションレジスタ（ｒｄ）を指定する。同様に、ソースレジスタの代わりにイミディエイト４ビットを乗数として使用する、ＭＵＬＵ．Ｗ  ＃ｘ：４，ｒｄ、ＭＵＬＵ．Ｌ  ＃ｘ：４，ｒｄ、ＭＵＬＵ／ＵＰ．Ｌ  ＃ｘ：４，ｒｄ、は、１ワードの命令で、ビット７〜４でイミディエイトデータ（ｘｘ）を、ビット３〜０でデスティネーションレジスタ（ｒｄ）を指定する。
【００７３】
図１にはＣＰＵ２の詳細な一例が示される。ＣＰＵ２は制御部（ＣＮＴ）２Ａと実行部（ＥＸＥＣ）２Ｂを有する。制御部２Ａは、命令バッファ部ＩＢＵＦ、命令変更部ＣＨＧ、命令デコーダＤＥＣ、レジスタセレクタＲＥＳＬ、割込み制御部ＩＮＴＣを含む。
【００７４】
前記レディ信号ｒｅａｄｙは、ＣＰＵ２が要求した命令リードまたはデータリード／ライト（バスコマンド）に対する、バスコントローラ３からの応答信号であり、ＣＰＵ２の状態遷移のイネーブル信号とされる。
【００７５】
前記命令バッファ部ＩＢＵＦは、リードした命令を一旦格納する回路であって、８ワード分のＦＩＦＯバッファＦＢと２ワード分の命令レジスタＩＲを持つ。命令レジスタＩＲは、分岐命令時に使用する。命令デコーダＤＥＣから初期化信号ｃｌｒＦＩＦＯを入力する。
【００７６】
実行すべき命令は、前記命令バッファ部ＩＢＵＦから命令デコーダＤＥＣに出力される。命令リード直後に実行する場合には、命令バッファ部ＩＢＵＦのＦＩＦＯバッファＦＢを使用せず、直接データバスＩＤＢからの入力が命令デコーダＤＥＣに供給される。
【００７７】
前記命令変更部ＣＨＧは、リードした命令以外の命令コードを、命令デコーダＤＥＣに与える場合に動作し、そのほかの場合は、命令バッファ部ＩＢＵＦの内容を命令デコーダＤＥＣに与える。リードした命令以外の命令コードは、割込み制御部ＩＮＴＣの指示によって、割込みなどの例外処理を実行するとき、などに用いる。
【００７８】
割込み制御部ＩＮＴＣは、図２の割込みコントローラ４の出力する割込み要求信号ｉｎｔｆを受付ける。また、命令デコーダＤＥＣの出力する割込みマスク信号（図示せず）を参照して、割込みがマスクされていなければ、命令変更部ＣＨＧに制御信号ｉｎｔｒｑによって、割込みを指示する。後述の遅延分岐と遅延スロット命令の間、複数ビットシフト命令実行時は割り込みを禁止する。割り込み例外処理を実行する信号ｃｈｇ＿ｉｎｔの論理記述は、
ａｓｓｉｇｎ  ｃｈｇ＿ｉｎｔ＝ｉｎｔｒｑ  ＆  〜（｜ｓｆｔｃｎｔ）  ＆  〜ｍｏｄ＿ｄｂである。ここで、｜ｓｆｔｃｎｔはｓｆｔｃｎｔの全ビットの論理和、＆は論理積記号、〜は反転記号である。制御信号ｓｆｔｃｎｔ、修飾信号ｍｏｄ＿ｄｂの論理記述については後述する。
【００７９】
命令デコーダＤＥＣは、例えば、マイクロＲＯＭ或はＰＬＡ（Ｐｒｏｇｒａｍｍａｂｌｅ Ｌｏｇｉｃ Ａｒｒａｙ）または布線論理で構成され、制御信号を出力する。制御信号は第１乃至第３の３種類に大別され、それぞれ、有効となるタイミングが異なる。第１の制御信号（制御信号Ａ）は当該ステートで有効になる。第２の制御信号（制御信号Ｂ）は次のステートで、第３の制御信号（制御信号Ｃ）は次のステートで、それぞれ有効になる。
【００８０】
命令デコーダＤＥＣの出力の一部（第２の制御信号）が命令デコーダＤＥＣにフィードバックされている。これは各命令コード内の遷移に用いるステージコード（ｔｍｇ）と複数ビットシフト制御信号ｓｆｔｃｎｔ、遅延スロットを示す修飾信号ｍｏｄ＿ｄｂを含む。
【００８１】
ＣＰＵ２には、バスモードを示す信号ｂｍｏｄｅ１６が与えられる。この信号はフリップフロップＦＦに入力され、その出力信号ｍｏｄｅ１６は命令デコーダＤＥＣに供給される。
【００８２】
命令デコーダＤＥＣは、実行シーケンスの制御部ＳＣＮＴ、バスアクセスの制御（バスコマンドＢＣＭＤ：第１の制御信号）部ＢＣＮＴと実行部の制御部ＥＣＮＴなどを有する。バスアクセスの制御部ＢＣＮＴの命令リードに関する論理記述は概略以下のようにできる。即ち実行シーケンスの制御部ＳＣＮＴで命令フェッチを示す制御信号ｉｆ又はｉｆｗを活性状態にしたとき、図７の論理記述（ケース文）に従って、バスコマンドが与えられる。図７の論理記述は、ＲＴＬ（Register Transfer Level）若しくはＨＤＬ（Hardware Description Language）記述と呼ばれ、公知の論理合成ツールによって、論理回路に論理展開できる。ＨＤＬはＩＥＥＥ１３６４として標準化されている。これに示される論理記述の構文は、ケース（ｃａｓｅ）文に準拠しており、ａｌｗａｙｓ＠の次の（）内で定義された値若しくは信号に変化が有ったとき、それ以下の記述行の処理を行う、という記述内容になっている。「４’ｂ１０００」は４ビット長のバイナリコード１０００を意味する。制御信号ｉｆはロングワードまたはワードの命令リードを示す。制御信号ｉｆｗは強制的なワードの命令リードを意味する。`ｌｏｎｇｒｅａｄ、`ｗｏｒｄｒｅａｄは別に定義された定数である。ｉａｂ１はアドレスバスＩＡＢのビット１である。命令はワード（１６ビット）単位であり、必ず、偶数番地に配置されるから、ｉａｂ１＝０のときは、４の倍数番地であり、ロングワードアクセスが１回で実行可能であることになる。即ち、命令フェッチのとき、１６ビットバスモードでなく、４の倍数番地であれば、バスコマンドＢＣＭＤを、ロングワードリード`ｌｏｎｇｒｅａｄにする。命令フェッチで、１６ビットバスモードか、４の倍数番地でないとき、バスコマンドＢＣＭＤを、ワードリード`ｗｏｒｄｒｅａｄにする。
【００８３】
図８には同様に、後述のインクリメンタＩＮＣによるプリフェッチカウンタｐｆｃの制御内容が論理記述で示される。`ｉｎｃ４、`ｉｎｃ２は別に定義された定数である。
【００８４】
入力（条件）はＢＣＭＤと同様であり、ロングワードで命令リードを行ったとき、制御信号ｃ＿ｉｎｃは＋４を意味する`ｉｎｃ４状態になる。ワードで命令リードを行ったとき、制御信号ｃ＿ｉｎｃは＋２を意味する`ｉｎｃ２状態になる。
【００８５】
特に制限はされないものの、制御信号ｉｆｗの場合は、分岐が行われることを前提にし、プリフェッチカウンタｐｆｃのインクリメントを行わないものとする。ここで、前記図７及び図８の論理記述（ケース文）の入力（条件）は適宜増やすことができ、例えば、ポストインクリメントレジスタ間接のアドレッシングモードによるデータアクセス時と共通化できる。データサイズによって、＋１／＋２／＋４を選択する制御を、含めればよい。例えば、ポストインクリメントレジスタ間接の実行を示す制御信号ｐｓｔｉｎｃとデータサイズを示す制御信号ｓｉｚｅ（バイト：０１、ワード：１０、ロングワード：１１）を用いて、図９の論理記述のようにすればよい。
【００８６】
シフタの制御は、第１のシフタの制御、第２のシフタの制御、制御信号ｓｆｔｃｎｔの出力を含む。複数ビットシフト命令は、最大３ステート（Ｓ１〜Ｓ３）で実行されるが、第１ステート（Ｓ１）では、命令コード上のシフトビットフィールドを参照してシフトを行う。第２、第３ステート（Ｓ２、Ｓ３）は、制御信号Ｂであるｓｆｔｃｎｔを参照する。
【００８７】
第１のシフタの制御は図１０に例示される論理記述に従って実現することができる。ここでｏｐｃｏｄｅは、命令デコーダＤＥＣに入力されている命令コード（１６ビット）である。図１０において`Ｓ１、`Ｓ２は複数ビットシフト命令の第１、第２ステートを示す別に定義された定数または制御信号である。即ち、第１のシフタの制御は、第１ステート（Ｓ１）では、１ビットまたは２ビットまたはシフトなしを、この順序で判定して制御信号ｓｆｔ１、ｓｆｔ２を生成する。第１ステートで１ビットシフトを実行した場合で、第２ステート（Ｓ２）で、２ビットシフトが必要であれば、２ビットの制御信号ｓｆｔ２を生成する。
【００８８】
同様に、第２のシフタの制御は図１１に例示される論理記述に従って実現することができる。制御信号ｓｆｔｃｎｔの機能は、上位３ビットと下位２ビットに分けて、図１２に例示された論理記述で特定することができる。ｓｆｔｃｎｔが全ビット０となったとき、終了と判定される。
【００８９】
レジスタセレクタＲＥＳＬは、命令デコーダＤＥＣの指示と、命令コード中に含まれるレジスタフィールドの情報に基づいて、レジスタ選択信号ｒｄｇｂ［ｎ］、ｗｂｒｄ［ｎ］などを出力し、汎用レジスタの入出力を制御する。［ｎ］は汎用レジスタに対応した０〜７の番号を意味する。
【００９０】
実行部２Ｂには、汎用レジスタＥＲ０〜ＥＲ７、プログラムカウンタＰＣ、プリフェッチカウンタｐｆｃ、コンディションコードレジスタＣＣＲ、テンポラリレジスタＴＲ、算術論理演算器ＡＬＵ、インクリメンタＩＮＣ、リードデータバッファＤＢＲ、ライトデータバッファＤＢＷ、アドレスバッファＡＢ、乗算器ＭＵＬＴを含む。これらのブロックは内部バスａｂ、ｇｂ、ｄｂ、ｗｂ１、ｗｂ２によって相互に接続されている。
【００９１】
算術論理演算器ＡＬＵは、命令によって指定される各種の演算や実効アドレスの計算などに用いる。インクリメンタＩＮＣは、主にプログラムカウンタＰＣの加算に用いられる。インクリメンタＩＮＣには、前記の通り、制御信号ｃ＿ｉｎｃによって、プリフェッチカウンタｐｆｃに対する＋１／＋２／＋４の指示が与えられる。
【００９２】
図３に示される汎用レジスタＥＲ０〜ＥＲ７、プログラムカウンタＰＣ、コンディションコードレジスタＣＣＲ以外は、プログラミング上は参照できず、マイクロコンピュータ１内部の動作にのみ用いられる。即ち、リードデータバッファＤＢＲ、ライトデータバッファＤＢＷ、アドレスバッファＡＢなどは、内部アドレスバスＩＡＢ及び内部データバスＩＤＢとのインタフェースをとるために、一時的にデータをラッチしたり、バッファリングしたりする。テンポラリレジスタＴＲは、マイクロコンピュータ１内部の動作に適宜用いられる。前記内部アドレスバスＩＡＢ及び内部データバスＩＤＢは前記内部バス１２に含まれる。
【００９３】
リードデータバッファＤＢＲは、ＲＯＭ５、ＲＡＭ６、内部Ｉ／Ｏレジスタ、或は図示はされない外部メモリから、リードしたデータを一時的に格納する。ライトデータバッファＤＢＷはＲＯＭ５、ＲＡＭ６、内部Ｉ／Ｏレジスタ、或は外部メモリへのライトデータをバッファリングする。アドレスバッファＡＢは、ＣＰＵ２がリード／ライトするアドレスを一時的に格納するほか、ベクタや分岐テーブルリードアドレスを生成する。アドレスバッファＡＢは、割込みコントローラから入力されたベクタ、および内部バスａｂから情報を入力して、アドレスバスＩＡＢにアドレス出力を行う。通常は、内部バスａｂの内容が選択される。乗算器ＭＵＬＴは、命令デコーダＤＥＣから制御信号、内部バスｇｂ、ｄｂからデータを入力し、乗算結果を内部バスｗｂ２に出力する。
【００９４】
図１３には前記命令バッファ部ＩＢＵＦの詳細が例示される。命令バッファ部ＩＢＵＦは、命令コードを保持する為に第１の保持手段としてのＦＩＦＯバッファＦＢと第２の保持手段である命令レジスタＩＲを有する。
【００９５】
前記命令レジスタＩＲはＩＤＢＬに接続する下位側命令レジスタＩＲＬ、ＩＤＢＨに接続する上位側命令レジスタＩＲＨから構成される。ＩＲ／ＷはＩＲＨが有効であることを示すためのワードイネーブルレジスタ、ＩＲ／ＬはＩＲＨ、ＩＲＬの双方が有効であることを示すためのロングワードイネーブルレジスタである。
【００９６】
前記ＦＩＦＯバッファＦＢは、特に制限されないが、１６ビット×８段の記憶エリアＢＵＦ０〜ＢＵＦ７を有する。記憶エリアＢＵＦ０〜ＢＵＦ７には内部データバスＩＤＢ上の命令又は前記命令レジスタＩＲからの命令を格納可能にされる。ＩＤＢＨは上位１６ビット、ＩＤＢＬは下位１６ビットを意味する。ＴＬＰはデータが格納されている後尾の記憶エリアを指す２ビットの後尾ポインタ（リードポインタ）、ＨＤＰはデータが格納されている先頭の記憶エリアを指す２ビットの先頭ポインタ（ライトポインタ）、ＮＢＰはＦＩＦＯバッファＦＢに格納されているデータ数を計数するデータ数ポインタである。記憶エリアに格納すべき命令コードの入力経路は信号ＩＲＨｅｎｂ、ＩＲＬｅｎｂ、Ｈｅｎｂ、Ｌｅｎｂによって選択される。信号ＩＲＨｅｎｂはＩＲＨからの入力を選択指示し、ＩＲＬｅｎｂはＩＲＬからの入力を選択指示し、ＨｅｎｂはＩＤＢＨからの入力を選択し、ＬｅｎｂはＩＤＢＬからの入力を選択指示する。前記記憶エリアＢＵＦ０〜ＢＵＦ７の出力に対する選択はマルチプレクサＭＵＸが行なう。マルチプレクサＭＵＸは後尾ポインタＴＬＰが指す記憶エリアのデータをｏｕｔ０に、後尾ポインタＴＬＰが指す次の記憶エリアのデータをｏｕｔ１に、後尾ポインタＴＬＰから３番目の記憶エリアのデータをｏｕｔ２に出力する。
【００９７】
前記出力ｏｕｔ０、ＩＤＢＬ，ＩＤＢＨ、ＩＲＨ，ＩＲＬはセレクタＩＳＥＬによって選択されたものが出力ｒｓｌｔ０とされ、変更回路ＣＨＧを経て命令デコーダＤＥＣに供給される。前記出力ｏｕｔ１はｒｓｌｔ１、前記出力ｏｕｔ２はｒｓｌｔ２として、実効アドレス等の演算に供される。
【００９８】
バッファ制御回路ＦＣＮＴは前記命令バッファ部ＩＢＵＦを全体的に制御する。ｃｌｋはクロック信号、ｒｓｔはリセット信号である。ＬＩＲ／Ｗはワード長読み出し指示信号、ＬＩＲ／Ｌロングワード長読み出し指示信号、ＬＩＤは命令実行完了信号、ＬＩＤ＿ＮＵＭは実行完了した命令のワード長を示すデータ、ｓｔｋＩＲは内部データバスＩＤＢの命令を命令レジスタＩＲに退避することを指示する信号、ｐｆｂ（ｃｌｒＦＩＦＯと等価）は分岐することを示す信号である。前記信号ｓｔｋＩＲは遅延分岐命令実行中に分岐先命令が内部データバスＩＤＢに出力されたとき論理値“１”に活性化される。バッファ制御回路ＦＣＮＴは、ｓｔｋＩＲが活性化されると、内部データバスＩＤＢの命令を命令レジスタＩＲに退避する。その後、信号ｐｆｂが活性化されるとＦＩＦＯバッファＦＢをクリアする。ＦＩＦＯバッファＦＢのクリアはポインタＴＩＰとＨＤＰを初期値にリセットすることで行われる。前記信号ＬＩＲ／Ｗ、ＬＩＲ／Ｌ、ＬＩＤ、ＬＩＤ＿ＮＵＭ、ｓｔｋＩＲ、ｐｆｂは命令デコーダＤＥＣから出力される。
【００９９】
上記命令バッファ部ＩＢＵＦにおいて、遅延分岐命令での分岐先命令は、一旦、レジスタＩＲに保持される。遅延スロット命令の終了時に、ＦＩＦＯバッファＦＢのクリアが行われる。このとき、分岐アドレスは一旦、一時的なレジスタ手段例えばテンポラリレジスタＴＲに保持し、プリフェッチカウンタｐｆｃの値を保存するようにし、遅延スロットの命令の命令コード長が長い場合も、プリフェッチカウンタｐｆｃに基づいて、継続して命令リードを行うことができるようにしている。遅延スロットの命令は複数ステートでよいようにする。遅延スロットに配置する命令を増やし、遅延分岐を利用し易くし、使い勝手を向上し、資源の利用効率を向上するとともに、高速化を実現できる。
【０１００】
パイプラインの乱れを抑止する課題とは別に、分岐時に分岐命令リードのレイテンシを隠蔽する意味で、複数ステートで実行する命令を遅延スロットに配置することによって、実行ステート数を短縮することができる。
【０１０１】
遅延スロットに配置された命令では、自命令の命令コードのリードデータを待つステートや実効アドレス計算のためのステートは命令リードを抑止することにより、利用されない命令リード（プリフェッチ）を抑止できる。ウェイトが挿入されたりして、実行ステート数が増加することを回避することができる。
【０１０２】
図１４には算術論理演算器ＡＬＵの詳細が例示される。ここでは、算術演算器２０、シフタ２１及び出力セレクタ２２を示すが、そのほかに、図示はされない、論理演算や、ビット操作命令用などの付加的な機能を含むことは妨げられない。
【０１０３】
算術演算器２０は内部バスｇｂ、ｄｂに入力が接続され、シフタ２１は内部バスｇｂに入力が接続される。算術演算器２０による演算結果とシフタ２１による演算結果は出力セレクタ２２で選択されて、内部バスｗｂ２、必要に応じて内部バスａｂに出力される。
【０１０４】
前記算術演算器２０は、入力セレクタ２５とフルアダー２６からなる。入力セレクタ２５は、内部バスｄｂの入力とキャリ入力を反転する。公知の通り、減算を２の補数の加算として実行するためである。
【０１０５】
前記シフタ２１は第１シフタ２７及び第２のシフタ２８から成り、内部バスｇｂと、制御信号ｓｆｔｌ、ｓｆｔｒ、ｓｆｔ１、ｓｆｔ２、ｓｆｔ４、ｓｆｔ８、ｓｆｔ１６を入力し、結果を、出力セレクタ２２を介して、内部バスｗｂ２に出力する。ｓｆｔｌは左シフト、ｓｆｔｒは右シフト、ｓｆｔ１は１ビットシフト、ｓｆｔ２は２ビットシフト、ｓｆｔ４は４ビットシフト、ｓｆｔ８は８ビットシフト、ｓｆｔ１６は１６ビットシフト、を夫々指示する制御信号とされる。
【０１０６】
第１のシフタ２７の論理記述は図１５に例示される。この論理記述によれば、制御信号ｓｆｔ１、ｓｆｔ２が何れも非活性の場合はシフトを行わない。そのほかの場合は、制御信号ｓｆｔｌ、ｓｆｔｒ、ｓｆｔ１，ｓｆｔ２の組合せで１または２ビットの左右シフトを行う。
【０１０７】
同様に、第２のシフタ２８の論理記述は図１６に例示される。
【０１０８】
シフタ２１の図１５及び図１６の論理記述において、例えば、制御信号ｓｆｔｌ＝１、ｓｆｔ１＝１、ｓｆｔ４＝１、ｓｆｔｒ＝０、ｓｆｔ２＝０、ｓｆｔ８＝０、ｓｆｔ１６＝０の場合は、第１シフタ２７及び第２のシフタ２８により左５ビットシフトが行われる。
【０１０９】
上記論理記述では、第１シフタ２７、第２シフタ２８に複数のシフトビットの指定が行われないように、その制御部が構成されているものとする。或いは、第１シフタ２７、第２シフタ２８の論理記述に優先順位を付けて、これに対応して制御部の論理を構成してもよい。
【０１１０】
また、シフタの論理記述においてシフトの記述を演算子「＜＜」などを使用しないで記述することもできる。例えば、第２シフタ２８の第１ケース、第２ケースを図１７に例示されるように記述してもよい。そのほか、算術シフトやローテートなどを含んだり、バイトサイズ、ワードサイズのシフトを行ったりする場合も適宜、変更が可能である。
【０１１１】
前記出力セレクタ２２は、制御信号ｓｆｔｌまたはｓｆｔｒの何れかが活性状態の場合には、シフタの出力を選択するようにする。
【０１１２】
算術演算器２０の場合は、桁上がりがあるのに加えて、減算の場合に、一方の入力を反転するなどの処理も必要であって、論理段数が多くなってしまうから、第１シフタ２７及び第２のシフタ２８を直列に配置しても、算術演算の遅延より大きくはならず、最大動作周波数向上の制約にはなり難い。バレルシフタが左右６４選択のセレクタ回路を要するところ、シフタ２１では、シフトしない選択も含めて、第１シフタ２７が５選択のセレクタ回路、第２シフタ２８が７選択のセレクタ回路を採用すればよく、これによって論理規模も格段に縮小することができる。  
【０１１３】
図１８には前記乗算器ＭＵＬＴの詳細が例示される。ＭＵＬは１６ビット×１６ビットの演算を行なう並列乗算回路、ｒｅｇ１，ｒｅｇ２は部分積を一時的に格納するデータレジスタ、ＡＤＤは加算回路、ＭＡＣ（ＭＡＣＨ，ＭＡＣＬ）は乗算結果が累積される積和回路（Multiply And Accumulate）、ｒｅｇｃは出力データレジスタ、ＭＵＸはマルチプレクサである。データａは内部バスｇｂへ、データｂは内部バスｄｂへ供給され、データｃは内部バスｗｂ２に供給される。乗算器ＭＵＬＴは状態遷移制御によりその演算動作が制御される。状態遷移制御ロジックは図示を省略するが、乗算器ＭＵＬＴに設けられている。
【０１１４】
図１９には図１８の乗算器ＭＵＬＴにおける乗算演算制御の状態遷移図が例示される。状態（ステート）はｔｍｇ＝０乃至ｔｍｇ＝８とされる。
【０１１５】
ｔｍｇ＝０は待機状態（ノン・オペレーション）とされる。乗算器ＭＵＬＴは制御部２Ａから演算要求が無い限り演算を開始しない。演算要求は制御信号ｓｔａｒｔ＝１で可能になる。ｓｔａｒｔ＝１と同時に演算種類を選択する信号が活性化されることで、ｔｍｇが各種演算種類に応じた値に更新可能にされて、演算が開始される。３２ビット乗算を示す制御信号ｍｕｌ＿ｌｏｎｇ＝１のとき、ｔｍｇ＝１に遷移し、そのほかのときｔｍｇ＝８に遷移する。
【０１１６】
ｔｍｇ＝１では、ａ[１５：０]×ｂ［１５：０］を演算し、その結果をレジスタｒｅｇ２に格納する動作が行われる。演算が符号付きのときは図示はされない制御信号ｓｉｇｎ＝１、符号無しのときは制御信号ｓｉｇｎ＝０とする。ａ[１５：０]はデータａの下位側１６ビットを意味する。
【０１１７】
ｔｍｇ＝２では、ａ[３１：１６]×ｂ［１５：０］を演算し、その結果をレジスタｒｅｇ１に格納する動作が行われる。演算が符号付きのときは制御信号ｓｉｇｎ＝１、符号無しのときは制御信号ｓｉｇｎ＝０とする。ここで、３２ビット×３２ビットによる上位３２ビットが必要なときは図示はされない制御信号ｕｐｐｅｒ＝１とし、３２ビット×３２ビットによる下位３２ビットが必要なときは制御信号ｕｐｐｅｒ＝０とする。次のステートは、ｕｐｐｅｒ＝１のときはｔｍｇ＝３、ｕｐｐｅｒ＝０のときはｔｍｇ＝６になる。
【０１１８】
ｔｍｇ＝３では、｛１６‘ｈ００００，ｒｅｇ２[３１：１６]｝＋ｒｅｇ１を演算し、その結果をｒｅｇ２に格納し、ａ[１５：０]×ｂ［３１：１６］を演算し、その結果をレジスタｒｅｇ1に格納する。演算が符号付きのときは制御信号ｓｉｇｎ＝１、符号無しのときは制御信号ｓｉｇｎ＝０とする。次のステートはｔｍｇ４となる。｛１６‘ｈ００００，ｒｅｇ２[３１：１６]｝は上位側１６ビットが００００、下位側がｒｅｇ２[３１：１６]の３２ビットデータであることを意味する。
【０１１９】
ｔｍｇ＝４では、ｒｅｇ２＋ｒｅｇ１を演算し、その結果をｒｅｇ２に格納し、ａ[３１：１６]×ｂ［３１：１６］を演算し、その結果をレジスタｒｅｇ1に格納する。次のステートはｔｍｇ５となる。演算が符号付きのときは制御信号ｓｉｇｎ＝１、符号無しのときは制御信号ｓｉｇｎ＝０とする。
【０１２０】
ｔｍｇ＝５では、制御信号ｓｉｇｎ＝１のとき、｛１６｛ｒｅｇ２［１５］｝，ｒｅｇ２[１５：０]｝＋ｒｅｇ１を演算し、その結果をレジスタｒｅｇｃに保持し、制御信号ｓｉｇｎ＝０のとき、｛１６‘ｈ００００，ｒｅｇ２［１５：０］｝＋ｒｅｇ１を演算し、その結果をレジスタｒｅｇｃが保持する。演算が符号付きのときは制御信号ｓｉｇｎ＝１、符号無しのときはフラグｓｉｇｎ＝０とする。制御信号ｓｔａｒｔ＝１のとき，ｔｍｇ＝０のときの状態遷移図にしたがってｔｍｇが更新され、次の演算が実行される。次のステートでレジスタｒｅｇｃの内容が演算結果としてｃから出力され、ディスティネーションレジスタに格納される。１６｛ｒｅｇ２［１５］｝は、ｒｅｇ２［１５］を１６ビット繰返したデータである。
【０１２１】
ｔｍｇ＝６では、ｒｅｇ２＋｛ｒｅｇ１[１５：０]，１６‘ｈ００００｝を演算し、その結果をｒｅｇ２に格納し、ａ[１５：０]×ｂ［３１：１６］を演算し、その結果をレジスタｒｅｇ1に格納する。演算が符号付きのときは制御信号ｓｉｇｎ＝１、符号無しのときは制御信号ｓｉｇｎ＝０とする。次ステートはｔｍｇ＝７である。
【０１２２】
ｔｍｇ＝７では、ｒｅｇ２＋｛ｒｅｇ１[１５：０]，１６‘ｈ００００｝を演算し、その結果をｒｅｇｃに格納する。次ステートは制御信号ｓｔａｒｔ＝０のときｔｍｇ＝０、ｓｔａｒｔ＝１のとき、ｔｍｇ＝０のときの状態遷移図にしたがってｔｍｇが更新され、次の演算が実行される。次ステートで演算結果がｃに出力される。
【０１２３】
ｔｍｇ＝８では、ａ[１５：０]×ｂ［１５：０］を演算し、その結果をレジスタｒｅｇｃに格納する。その他に、８ビット×８ビットを演算して１６ビット、１６ビット×１６ビットを演算して１６ビット、１６ビット×１６ビットを演算して３２ビットを得る演算を行なう。演算が符号付きのときは制御信号ｓｉｇｎ＝１、符号無しのときは制御信号ｓｉｇｎ＝０とする。８ビット乗算を行なうときは制御信号ｌｅｇ＝１、１６ビット乗算を行なうときは制御信号ｌｅｇ＝０とする。次ステートは制御信号ｓｔａｒｔ＝０のときｔｍｇ＝０、制御信号ｓｔａｒｔ＝１のときはｔｍｇ＝０のときの状態遷移図にしたがってｔｍｇが更新されて演算が実行される。次ステート時にその演算結果がレジスタｒｅｇｃに格納される。
【０１２４】
図１９の状態遷移制御によって乗算が制御される乗算器ＭＵＬＴは、３２ビット×３２ビットの乗算による上位３２ビットの結果を、ｔｍｇ＝１，２，３，４，５，８の順序による制御で得ることができる。また、３２ビット×３２ビットの乗算による下位３２ビットの結果を、ｔｍｇ＝１，２，６，７，８の順序による制御で得ることができる。例えば前者は乗算命令ＭＵＬＵ．Ｌによって実行され、後者は乗算命令ＭＵＬＵ／ＵＰ．Ｌによって実行される。当該後者の乗算処理では、逆数を乗算して上位を得ることで、実質的に除算結果を得ることになり、除算処理の高速化を実現することができる。
【０１２５】
なお、状態遷移には、適宜そのほかの演算（積和演算など）を実現するための状態を追加することもできる。
【０１２６】
図２０乃至図２２には命令バッファ部ＩＢＵＦの状態を主体に命令実行のフローチャートを示す。それら実行フローで示される制御内容は命令デコーダＤＥＣによる制御内容と等価と把握してよい。
【０１２７】
図２０の命令実行フローは転送命令（ＭＯＶ．Ｗ ＠ａａ：１６，Ｒｄ）を一例とする。図においてｓｋｉｐの判別は、ＦＩＦＯバッファＦＢがフルか否かの判別であり、Ｙｅｓは判別結果がフル状態であることを意味する。ｍｏｄ＿ｄｂの判別は現在遅延スロットにいるか否かの判別であり、Ｙｅｓは判別結果が遅延スロットにいることを意味する。ＦＩＦＯバッファがフル状態のとき、遅延スロットにいるとき、命令フェッチは行なわない。
【０１２８】
第１ステート（Ｓ１）では、制御信号Ａで、次命令の命令リード（ｉｆ）とｐｆｃインクリメントを行う。制御信号Ｂで、リードした命令を命令バッファＩＦＩＦＯに格納する。
【０１２９】
遅延スロット命令として実行する場合（ｍｏｄ＿ｄｂ＝ｙｅｓ）は、第１ステート（Ｓ１‘）は無操作（ｎｏｐ）とされる。命令プリフェッチを実行しても利用されないためである。
【０１３０】
第２ステート（Ｓ２）では、制御信号Ａで、命令バッファ部ＩＢＵＦの出力ｒｓｌｔ１に基づいて、本命令のＥＡ拡張部（ａａ）を符号拡張して、内部バスａｂ、アドレスバッファＡＢ経由で、内部アドレスバスＩＡＢに出力する。同時に、データリードのためのバスコマンドを発行する。制御信号Ｂで、第２ステートでリードしたデータを、第３ステートで、内部データバスＩＤＢからリードデータバッファＤＢＲに格納する。更に、制御信号Ｃで、次のステートで、リードデータバッファＤＢＲから内部バスｗｂ２経由で汎用レジスタに転送するとともに、データを検査し、結果をフラグレジスタＣＣＲにセットする。
【０１３１】
第３ステート（Ｓ３）では、制御信号Ａで、次の次の命令の命令リード（ｉｆ）とプリフェッチカウンタｐｆｃのインクリメントを行う。制御信号Ｂで、リードした命令を命令バッファ部ＩＢＵＦに格納する。
【０１３２】
遅延スロット命令として実行する場合（ｍｏｄ＿ｄｂ＝ｙｅｓ）は、第３ステート（Ｓ３‘）では、プリフェッチカウンタｐｆｃの代わりに、テンポラリレジスタＴＲの内容を読み出す。また、ＦＩＦＯバッファＦＢの残量に依存せず、命令リード（ｉｆａ）を発行する。
【０１３３】
第１ステートと第３ステートは、リード済みの（ＦＩＦＯに存在している）命令の量に従って、省略（スキップ）される。リード済みの命令が少なければ、第１、第３ステートを実行し、本命令の命令長（２ワード）より多い命令をリードする。リード済みの命令の量が適切であれば、第１または第３ステートの一方を実行し、本命令の命令長（２ワード）と同じ量の命令をリードする。リード済みの命令が多ければ、第１、第３ステートを実行せず、命令をリードしない。
【０１３４】
具体的には、本命令の実行開始時の命令バッファの残量ｄｅｌｔａが本命令の命令コード長ｎｕｍに対し、“ｄｅｌｔａ＞ｎｕｍ”の関係があれば、第１ステートを省略する。ＥＡ拡張部も含めて、自命令がリード済みで直ちに実行可能であり、命令リードのレイテンシも考慮して、次の命令も用意されているからである。また、“ｄｅｌｔａ−ｎｕｍ＞２”の関係であれば、第３ステートを省略する。次の命令の第１ワードがリード済みであり、実行開始可能であり、更に、次の命令が１ステートで終了しても、命令リードのレイテンシも考慮して、更に１ワードが用意されているからである。
【０１３５】
前記の通り、Ｓ１では、命令バッファをオーバフローさせないために、命令の命令リード（ｉｆ）とプリフェッチカウンタｐｆｃのインクリメントは、適宜抑止されるが、これは前の命令と共通であるため、各命令については、この記述は省略されている。命令リード（ｉｆａ）は、ＦＩＦＯバッファＦＢの残量に依存せず、抑止されない。
【０１３６】
図２１には分岐命令（ＪＭＰ ＠ａａ：３２）の実行フローが例示される。第１ステート（Ｓ１）では、制御信号Ａで、次命令の命令リード（ｉｆｗ）とプリフェッチカウンタｐｆｃのインクリメントを行う。制御信号Ｂで、リードした命令を命令バッファ部ＩＢＵＦに格納する。
【０１３７】
第２ステート（Ｓ２）では、リードした命令が命令バッファ部ＩＢＵＦに格納されるのを待つ。
【０１３８】
第３ステートでは、制御信号Ａで、命令バッファ部ＩＢＵＦの出力ｒｓｌｔ１，ｒｓｌｔ２に基づいて、本命令のＥＡ拡張部（ａａ）を、内部バスａｂ、アドレスバッファＡＢ経由で内部アドレスバスＩＡＢに出力する。この内容はインクリメンタＩＮＣでインクリメントされて、プリフェッチカウンタｐｆｃに格納される。同時に、命令リードのためのバスコマンドを発行する。制御信号Ｂで、リードした命令を命令バッファ部ＩＢＵＦに格納する。
【０１３９】
第４ステートでは、制御信号Ａで、次の次の命令の命令リード（ｉｆ）とプリフェッチカウンタｐｆｃのインクリメントを行う。制御信号Ｂで、リードした命令を命令バッファ部ＩＢＵＦに格納する。
【０１４０】
第１ステートと第２ステートは、リード済みの（ＦＩＦＯバッファＦＢに存在している）命令の量に従って、省略（スキップ）される。
【０１４１】
本命令の実行開始時の命令バッファの残量ｄｅｌｔａが本命令の残量ｎｕｍに対し、“ｄｅｌｔａ≧ｎｕｍ”の関係であれば、第１、第２ステートを省略する。ＥＡ拡張部も含めて、自命令がリード済みで直ちに実行可能であるからである。また、本命令実行開始時に命令リード中の命令コード量ｉｆｎｕｍも考慮して、“ｄｅｌｔａ＋ｉｆｎｕｍ≧ｎｕｍ”の関係であれば、第１ステートを省略する。自命令がリード発行済みで、１ステート待てば、実行可能になり、追加で命令をリードする必要がないからである。
【０１４２】
第１ステートを実行する場合、前記の通り、前命令が、少なくとも自命令の２ワード目までをリードしているから、不足しているのは１ワードのみである。プログラムが１６ビットバスで接続されている場合には、ワードで命令をリードするのがよい。３２ビットで命令リードを発行すれば、不要なワードも待ってウェイトが挿入されてしまうからである。このため、制御信号ｉｆｗを活性化して、強制的にワードの命令リードを行うようにする。
【０１４３】
図２２には複数ビットシフト命令（ＳＨＬＬ  ＃ｘｘ，Ｒｄ）の実行フローが例示される。第１〜第３ステート（Ｓ１〜Ｓ３）では、制御信号Ａで、命令の命令リード（ｉｆ）とプリフェッチカウンタｐｆｃのインクリメントを行う。制御信号Ｂで、リードした命令を命令バッファ部ＩＢＵＦに格納する。制御信号Ｂで、更にシフタ２１の演算を行う。これをｄｏ＿ｓｆｔで総称している。具体的には以下の通りである。制御信号ｒｄｇｂ［ｎ］で、指定されたデスティネーションレジスタＲｄを内部バスｇｂにリードし、シフタ２１に供給するとともに、制御信号ｓｆｔｌ、ｓｆｔｒ、ｓｆｔ１、ｓｆｔ２、ｓｆｔ４、ｓｆｔ８、ｓｆｔ１６を発行して、シフト演算を行わせる。制御信号ｗｂｒｄ［ｎ］で結果をデスティネーションレジスタＲｄに格納する。コンディションコードレジスタＣＣＲの所定のフラグのセットが行われる。制御信号ｓｆｔｃｎｔを生成する。
【０１４４】
前記の通り、制御信号ｓｆｔｃｎｔが全ビット０となったとき、終了と判定される。制御信号ｓｆｔｃｎｔが全ビット０でない場合は、割込みの挿入が抑止（図１のＩＮＴＣの出力する割り込み指示信号ｉｎｔｒｑが受付けられない）される。この動作を、最大３ステート実行して、３１ビットまでの任意のシフトを実行する。
【０１４５】
前記の通り、命令バッファをオーバフローさせないために、命令の命令リード（ｉｆ）とプリフェッチカウンタｐｆｃのインクリメントは、適宜抑止されるが、これは前の命令と共通であるため、各命令については、この記述は省略されている。
【０１４６】
図２３〜図２５には各バスモードによる、命令の実行タイミングが例示される。分岐命令で分岐した先で、次に示すプログラム
ｐｃ０    ＢＴＳＴ  ＃６，Ｒ０Ｌ
ＢＥＱ    ｔ１
．．．
ｔ１      ＢＭＩ    ｔ２
．．．
を実行した場合のタイミング図である。条件分岐命令ＢＥＱ、ＢＭＩは共に固有の分岐条件が成立したものとする。外部メモリは、１６ビットバスで接続され、２ステートアクセスが可能であるものとする。なお、レディ信号ｒｅａｄｙは、ＣＰＵが要求した命令リードまたはデータリード／ライト（バスコマンド）に対する、バスコントローラから応答信号であり、ＣＰＵの状態遷移のイネーブル信号とされる。
【０１４７】
図２３には内蔵ＲＯＭ上での実行タイミングを示す。つまり内蔵ＲＯＭから命令ＢＴＳＴ（ビット操作命令）、ＢＥＱ（条件分岐命令）、ＢＭＩ（条件分岐命令）をフェッチして実行する場合である。
【０１４８】
Ｔ０で、直前の分岐命令の実行によって、ＣＰＵ２のアドレスバッファＡＢからアドレスが内部アドレスバスＩＡＢに出力される。また、命令デコーダＤＥＣから、ロングワードサイズの命令フェッチ（ｉｆ−ｌｏｎｇ）を示す、バスコマンドＢＣＭＤが出力される。ｉｆ−ｌｏｎｇは前記`ｌｏｎｇｒｅａｄと同じでよい。
【０１４９】
Ｔ１で、Ｔ０のバスＩＡＢ上のアドレス信号とバスコマンドＢＣＭＤに従ったリードが実行され、ロングワードのリードデータが内部データバスＩＤＢに得られる。このリードデータの先行するワード（ＢＴＳＴ命令）は、Ｔ２で命令デコーダＤＥＣに入力されて、命令の内容が解読される。後行するワード（ＢＥＱ命令）は命令バッファ部ＩＢＵＦのＦＩＦＯバッファＦＢに格納される。
【０１５０】
解読結果に従って、所要の制御信号が出力されて、ＢＴＳＴ命令の実行が行われるが、詳細は省略する。Ｔ２で、ロングワードサイズの命令フェッチを行う。
【０１５１】
一方、Ｔ２で、Ｔ１のバスＩＡＢ上のアドレス信号とバスコマンドＢＣＭＤに従ったリードが実行され、ロングワードのリードデータが内部データバスＩＤＢに得られる。Ｔ３で、命令バッファ部ＩＢＵＦから次の命令（ＢＥＱ命令）が命令デコーダＤＥＣに入力されて、命令の内容が解読される。
【０１５２】
解読結果に従って、実効アドレスの計算が行われて、Ｔ３およびＴ４で、分岐先（ｔ１、ｔ１＋４）のロングワードサイズの命令フェッチが行われる。
【０１５３】
同様に、Ｔ３のバスＩＡＢ上のアドレス信号とバスコマンドＢＣＭＤに従ったリードデータ（ＢＭＩ命令）は、Ｔ５で命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、実効アドレスの計算が行われて、Ｔ５およびＴ６で、分岐先（ｔ２、ｔ２＋４）のロングワードサイズの命令フェッチを行う。
【０１５４】
図２４には１６ビットバスモードで外部メモリからフェッチした命令を実行する動作が例示される。Ｔ０〜Ｔ１で、直前の分岐命令の実行によって、ＣＰＵ２のアドレスバッファＡＢからアドレス信号が内部アドレスバスＩＡＢに出力される。また、命令デコーダＤＥＣから、ワードサイズの命令フェッチ（ｉｆ−ｗｏｒｄ）を示す、バスコマンドＢＣＭＤが出力される。ｉｆ−ｗｏｒｄは前記`ｗｏｒｄｒｅａｄと同じでよい。
【０１５５】
Ｔ２〜Ｔ３で、Ｔ０〜Ｔ１におけるバスＩＡＢ上のアドレス信号とバスコマンドＢＣＭＤに従ったリードが外部バス（ＥＸＡ、ＥＸＤ）上で実行され、リードデータが内部データバスＩＤＢに得られる。このリードデータ（ＢＴＳＴ命令）は、Ｔ４で命令デコーダＤＥＣに入力されて、命令の内容が解読される。
【０１５６】
解読結果に従って、所要の制御信号が出力されて、ＢＴＳＴ命令の実行が行われるが、詳細は省略する。Ｔ４〜Ｔ５で、ワードサイズの命令フェッチを行う。
【０１５７】
一方、Ｔ４〜Ｔ５で、Ｔ２〜Ｔ３におけるＩＡＢ上のアドレス信号とバスコマンドＢＣＭＤに従ったリードが外部バス（ＥＸＡ、ＥＸＤ）上で実行され、リードデータが内部データバスＩＤＢに得られる。このリードデータ（ＢＥＱ命令）は、Ｔ６で命令デコーダＤＥＣに入力されて、命令の内容が解読される。
【０１５８】
解読結果に従って、実効アドレスの計算が行われて、Ｔ６〜Ｔ７およびＴ８〜Ｔ９で、分岐先（ｔ１、ｔ１＋２）のワードサイズの命令フェッチを行う。同様に、Ｔ８〜Ｔ９で、Ｔ６〜Ｔ７におけるバスＩＡＢ上のアドレス信号とバスコマンドＢＣＭＤに従ったリードデータ（ＢＭＩ命令）は、Ｔ８で命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、実効アドレスの計算が行われて、Ｔ１０〜Ｔ１１およびＴ１２〜Ｔ１３で、分岐先（ｔ２、ｔ２＋２）のワードサイズの命令フェッチを行う。
【０１５９】
図２４から明らかなように、図２３の内蔵ＲＯＭ上での実行に比べてクロック周波数は遅いが、１６ビットバスモードを採用しているから、バスサイクルの数は図２３と同等になっている。
【０１６０】
図２５には３２ビットバスモードで外部メモリからフェッチした命令を実行する動作が例示される。Ｔ０〜Ｔ３で、直前の分岐命令の実行によって、ＣＰＵ２のアドレスバッファＡＢからアドレスがアドレスバスＩＡＢに出力される。また、命令デコーダＤＥＣから、ロングワードサイズの命令フェッチ（ｉｆ−ｌｏｎｇ）を示す、バスコマンド（ＢＣＭＤ）が出力される。
【０１６１】
Ｔ４〜Ｔ７で、Ｔ０〜Ｔ３におけるバスＩＡＢ上のアドレス信号とバスコマンドＢＣＭＤに従ったリードが外部バス（ＥＸＡ、ＥＸＤ）上で、２回のワードサイズリードに分割されて実行され、Ｔ６〜Ｔ７でロングワードのリードデータが内部データバスＩＤＢに得られる。このリードデータの先行するワード（ＢＴＳＴ命令）は、Ｔ８で命令デコーダＤＥＣに入力されて、命令の内容が解読される。後行するワード（ＢＥＱ命令）は命令バッファ部ＩＢＵＦのＦＩＦＯバッファＦＢに格納される。解読結果に従って、所要の制御信号が出力されて、ＢＴＳＴ命令の実行が行われるが、詳細は省略する。Ｔ８〜Ｔ１１で、ロングワードサイズの命令フェッチを行う。
【０１６２】
一方、Ｔ８〜Ｔ１１で、Ｔ４〜Ｔ７における内部アドレスバスＩＡＢ上のアドレス信号とバスコマンドＢＣＭＤに従ったリードが外部バス（ＥＸＡ、ＥＸＤ）上で、２回のワードサイズリードに分割されて実行され、Ｔ１０〜Ｔ１１でロングワードのリードデータが内部データバスＩＤＢに得られる。Ｔ１２で、命令バッファ部ＩＢＵＦから次の命令（ＢＥＱ命令）が命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、実効アドレスの計算が行われて、Ｔ１２〜Ｔ１５およびＴ１６〜Ｔ１９で、分岐先（ｔ１、ｔ１＋４）のロングワードサイズの命令フェッチを行う。
【０１６３】
同様に、Ｔ１８〜Ｔ１９で、Ｔ１２〜Ｔ１５におけるバスＩＡＢ上のアドレス信号とバスコマンドＢＣＭＤに従ったリードデータ（ＢＭＩ命令）は、Ｔ２０で命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、実効アドレスの計算が行われて、Ｔ２０〜Ｔ２３およびＴ２４〜Ｔ２７で、分岐先（ｔ２、ｔ２＋４）のロングワードサイズの命令フェッチを行う。
【０１６４】
３２ビットバスモードは、１６ビットバスモードに比較して、Ｔ１０〜Ｔ１５、Ｔ２０〜Ｔ２３で実行される５回分の、外部バス上のワードリードでフェッチした命令は使用されず、無駄になっている。これに伴って、実行ステート数も増えている。このプログラムの実行が、分岐命令後でない場合は、命令バッファの残量によって命令リードが抑止される場合があるから、Ｔ４〜Ｔ５のバスコマンドは抑止（ＮＯＰ：ノーオペレーション）され、Ｔ１２〜Ｔ１５の外部バス上のワードリードは実行されず、１ステートで完了する場合もある。また、ＢＥＱ命令、ＢＭＩ命令で分岐条件が不成立だったりして、分岐が行われず、割込みも要求されていない場合は、命令リードをした命令コードは使用され、無駄になることはない。
【０１６５】
図２６には通常分岐命令の第１の例の実行タイミングが示される。通常分岐命令とは遅延分岐命令でないという意味である。ここで示すプログラムの例は、
ＭＯＶ．Ｗ  ＠ＥＲ１，Ｒ０
ＢＲＡ      ｔａｒｇｅｔ
．．．
ｔａｒｇｅｔ        
である。
【０１６６】
前記同様に、Ｔ２で、ＭＯＶ命令が命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、汎用レジスタＥＲ１の内容が、実効アドレスとして内部アドレスバスＩＡＢに出力され、ワードリードのバスコマンド（ｄａｔａ−ｒｅａｄ）が発行される。同時に、レジスタ選択信号を含むデータリード制御信号が生成され、順次、Ｔ３、Ｔ４の制御を行う。具体的には、Ｔ３で、リードデータバッファＤＢＲへの取り込み制御が指示される。Ｔ５では、リードデータバッファＤＢＲの内容がデスティネーションレジスタＲ０への転送が指示される。
【０１６７】
リードデータは、Ｔ３で内部データバスＩＤＢに得られ、前記の通り、Ｔ４でリードデータバッファＤＢＲに取り込まれ、Ｔ５で、汎用レジスタＲ０へ転送される。同時に、転送データの内容に従って、コンディションコードレジスタＣＣＲの所定のフラグが更新される。また、Ｔ４では命令リードが行われる。プリフェッチカウンタｐｆｃの内容が内部アドレスバスＩＡＢに出力され、また、インクリメンタＩＮＣでインクリメントされる。
【０１６８】
ＢＲＡ命令は、Ｔ４で命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、実効アドレスの計算が行われて、Ｔ４で、分岐先（ｔａｒｇｅｔ）のロングワードサイズ（ｔａｒｇｅｔが４の倍数でないときはワードサイズ）の命令フェッチを行う。この分岐先アドレスはインクリメンタＩＮＣでインクリメントされ、プリフェッチカウンタｐｆｃに格納する。また、Ｔ５で、制御信号ｃｌｒＦＩＦＯ（制御信号ｐｆｂと等価）を活性状態にして、ＦＩＦＯバッファＦＢの初期化を行うと共に、分岐先の命令を命令デコーダＤＥＣに供給する。
【０１６９】
図２７には通常分岐命令の第２の例の実行タイミングが示される。ここで示すプログラムの例は、
ＭＯＶ．Ｗ  ＠ａａ：１６，Ｒ０
ＢＲＡ      ｔａｒｇｅｔ
．．．
ｔａｒｇｅｔ        
である。
【０１７０】
前記同様に、Ｔ２で、ＭＯＶ命令が命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果により、Ｔ２の第１ステート（図２０のＳ１）は命令リードを行い、ＥＡ拡張部が入力されるのを待つ。Ｔ３の第２ステートで、命令バッファ部ＩＢＵＦのｏｕｔ１から本命令のＥＡ拡張部（ａａ）が出力され、符号拡張されて、実効アドレスとしてアドレスバッファＡＢから内部アドレスバスＩＡＢに出力され、また、ワードリードのバスコマンド（ｄａｔａ−ｒｅａｄ）が発行される。同時に、レジスタ選択信号を含むデータリード制御信号が生成され、順次、Ｔ４、Ｔ５の制御を行う。具体的には、Ｔ４で、リードデータバッファＤＢＲへの取り込み制御が指示される。Ｔ５では、リードデータバッファＤＢＲの内容をデスティネーションレジスタＲ０へ転送する指示が行われる。
【０１７１】
リードデータは、Ｔ４で内部データバスＩＤＢに得られ、前記の通り、Ｔ５でリードデータバッファＤＢＲに取り込まれ、Ｔ６で、レジスタＲ０へ転送される。同時に、転送データの内容に従って、コンディションコードレジスタＣＣＲの所定のフラグが更新される。また、Ｔ４では命令リードが行われる。
【０１７２】
ＢＲＡ命令は、Ｔ５で命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、前記同様に、Ｔ５で、分岐先（ｔａｒｇｅｔ）のロングワードサイズの命令フェッチを行う。この分岐先アドレスはインクリメンタＩＮＣでインクリメントされ、プリフェッチカウンタｐｆｃに格納する。また、Ｔ６で、制御信号ｃｌｒＦＩＦＯ（ｐｆｂと等価）を活性状態にして、ＦＩＦＯバッファＦＢの初期化を行うと共に、命令レジスタＩＲに格納した分岐先の命令を命令デコーダＤＥＣに供給する。
【０１７３】
図２８には遅延分岐命令の第１の例の実行タイミングが示される。ここで示すプログラムの例は、
ＢＲＡ／Ｓ  ｔａｒｇｅｔ
ＭＯＶ．Ｗ  ＠ＥＲ１，Ｒ０
．．．
ｔａｒｇｅｔ        
であり、実質的な処理は、図２６と同じである。ＢＲＡ／Ｓは遅延スロット付きの分岐命令、即ち遅延分岐命令を意味する。
【０１７４】
Ｔ２で、遅延分岐命令（ＢＲＡ／Ｓ命令）が命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、実効アドレスの計算が行われて、Ｔ３で、分岐先（ｔａｒｇｅｔ）のロングワードサイズ（ｔａｒｇｅｔが４の倍数でないときはワードサイズ）の命令フェッチを行う。この分岐先アドレスはインクリメンタＩＮＣでインクリメントされ、テンポラリレジスタＴＲに格納する。また、制御信号ｍｏｄ＿ｄｂ（当該命令が遅延スロットの命令であることを示す信号）を出力し、遅延スロット命令の修飾を行う。遅延スロット命令（この例ではＭＯＶ命令）は、Ｔ３で命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、汎用レジスタＥＲ１の内容が、実効アドレスとして内部アドレスバスＩＡＢに出力され、ワードリードのバスコマンド（ｄａｔａ−ｒｅａｄ）が発行される。同時に、レジスタ選択信号を含むデータリード制御信号が生成され、順次、Ｔ４、Ｔ５の制御を行う。具体的には、Ｔ４で、リードデータバッファＤＢＲ取り込み制御が指示される。Ｔ５では、リードデータバッファＤＢＲの内容をデスティネーションレジスタＲ０へ転送する指示が行われる。
【０１７５】
リードデータは、Ｔ４で内部データバスＩＤＢに得られ、前記の通り、Ｔ５でリードデータバッファＤＢＲに取り込まれ、Ｔ６で、レジスタＲ０へ転送される。同時に、転送データの内容に従って、コンディションコードレジスタＣＣＲの所定のフラグが更新される。
【０１７６】
また、Ｔ４では命令リードが行われる。このとき、制御信号ｍｏｄ＿ｄｂにより修飾されることにより、プリフェッチカウンタｐｆｃの代わりに、テンポラリレジスタＴＲの内容を使用する。このアドレスはインクリメンタＩＮＣでインクリメントされ、プリフェッチカウンタｐｆｃに格納する。また、Ｔ３で制御信号ｓｔｋＩＲを活性状態にして、分岐先の命令を命令バッファ部ＩＢＵＦ内の命令レジスタＩＲに格納する。Ｔ４で、制御信号ｃｌｒＦＩＦＯ（ｐｆｂと等価）を活性状態にして、ＦＩＦＩバッファＦＢの初期化を行うとともに、命令レジスタＩＲに格納した分岐先の命令を命令デコーダＤＥＣに供給する。
【０１７７】
遅延分岐命令と遅延スロットの命令を組合せることによって、分岐先の命令リードのレイテンシを隠蔽し、実効的に遅延分岐命令を１ステートで実行できる。ＢＲＡ命令とＢＲＡ／Ｓ命令の第１ステートの動作は基本的に同一である。インクリメンタＩＮＣの出力をプリフェッチカウンタｐｆｃに格納するか、テンポラリレジスタＴＲに格納するかが相違される。
【０１７８】
図２９には遅延分岐命令の第２の例の実行タイミングが示される。ここで示すプログラムの例は、
ＢＲＡ／Ｓ  ｔａｒｇｅｔ
ＭＯＶ．Ｗ  ＠ａａ：１６，Ｒ０
．．．
ｔａｒｇｅｔ        
であり、実質的な処理は、図２７と同じである。
【０１７９】
Ｔ２で、遅延分岐命令（ＢＲＡ／Ｓ命令）が命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、前記同様に、Ｔ３で、分岐先（ｔａｒｇｅｔ）のロングワードサイズの命令フェッチを行う。この分岐先アドレスはインクリメンタＩＮＣでインクリメントされ、テンポラリレジスタＴＲに格納する。また、制御信号ｍｏｄ＿ｄｂを出力し、遅延スロット命令の修飾を行う。遅延スロット命令（ＭＯＶ命令）は、命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果と、制御信号ｍｏｄ＿ｄｂにより修飾されることにより、Ｔ４の第１ステート（図２０のＳ１）は命令リードを行わず、ＥＡ拡張部が入力されるのを待つ。要するに、リード開始済みのＥＡ拡張部がＦＩＦＯバッファＦＢに入力される。Ｔ４の第２ステートで、命令バッファ部ＩＢＵＦの出力ｏｕｔ１から本命令のＥＡ拡張部（ａａ）を出力し、これを符号拡張して、実効アドレスとしてアドレスバッファＡＢから内部アドレスバスＩＡＢに出力され、更に、ワードリードのバスコマンドＢＣＭＤ（ｄａｔａ−ｒｅａｄ）が発行される。同時に、レジスタ選択信号を含むデータリード制御信号が生成され、順次、Ｔ５、Ｔ６の制御を行う。具体的には、Ｔ５で、リードデータバッファＤＢＲへの取り込み制御が指示される。Ｔ６では、リードデータバッファＤＢＲの内容をデスティネーションレジスタＲ０へ転送する指示が行われる。
【０１８０】
リードデータは、Ｔ５で内部データバスＩＤＢに得られ、前記の通り、Ｔ６でリードデータバッファＤＢＲに取り込まれ、Ｔ７で、レジスタＲ０へ転送される。同時に、転送データの内容に従って、コンディションコードレジスタＣＣＲの所定のフラグが更新される。
【０１８１】
また、Ｔ５では命令リードが行われる。このとき、制御信号ｍｏｄ＿ｄｂにより修飾されることにより、プリフェッチカウンタｐｆｃの代わりに、テンポラリレジスタＴＲの内容を使用する。このアドレスはインクリメンタＩＮＣでインクリメントされ、プリフェッチカウンタｐｆｃに格納する。
【０１８２】
また、Ｔ３で制御信号ｓｔｋＩＲを活性状態にして、分岐先の命令を命令バッファ部ＩＢＵＦ内の命令レジスタＩＲに格納する。Ｔ５で、制御信号ｃｌｒＦＩＦＯ（ｐｆｂと等価）を活性状態にして、ＦＩＦＯバッファＦＢの初期化を行うとともに、命令レジスタＩＲに格納した分岐先の命令を命令デコーダＤＥＣに供給する。Ｔ６でＦＩＦＯバッファＦＢを初期化するので、それまでの遅延スロット命令実行中に、例えばＴ４のＥＡ拡張部（ｅａ）等をＦＩＦＯバッファＦＢから任意に出力して使用することができる。
【０１８３】
ＭＯＶ命令の第１ステート（Ｓ１）の命令リードは抑止されて、無駄な命令リードを回避することができる。
【０１８４】
図３０にはシフト命令の第１の例の実行タイミングが示される。ここでは、ＳＨＬＬ  ＃４，ＥＲ３による実行タイミングを示す。この命令は４ビット左シフトを指示する。
【０１８５】
Ｔ２で、命令コード（ｓｈｌｌ４）が命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、Ｔ３で、デスティネーションレジスタＥＲ３の内容が内部バスｇｂに出力され、算術論理演算器ＡＬＵに入力される。制御信号ｓｆｔｌ、ｓｆｔ４が活性状態になって、第１のシフタ２７はシフトをせず、第２のシフタ２８が４ビットシフト演算を行い、演算結果が内部バスｗｂ２に出力される。同時に、内部バスｗｂ２の内容がデスティネーションレジスタである汎用レジスタＥＲ３に格納される。また、シフト結果を判定して、コンディションコードレジスタＣＣＲの所定のビットが更新される。例えば、演算結果が全ビットゼロであれば、Ｚフラグが１にセットされる。また、シフトアウトしたｇｂ［２８］の内容がＣフラグに格納される。命令リードについての詳細な説明は省略する。
【０１８６】
図３１にはシフト命令の第２の例の実行タイミングが示される。ここでは、ＳＨＬＬ  ＃３１，ＥＲ３による実行タイミングを示す。この命令は３１ビット左シフトを指示する。
【０１８７】
Ｔ２で、命令コード（ｓｈｌｌ３１）が命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、Ｔ３〜Ｔ５で、デスティネーションレジスタＥＲ３の内容が内部バスｇｂに出力され、算術論理演算器ＡＬＵに入力される。Ｔ３では、制御信号ｓｆｔｌ（左シフト指示）、ｓｆｔ１（１ビットシフト指示）、ｓｆｔ４（４ビットシフト指示）が活性状態になって、第１のシフタ２７は１ビットシフト、第２のシフタ２８が４ビットシフト演算を行い（合わせて左へ５ビットシフト）、演算結果（途中結果ｒｅｓｕｌｔ’）が内部バスｗｂ２に出力される。同時に、内部バスｗｂ２の内容がデスティネーションレジスタである汎用レジスタＥＲ３に格納される。また、シフト結果を判定して、コンディションコードレジスタＣＣＲの所定のビットが更新される。
【０１８８】
Ｔ４では、制御信号ｓｆｔｌ（左シフト）、ｓｆｔ２（２ビットシフト）、ｓｆｔ８（８ビットシフト）が活性状態になって、第１のシフタ２７は２ビットシフト、第２のシフタ２８が８ビットシフト演算を行い（Ｔ３と合わせて、左へ１５ビットシフト）、演算結果（途中結果ｒｅｓｕｌｔ’ ’）が内部バスｗｂ２に出力される。同時に、内部バスｗｂ２の内容がデスティネーションレジスタである汎用レジスタＥＲ３に格納される。また、シフト結果を判定して、コンディションコードレジスタＣＣＲの所定のビットが更新される。
【０１８９】
Ｔ５では、制御信号ｓｆｔｌ（左シフト）、ｓｆｔ１６（１６ビットシフト）が活性状態になって、第１のシフタ２７はシフトをせず、第２のシフタ２８が１６ビットシフト演算を行い（Ｔ３、Ｔ４と合わせて、左へ３１ビットシフト）、演算結果（ｒｅｓｕｌｔ）が内部バスｗｂ２に出力される。同時に、内部バスｗｂ２の内容がデスティネーションレジスタである汎用レジスタＥＲ３に格納される。また、最終的なシフト結果を判定して、コンディションコードレジスタＣＣＲの所定のビットが更新される。尚、命令のリードは、ＦＩＦＯバッファＦＢの残量によって、Ｔ３、Ｔ４の命令リードが抑止されたものとして図示されている。
【０１９０】
図３２には乗算命令の第１の例の実行タイミングが示される。ここでは、ＭＵＬＵ．Ｌ  ＥＲ１，ＥＲ２の実行タイミングを示す。この命令は、３２ビット×３２ビットの乗算による下位３２ビットの結果を得る処理を実行させる。
【０１９１】
Ｔ２で、命令コード（ｍｕｌｕ）が命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、Ｔ２で乗算器ＭＵＬＴにスタート信号ｓｔａｒｔを与える。乗算器ＭＵＬＴの状態遷移が開始される。Ｔ３で、ソースレジスタＥＲ１の内容が内部バスｄｂに出力され、デスティネーションレジスタＥＲ２の内容が内部バスｇｂに出力され、乗算器ＭＵＬＴに入力される。Ｔ３〜Ｔ５の間、３２ビット×３２ビットの乗算を示すため、制御信号ｍｕｌ＿ｌｏｎｇ信号が活性化され、乗算器ＭＵＬＴの制御が行われる。Ｔ７では、制御信号ｍｕｌ＿ｒｄに従って、乗算結果が内部バスｗｂ２に出力されると共に、内部バスｗｂ２の内容が、Ｔ８でデスティネーションレジスタである汎用レジスタＥＲ２に格納される。また、この結果を判定して、コンディションコードレジスタＣＣＲの所定のビットが更新される。
【０１９２】
図３３には乗算命令の第２の例の実行タイミングが示される。ここでは、ＭＵＬＵ／ＵＰ．Ｌ ＃１２，ＥＲ２の実行タイミングを示す。この命令は、３２ビット×３２ビットの乗算による上位３２ビットの結果を得る処理を実行させる。
【０１９３】
Ｔ２で、命令コード（ｍｕｌｕ）が命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、Ｔ２で乗算器ＭＵＬＴにスタート信号ｓｔａｒｔを与える。乗算器ＭＵＬＴの状態遷移が開始される。Ｔ３で、イミディエイトデータ（１２）がゼロ拡張されて、内部バスｄｂに出力され、デスティネーションレジスタＥＲ２の内容が内部バスｇｂに出力され、乗算器ＭＵＬＴに入力される。Ｔ３〜Ｔ８の間、３２ビット×３２ビットの乗算を示すために制御信号ｍｕｌ＿ｌｏｎｇ信号が活性化され、上位を取るための制御信号ｕｐｐｅｒが活性化されて、乗算器ＭＵＬＴの制御が行われる。
【０１９４】
Ｔ８では、制御信号ｍｕｌ＿ｒｄに従って、乗算結果が内部バスｗｂ２に出力されると共に、Ｔ９で内部バスｗｂ２の内容がデスティネーションレジスタである汎用レジスタＥＲ２に格納される。また、この結果を判定して、コンディションコードレジスタＣＣＲの所定のビットが更新される。
【０１９５】
図３４には前記制御ビットｂｍｏｄｅ１６を生成する構成が例示される。制御ビットｂｍｏｄｅ１６はフリップフロップＦＦｂｃで生成され、リセット状態（信号ｒｓｔｂ＝０、末尾のｂはリセット信号ｒｓｔの反転信号を示す）で初期化される。内部Ｉ／Ｏレジスタのライト信号ｉｏｗｒと、制御ビットｂｍｏｄｅ１６を有する内部Ｉ／Ｏレジスタの選択信号ｂｓ＿ｒｓｅｌの論理積（ｉｏｗｒ＆ｂｓ＿ｒｓｅｌ）をイネーブル信号として、データバスＩＤＢの所定のビット、例えばビット０を入力する。前記フリップフロップＦＦｂｃは前記バスコントローラ３に含まれている。図１のフリップフロップＦＦは前記フリップフロップＦＦｂｃの出力を受けることになる。
【０１９６】
図３５には前記制御ビットｂｍｏｄｅ１６を生成する別のフリップフロップＦＦｂｃの構成が例示される。イネーブル信号は、前記に加えて、分岐の実行を示す制御信号ｃｌｒＦＩＦＯ（ｐｆｂと等価）との論理和（（ｉｏｗｒ＆ｂｓ＿ｒｓｅｌ）｜ｃｌｒＦＩＦＯ）とする。制御信号ｃｌｒＦＩＦＯが活性状態のときは、データ入力（ｄ）を、そのときの内部アドレスバスＩＡＢをバスコントローラが判定し、当該アドレスが１６ビットバスであることを示す信号ｓｅｌ＿ｂ１６としている。このため、分岐の実行毎に分岐先のバス幅を判定して、バスモードを自動的に切替えることができる。尚、分岐を示す信号としては前記ｃｌｒＦＩＦＯのほか、専用のものを生成することもできる。
【０１９７】
図３６には前記ＣＰＵ２のプログラム等の開発環境の概略を示す。開発者は、各種エディタなどを用いて、Ｃ言語乃至アセンブリ言語でプログラムを作成する。これは通常、複数のモジュールに分割して作成される。Ｃコンパイラ３０は、開発者の作成したそれぞれのＣ言語ソースプログラムを入力し、アセンブリ言語ソースプログラム乃至オブジェクトモジュールを出力する。アセンブラ３１は、アセンブリ言語ソースプログラムを入力し、オブジェクトモジュールを出力する。リンケージエディタ３２は、上記Ｃコンパイラやアセンブラの生成した、複数のオブジェクトモジュールを入力して、各モジュールの外部参照や相対アドレスなどの解決を行い、１つのプログラムに結合して、ロードモジュールを出力する。ロードモジュールは、シミュレータ／デバッガ３３に入力して、パーソナルコンピュータなどのシステム開発装置上で、ＣＰＵの動作をシミュレーションし、実行結果を表示し、プログラムの解析や評価を行うことができる。また、エミュレータ３４に入力して、実際の応用システム上などで動作する、いわゆるインサーキットエミュレーションを行い、マイクロコンピュータ全体としての、実動作の解析や評価を行うことができる。さらに、ロードモジュールをＰＲＯＭライタ３５に入力して、マイクロコンピュータの内蔵ＲＯＭがフラッシュメモリなどの場合や、外部のフラッシュメモリなどに、作成したプログラムを格納することができる。必要に応じて、オブジェクトコンバータなどによって、所望のフォーマットに変換する。このほかに、ライブラリアンとして、汎用的なサブルーチンなどを提供することもできる。
【０１９８】
Ｃコンパイラ３０やリンケージエディタ３２の最適化やオプションなどとして、遅延分岐命令の利用などを行うことができる。プログラムを解析して、分岐命令と置き換え可能な命令を解析することになるが、複数ワード命令、複数ステート実行命令も、遅延スロットに配置できれば、有効利用が可能になる。
【０１９９】
上記各種の実施形態によれば、以下の作用効果を得るものである。
【０２００】
（１）［バスモード（図４）］
内部Ｉ／Ｏレジスタ等の設定により、１６ビット命令リードと３２ビット命令リードを切替え可能にすることにより、外部バスのデータバス幅が内蔵ＲＯＭのバス幅より狭い場合、マイクロコンピュータの使用方法、例えば、プログラムを内蔵ＲＯＭのみとするとき、外部ＲＯＭのみとするとき、内蔵ＲＯＭまたはＲＡＭと外部ＲＯＭを切替えて使用するとき、などに対応し、処理性能を高くすることができる。初期値を３２ビット命令リードにし、リセット後のプログラム実行が、３２ビットバス、１６ビットバスの何れであっても、リセット後の初期化時の処理速度を低下させることがない。
【０２０１】
データのリード／ライトは、所要量のリード／ライトを行うようにし、選択に必要な論理を不要とするとともに、プログラムは外部ROM、データは内蔵RAMといった場合に、処理性能を高くすることができる。
【０２０２】
（２）［バスモード（図１）］
バスコントローラ３とＣＰＵ２のモジュール間制御信号ｂｍｏｄｅ１６をＣＰＵ２への入力時にＦＦで受けて利用することにより、バスコマンドＢＣＭＤの遅延を抑止することができる。
【０２０３】
バスモードに応じて、インクリメンタＩＮＣの加算値を制御することは、ポストインクリメントレジスタ間接などのアドレッシングモードの操作と共通化でき、資源の有効利用と論理規模の増加の抑止を図ることができる。
【０２０４】
分岐命令が、自命令の命令コードの一部をリードする場合、必要に応じて、必ず１６ビットで命令リードするようにすることにより、利用されない命令リード（プリフェッチ）を抑止できる。ウェイトが挿入されたりして、実行ステート数が増加することを回避することができる。
【０２０５】
（３）［遅延分岐（図２８、図２９）］
遅延分岐のとき、分岐アドレスリード後、分岐アドレスのインクリメント結果をテンポラリレジスタＴＲに保持することにより、遅延スロット命令の命令コード長が長い場合も継続して命令リードを行うことができる。また、自命令の命令コードのリードデータを待つステートや実効アドレス計算のためのステートは命令リードを抑止することにより、利用されない命令リード（プリフェッチ）を抑止できる。ウェイトが挿入されたりして、実行ステート数が増加することを回避することができる。ＦＩＦＯバッファＦＢのクリアを、遅延スロット命令がＥＡ拡張部など、命令バッファの出力を不要とした時点で行うことにより、遅延スロットの命令実行を複数ステートにすることができる。ハーバードバスなどを利用することなく、種々の命令セットやハードウェア構成に適用できる。
【０２０６】
（４）［遅延分岐（図６、図２６〜図２９）］
遅延分岐と通常分岐の命令コードを、命令コードの最下位ビットで切替えることにより、実効アドレスの計算などを共通にできる。
【０２０７】
（５）［複数ビットシフト（図１４）］
１、２、４、８、１６ビットシフトを行うシフタ２１を用いることにより、出現頻度の高いシフトを１ステートで実行可能にするとともに、組合せて（直列に、或いは、繰り返し使用して）任意ビットのシフトを可能にすることができ、論理規模の増加も抑止できる。
【０２０８】
ビットシフトしない及び左右シフトビット数の組み合わせに対する５選択、７選択といったシフタのセレクタは、論理合成などで容易に実現可能である。多選択のセレクタは、論理合成によって、論理ゲートが多段に構成される場合が多いから、第１シフタ２７と第２シフタ２８を直列にしても大きな不都合は生じない。
【０２０９】
（６）［複数ビットシフト（図２２）］
制御信号ｓｆｔｃｎｔの状態で、次命令への遷移と、次のシフトビットの制御を行うことにより、論理記述を容易にし、資源の利用効率を向上することができる。
【０２１０】
（７）［乗算器（図１８）］
３２ビット×３２ビットの積の上位の３２ビットを得る乗算命令を除算に用いることにより、除算の効率化に寄与する。
【０２１１】
以上本発明者等によってなされた発明を実施例に限定されるものではなく、その要旨を逸しない範囲において種々変更可能である。
【０２１２】
命令コードは、簡単化のために、複数ビットシフトや、上位を取る乗算命令も１ワードとしているが、これらは複数ワード命令にすることができる。動作フローや動作タイミングもこれに伴って変更すればよい。簡単には、プリフィックスコードを付して、実質的な動作フローや動作タイミングを変えないで実現することもできる。そのほか、命令体系や命令セット即ち、命令の種類やアドレッシングモードの種類及びこれらの組合せなども任意にできる。命令フォーマットは任意に変形できる。
【０２１３】
プログラムカウンタのビット数や、アドレス空間の大きさやエリア分割、そのほかの制御レジスタの構成なども任意にできる。
【０２１４】
１６ビット命令リードと３２ビット命令リードの切替えは、内部Ｉ／Ｏレジスタの設定によるもののほか、モード信号としてのモード制御（ＭＤ０、ＭＤ１）で設定可能にしてもよい。初期値を設定可能にしてもよい。
【０２１５】
命令バッファ部のＦＩＦＯバッファの容量も８ワードに限定されない。最小限２ワード以上あればよい。容量が大きければ、省略可能なステートを持たない命令が存在した場合にも、蓄積された命令を、続く命令実行で省略するステートを大きくして、命令の量のバランスを採ることができる。ただし、容量を大きくしても、分岐命令実行時にはリードした命令が無駄になってしまうから、通常、若しくは定常的な状態で、ＦＩＦＯに存在する命令の量はあまり大きくしない方がよい。
【０２１６】
シフタ２１は２段に限定されず、３段以上でもよい。個々のシフタで実行可能なシフトビット数も任意に設定できる。シフトビット数は、命令コード中に含まれるイミディエイトデータで指定するほか、汎用レジスタの内容で指定可能にしてもよい。
【０２１７】
乗算器の詳細な構成や、制御信号入力、状態遷移なども変形可能である。また、外部バスのバス幅は内部バスのバス幅よりも狭く固定されても良い。また、外部バスのバス幅は内部バスのバス幅よりも狭い範囲で選択可能であってもよい。そのような選択制御はＣＰＵ２によるバスコントローラ３の条件設定で行なえばよい。
【０２１８】
以上の説明では主として本発明者によってなされた発明をその背景となった利用分野であるシングルチップマイクロコンピュータに適用した場合について説明したが、本発明はそれに限定されるものではなく、データプロセッサ、マイクロプロセッサ、システムＬＳＩ等と称される種々のデータ処理装置に広く適用することができる。本発明は少なくとも、命令を解読して処理し、演算処理を行う条件のものに適用することができる。
【図面の簡単な説明】
【０２１９】
【図１】本発明に係るデータ処理装置の一例であるＣＰＵの詳細を示すブロック図である。
【図２】本発明に係るデータ処理装置が適用されたシングルチップマイクロコンピュータのブロック図である。
【図３】ＣＰＵに内蔵されている汎用レジスタ及び制御レジスタの構成を例示する説明図である。
【図４】ＣＰＵのアドレス空間を例示する説明図である。
【図５】ＣＰＵの機械語の命令フォーマットの一例を示す説明図である。
【図６】本発明に関する代表的な幾つかの命令の具体的なフォーマットを例示する説明図である。
【図７】バスアクセスの制御部ＢＣＮＴの命令リードに関する論理記述を例示する説明図である。
【図８】インクリメンタＩＮＣによるプリフェッチカウンタｐｆｃの制御内容に関する論理記述を例示する説明図である。
【図９】図７及び図８の論理記述の入力条件を適宜増やすためにデータサイズによって＋１／＋２／＋４を選択する制御を含めたときの論理記述を例示する説明図である。
【図１０】第１のシフタの制御内容に関する論理記述を例示する説明図である。
【図１１】第２のシフタの制御内容に関する論理記述を例示する説明図である。
【図１２】制御信号ｓｆｔｃｎｔの機能に関する論理記述を例示する説明図である。
【図１３】命令バッファ部の詳細を例示するブロック図である。
【図１４】算術論理演算器の詳細を例示するブロック図である。
【図１５】第１のシフタの論理記述を例示する説明図である。
【図１６】第２のシフタの論理記述を例示する説明図である。
【図１７】図１６の論理記述の第１ケース、第２ケースに関する別の記述を示す説明図である。
【図１８】乗算器の詳細を例示するブロック図である。
【図１９】図１８の乗算器における乗算演算制御の状態遷移図である。
【図２０】命令バッファ部の状態を主体に転送命令（ＭＯＶ．Ｗ ＠ａａ：１６，Ｒｄ）の実行フローを示すフローチャートである。
【図２１】命令バッファ部の状態を主体に分岐命令（ＪＭＰ ＠ａａ：３２）の実行フローを示すフローチャートである。
【図２２】命令バッファ部の状態を主体に複数ビットシフト命令（ＳＨＬＬ  ＃ｘｘ，Ｒｄ）の実行フローを示すフローチャートである。
【図２３】内蔵ＲＯＭ上での命令実行タイミングを示すタイミングチャートである。
【図２４】１６ビットバスモードで外部メモリからフェッチした命令を実行する動作タイミングを示すタイミングチャートである。
【図２５】３２ビットバスモードで外部メモリからフェッチした命令を実行する動作タイミングを示すタイミングチャートである。
【図２６】通常分岐命令の第１の例の実行タイミングを示すタイミングチャートである。
【図２７】通常分岐命令の第２の例の実行タイミングを示すタイミングチャートである。
【図２８】遅延分岐命令の第１の例の実行タイミングを示すタイミングチャートである。
【図２９】遅延分岐命令の第２の例の実行タイミングを示すタイミングチャートである。
【図３０】シフト命令の第１の例の実行タイミングを示すタイミングチャートである。
【図３１】シフト命令の第２の例の実行タイミングを示すタイミングチャートである。
【図３２】乗算命令の第１の例の実行タイミングを示すタイミングチャートである。
【図３３】乗算命令の第２の例の実行タイミングを示すタイミングチャートである。
【図３４】制御ビットｂｍｏｄを生成する構成を例示するブロック図である。
【図３５】制御ビットｂｍｏｄを生成する別の構成を例示するブロック図である。
【図３６】ＣＰＵのプログラム等の開発環境の概略を示す説明図である。
【符号の説明】
【０２２０】
１  シングルチップマイクロコンピュータ
２  中央処理装置（ＣＰＵ）
２Ａ  制御部
２Ｂ  実行部
ＤＥＣ  命令デコーダ
ＵＢＵＦ  命令バッファ部
ＩＲ  命令レジスタ
ＦＢ  ＦＩＦＯバッファ
ＦＦ  フリップフロップ
ＥＲ０〜ＥＲ７  汎用レジスタ
ＡＢ  アドレスバッファ
ＡＬＵ  算術論理演算器
ＩＮＣ  インクリメンタ
ＭＵＬＴ  乗算器
ＤＢＲ  リードデータバッファ
ＤＢＷ  ライトデータバッファ
ＩＡＢ  内部アドレスバス
ＩＤＢ  内部データバス
３  バスコントローラ（ＢＳＣ）
４  割り込みコントローラ（ＩＮＴ）
５  ＲＯＭ
６  ＲＡＭ
２０  算術演算器
２１  シフタ
２７  第１シフタ
２８  第２シフタ
【図１】
2007048316.tif 000003
【図２】
2007048316.tif 000004
【図３】
2007048316.tif 000005
【図４】
2007048316.tif 000006
【図５】
2007048316.tif 000007
【図６】
2007048316.tif 000008
【図７】
2007048316.tif 000009
【図８】
2007048316.tif 000010
【図９】
2007048316.tif 000011
【図１０】
2007048316.tif 000012
【図１１】
2007048316.tif 000013
【図１２】
2007048316.tif 000014
【図１３】
2007048316.tif 000015
【図１４】
2007048316.tif 000016
【図１５】
2007048316.tif 000017
【図１６】
2007048316.tif 000018
【図１７】
2007048316.tif 000019
【図１８】
2007048316.tif 000020
【図１９】
2007048316.tif 000021
【図２０】
2007048316.tif 000022
【図２１】
2007048316.tif 000023
【図２２】
2007048316.tif 000024
【図２３】
2007048316.tif 000025
【図２４】
2007048316.tif 000026
【図２５】
2007048316.tif 000027
【図２６】
2007048316.tif 000028
【図２７】
2007048316.tif 000029
【図２８】
2007048316.tif 000030
【図２９】
2007048316.tif 000031
【図３０】
2007048316.tif 000032
【図３１】
2007048316.tif 000033
【図３２】
2007048316.tif 000034
【図３３】
2007048316.tif 000035
【図３４】
2007048316.tif 000036
【図３５】
2007048316.tif 000037
【図３６】
2007048316.tif 000038