以下、本発明について、図面を参照して実施の形態とともに詳細に説明する。
なお、実施の形態を説明するための全図において、同一機能を有するものは同一符号を付け、その繰り返しの説明は省略する。
図1に、本発明の適用されたデータ処理装置の一例であるシングルチップマイクロコンピュータ(以下、単にマイクロコンピュータと称する)のブロック図を示す。マイクロコンピュータは、CPU1、乗算器2、システムコントローラ(SYSC)3、割込コントローラ(INT)4、ROM5、RAM6、タイマA7、タイマB8、シリアルコミュニケーションインタフェース(SCI)9、A/D変換器10、第1乃至第9入出力ポート(IOP1〜IOP9)11A〜11I、クロック発振器(CPG)12の機能ブロック乃至はモジュールから構成され、公知の半導体製造技術により1つの半導体基板上に半導体集積回路装置として形成される。CPU1は、乗算器2を内蔵してなる。システムコントローラ(SYSC)3は、システムコントロールレジスタ(SYSCR)13および制御レジスタ(CPUCR)14を内蔵している。
かかるマイクロコンピュータは、電源端子として、グランドレベル(Vss)、電源電圧レベル(Vcc)、その他専用制御端子として、リセット(RES)、スタンバイ(STBY)、モード制御(MD0〜2)、クロック入力(EXTAL、XTAL)端子を有する。クロック入力(EXTAL、XTAL)端子に接続される、図示はされない水晶振動子に基づいて、クロック発振器が生成するシステムクロック(φ1、φ2)に同期して、マイクロコンピュータは動作する。或は外部クロックをEXTAL端子に入力してもよい。システムクロックの1周期を1ステートと呼ぶ。
これらの機能ブロックは、内部バスによって相互に接続される。内部バスは内部アドレスバス(PAB)・内部データバス(PDB)の他、リード信号・ライト信号を含み、さらにバスサイズ信号或いはシステムクロック(φ1、φ2)などを含む。
入出力ポートは、外部バス信号、入出力回路の入出力信号と兼用とされている。これらは、動作モードあるいはソフトウェアの設定により、機能を選択されて、使用される。IOP1〜3はアドレスバス出力、IOP4、5はデータバス入出力、IOP6はバス制御信号入出力信号と兼用されている。外部アドレスは、それぞれ、これらの入出力ポートに含まれるバッファ回路を介して内部アドレスバスと接続されている。
内部バスおよび外部バス共に16ビットバス幅とし、バイトサイズ(8ビット)およびワードサイズ(16ビット)のリード/ライトを可能にする。なお、内部バスおよび外部バスのいずれも8ビット幅とすることもできる。バス制御信号入出力信号には、アドレスストローブ信号AS、リード信号RD、ライト信号HWR・LWR、ウェイト信号WAIT、エリア0選択信号CS0などがある。割込信号は、タイマ・SCI・IOP8から要求され、割込コントローラ(INT)が調停して、CPUに割込を要求する。このとき、CPUに対し、割込要求信号とベクタ番号を与える。
RES端子にリセット信号が加えられると、モード端子(MD0〜2)で与えられる動作モードを取り込み、マイクロコンピュータはリセット状態になる。モード端子で設定する動作モードは、シングルチップ/拡張、アドレス空間、内蔵ROMの有効/無効、データバス幅の初期値を8ビットまたは16ビットから選択する。
図2に、システムコントロールレジスタ(SYSCR)3の構成を示す。各ビットの内容を表1乃至表4に示す。
なお、ビット2、1:リザーブビット
リードすると常に”0”が読み出される。ライトは無効である。
以下に、表5にCPU1の命令セットを示す。本実施の形態に用いられるCPU1の命令は合計で71種類ある。表6に命令とアドレッシングモードとの組み合わせを示す。表7に以下の各表に使用される記号(オペレーションの記号)の意味を示す。表8乃至表15に各命令の機能別一覧表を示す。
基本的な命令は平成5年6月(株)日立製作所発行『H8/300Hシリーズプログラミングマニュアル』などに記載のCPUと同様であり、いわゆる、ロードストアアーキテクチャを採用している。命令とアドレッシングモードの組み合わせを削減し、CPUの命令制御の論理規模・物理的規模を縮小できる。
本発明のCPUは、上記従来CPUに対して命令実行時間の高速化を実現している。
CPUの命令は、2バイト(ワード)を単位にしている。各命令は下記のようなオペレーションフィールド(op)、レジスタフィールド(r)、EA拡張部(EA)、およびコンディションフィールド(cc)から構成されている。
(1)オペレーションフィールド
命令の機能を表し、アドレッシングモードの指定、オペランドの処理内容を指定する。命令の先頭4ビットを必ず含んでいる。2つのオペレーションフィールドを持つ場合もある。
(2)レジスタフィールド
汎用レジスタを指定する。アドレスレジスタのとき3ビット、データレジスタのとき3ビットまたは4ビットである。2つのレジスタフィールドを持つ場合、またはレジスタフィールドを持たない場合もある。
(3)EA拡張部
イミディエイトデータ、絶対アドレスまたはディスプレースメントを指定する。8ビット、16ビット、または32ビットである。
(4)コンディションフィールド
Bcc命令の分岐条件を示す。
図3に、命令の基本フォーマットの例を示す。
図4に、マイクロコンピュータにおいて、CPU1に対し乗算器2を取外し可能に設けた概略ブロック図を示す。命令レジスタ(IR)21、命令デコーダ・制御回路(CONT)22、レジスタセレクタ(RSEL)23、ライトデータバッファ(DBW)24、リードデータバッファ(DBR)25、演算器(ALU)26、演算器(INC)27、汎用レジスタ(ER0〜ER7)28A〜28H、エミュレータスタックポインタ(EMLSP)29、プログラムカウンタ(PC)30、コンディションコードレジスタ(CCR)31、拡張レジスタ(EXR)32、アドレスバッファ(MAB)33からなる。乗算器2なしのCPU1はこれらによって構成される。各バッファやレジスタ、演算器の各ブロックの機能は、特開平5−241826号公報に記載のCPUと概略同様である。また、乗算器2を含むCPU1は、更に、バススイッチ34、乗算器2がある。
命令デコーダ・制御回路(CONT)22には、制御信号CPUS、制御信号INTM1、そのほかの制御信号(割り込み要求など)が入力されている。CONT22は各部を制御するための、出力タイミングの相違する制御信号A、B、Cを出力する。
なお、図中のC1およびC2は、当該信号の同期タイミングを示す。例えば、RSEL入力1のC1はφに同期して入力が行われることを示し、RSEL入力2のC2はφ#(#は論理反転)に同期して入力が行われることを示す。また、ALU入力のC1は、φの期間に入力が行われることを示し、ALU出力のC2は、φ#の期間に出力が行われることを示す。ALU26とINC27は、それぞれ動作タイミングの異なった演算器であり、それぞれ、オーバラップしつつ演算可能である。
そのほかのレジスタなどは、φ、φ#の両方でデータを入出力可能である。GB、DB、WBの各バスはφ、φ#の両方で異なったデータを転送可能である。φ、φ#は互いにノーオーバラップの関係の2相クロックとしてもよい。
レジスタセレクタ(RSEL)23には、IR21乃至CONT22から命令コードの一部(レジスタ指定フィールド)が与えられる。この供給タイミングは、レジスタ指定フィールドの位置によって相違される。RSEL23は出力タイミングの相違するレジスタ選択信号A、Bを出力する。
例えば、平成5年6月(株)日立製作所発行『H8/300Hシリーズプログラミングマニュアル』に記載のCPUにおいては、16ビット単位の命令コードのビット7−4が、CONT22と同時に与えられ(RSEL入力1)、ビット11−8および3−0(RSEL入力2)が、CONT22の内容と0.5ステート遅れて与えられる。RSEL入力2の反転制御信号をRSELに与える。
CPU1内部のDBW24、DBR25、ALU26、INC27、ER0〜ER7(28A〜28H)、PC30、CCR31、VAG、ABは、GBバス、DBバス、WBバスによって相互に接続されている。
2つの演算器ALU26、INC27に対し、GB、DBバスからデータを入力し、WBバスにデータを出力する。それぞれの入出力バスの数に対応した数の内部バスとして、バス即ち配線の増加による物理的規模の増加を抑止している。
また、ライトデータバッファ(DBW)24は内部データバスへの出力、リードデータバッファ(DBR)25は内部データバスからの入力、アドレスバッファ(MAB)33は内部アドレスバスへの出力、命令レジスタは内部データバスからの入力が可能であり、それぞれ内部バスに接続されている。ライトデータバッファ(DBW)24およびリードデータバッファ(DBR)25は32ビット構成とされる。ライトデータは32ビット一括してライトデータバッファ(DBW)24に書き込むことができ、所定のタイミングで、16ビットの内部データバスに出力される。また、内部データバスから読み出したデータを、リードデータバッファ(DBR)25に一旦格納して、32ビットのリードデータを一括して出力することができる。MABは+2のインクリメント機能を有する。
命令デコーダ・制御回路(CONT)22が、IR21からの入力、CPUS信号、INTM1信号やそのほかの入力信号に基づいて、動作制御を行なう。制御回路の出力は所定のバッファを介して出力される。CONT22自身にも、ステート番号などがフィードバックされる。
アドレスバッファ(MAB)33はインクリメント機能(+2)を有する。ER0〜ER7(28A〜28Hは)データレジスタまたはアドレスレジスタとして使用することができる。
EMLSP29は、ユーザには公開されていないリソースで、エミュレータに搭載されて動作するとき、ユーザプログラムとエミュレーションプログラムの間の遷移時のスタックポインタとして使用する。その内容を指定するために、一部の内容が、CPU外部から与えられる。
PC30は32ビットのカウンタであり、CPU1が次に実行する命令のアドレスを示している。コンディションコードレジスタ(CCR)31は割り込みマスクビット(I)、キャリフラグ(C)、ゼロフラグ(Z)、ネガティブフラグ(N)、オーバフローフラグ(V)を含んでいる。
CPU1と乗算器2は、バススイッチ34を介して接続されている。また、バススイッチ34は内部データバスとのインタフェースも行なう。また、CPU1から乗算器2への制御信号を与える。乗算器2のステータス信号BUSYと、フラグ検出信号をCPU1に与える。TESTMODE信号を、例えば、SYSC3から与える。制御信号CPUSは、SYSCR14あるいはそのほかのレジスタの制御ビットの出力にしてもよいし、マイクロコンピュータの制御端子のようなもので指定してもよい。
図5に、制御信号CPUSを制御レジスタ(CPUCR)14の制御ビットで構成した具体的な例を示す。図は1ビットの構成を示している。CPUCR14は、フリップフロップで構成される。フリップフロップにはリセット信号が与えられる。フリップフロップのクロックは内部ライト信号と、アドレスをデコードして得られるCPUCR選択信号の論理積信号とされる。データ入力はデータバスのビット8とされる。出力がCPUS信号とされる。また、クロックトバッファCBF6を介して、データバスに出力される。クロックトバッファCBF6のクロックは内部ライト信号とCPUCR選択信号の論理積信号とされる。
本レジスタのライトは、テストモードや、エミュレータに搭載した場合のブレークモードなどでのみライト可能にするとよい。ブレークモードなどについては、特開平6−150026などに記載されている。同様に、TESTMODE信号を生成することができる。同一のレジスタに配置することができる。
図6に、制御信号CPUSの設定方法の一例として、エミュレーション用プロセッサおよびエミュレータをブロック図で示す。エミュレーション用プロセッサ38は、マイクロコンピュータ部分にエミュレーション用インタフェース39を加えて構成される。エミュレーション用インタフェース39には、エミュレーション用プロセッサ専用の制御レジスタ41を有する。メモリ42は、ROM、RAMを含み、I/OはI/Oポート、タイマ、SCIなどを含む。
コネクタ部がマイクロコンピュータの代わりに応用システム(ユーザシステム)43に装着される。エミュレーション用プロセッサ38は上記コネクタ部とインタフェースケーブル44を介し、ターゲットシステムインタフェースを用いて上記応用システム43と信号の入出力を行なう。
応用システム(ユーザシステム)43には、特に制限はされないものの、ユーザバス45が存在し、ユーザメモリ46が接続される。エミュレーション用プロセッサ38が出力し、インタフェースケーブル44を介して供給されるユーザストローブ信号に従って、ユーザメモリ46はリード/ライトされる。
一方、エミュレーション用プロセッサ38は上記エミュレーションインタフェース39を用いてエミュレーションバス47に接続される。エミュレーションバス47には図示はされない状態信号・制御信号などを含む。上記エミュレーションバス47を用いて、エミュレーション用プロセッサ38から、応用システム43とエミュレーション用プロセッサ38の内部状態に応じた情報などが出力され、また、エミュレーション用プロセッサ38に対し、エミュレーションのための各種制御信号が入力される。エミュレーション用プロセッサ38の、図示はされないエミュレートモード端子が電源レベルに固定され、エミュレーション用プロセッサ38内部ではエミュレートモードが設定される。
さらに、上記エミュレーションバス47には、特に制限はされないものの、応用システム43またはターゲットマイクロコンピュータ内蔵のメモリを代行するためのRAMでなるようなエミュレーションメモリ48がある。また、エミュレーション用プロセッサ38の制御状態やエミュレーションバス47の状態を監視して、その状態が予め設定された状態に達した時に、上記エミュレータ専用割込みを入力して、CPUによるユーザプログラムの実行を停止させ、エミュレーション用プログラム実行状態に遷移させる(ブレーク)ためのブレーク制御回路49と、上記CPUのリード動作またはライト動作を示す信号、命令リード動作を示す信号などに基づき、エミュレーションバス47に与えられるアドレスデータさらには制御情報を逐次蓄えるリアルタイムトレース回路50などが接続される。
上記エミュレーションバス47が、エミュレーションメモリ48、ブレーク制御回路49、リアルタイムトレース回路50などに、それぞれ接続される。これらでもってマイクロコンピュータ開発装置55が構成されている。
上記エミュレーションメモリ48、ブレーク制御回路49、リアルタイムトレース回路50はコントロールバス51に接続され、コントロールバス51を介してコントロールプロセッサ52の制御を受けるようになっている。上記コントロールバス51は、エミュレーション用プロセッサ制御回路に接続されるとともに、インタフェース回路を介して、特に制限はされないもののパーソナルコンピュータなどのシステム開発装置54に接続される。例えば、システム開発装置54から入力されたプログラムをエミュレーションメモリ48に転送し、内蔵ROM上に配置されるべきかかるプログラムをCPU1がリードすると、エミュレーションメモリ48上のプログラムがリードされる。また、ブレーク条件や、リアルタイムトレース条件などもシステム開発装置54から与えることができる。
コントロールプロセッサ52は、CPUS信号をエミュレーション用プロセッサ38に供給して、乗算器の使用/不使用の選択を行なうことができる。コントロールプロセッサ52は、システム開発装置54から入力された情報などに基づいて、CPUS信号を制御する。あるいは、図5のような制御レジスタを、エミュレーション用インタフェース39内に制御レジスタに設けて、エミュレータ40のソフトウェアをCPUが実行して、前記制御レジスタを指定することによって、CPUS信号を生成するようにすることができる。この場合は、エミュレーション用ソフトウェアの実行モード、いわゆるブレークモードでのみライト可能にすると都合がよい。開発途上にあるユーザのソフトウェアの誤動作によって、誤った設定を行なうことがない。
エミュレーション用プロセッサ38およびエミュレータ40を複数のCPUをサポート可能にすることによって、実際のマイクロコンピュータのみを開発すればよく、開発効率を向上することができる。なお、EMLSP29のアドレス指定情報も、エミュレーション用インタフェース39内の制御レジスタで指定することができる。
エミュレーション用プロセッサ38やエミュレータ40については、特開平3−271834号公報、あるいは特開平6−150026号公報などに記載されている。
図7に、制御信号CPUS設定方法の一例である、マイクロコンピュータの主要部をブロック図で示す。CPUS信号をレジスタによらず、CMOSインバータ回路58の出力とする。かかるCMOSインバータ回路58は、Pチャネル型MOSトランジスタQ1、Nチャネル型MOSトランジスタQ2で構成される。このCMOSインバータ回路58の入力は、抵抗Rを介して電源Vddに接続されると共に、保護回路Q3、Q4を介して端子Pに結合される。端子Pは、ワイヤWによってグランドレベル電源用リードLに接続されるか、解放状態とされるかが選択され、CPUSの設定を行なう。
端子Pが解放状態とされれば、CMOSインバータ回路58の入力はハイレベルとなって、CPUS信号は非活性状態になる。一方、端子Pが、ワイヤWによって、グランドレベル電源用リードLに接続されれば、CMOSインバータ回路58の入力はロウレベルとなって、CPUS信号は活性状態になる。乗算器を使用可能にする。
端子Pは対応するリードを持たず、例えばプラスティックパッケージに封止された場合には、対応する端子を持たない。
これにより、半導体集積回路装置のパッケージの端子を直接利用することなく、乗算器の制御を設定できるため、一定のパッケージを用いた場合に、有効な端子数の減少を防ぐことができる。この場合、端子Pをグランドレベル電源端子に隣接して配置すると都合がよい。
あるいは、端子Pをグランドレベル電源用リードLにワイヤWによって接続するか、しないかの選択を、半導体集積回路装置の配線変更として実現してもよい。CMOSインバータ回路58の入力を、半導体集積回路装置内部の電源電圧またはグランドのいずれに接続するかを選択すればよい。このとき、抵抗R及び端子Pは削除することができる。または、CPUSビットをPROM素子などで構成してもよい。この場合、製造者が設定を行なってもよいし、ユーザが設定を行なってもよい。
図8および図9に、CPUの内部レジスタ構成を示す。これらのレジスタは、図8の汎用レジスタおよび図9のコントロールレジスタの2つに分割される。以下、各レジスタについて説明する。
(1)汎用レジスタ
CPUはこの汎用レジスタを8本有している。この汎用レジスタは32ビット長からなり、すべて同じ機能を有しており、アドレスレジスタとしてもデータレジスタとしても使用することができる。データレジスタとしては32ビット、16ビットおよび8ビットレジスタとして使用できる。
アドレスレジスタ及び32ビットレジスタとしては、一括して汎用レジスタER(ER0〜ER7)として使用する。16ビットレジスタとしては、汎用レジスタERを分割して汎用レジスタE(E0〜E7)、汎用レジスタR(R0〜R7)として使用する。これらは同等の機能を有しており、16ビットレジスタを最大16本まで使用することができる。
8ビットレジスタとしては、汎用レジスタRを分割して汎用レジスタRH(R0H〜R7H)、汎用レジスタRL(R0L〜R7L)として使用する。これらは同等の機能を有しており、8ビットレジスタを最大16本まで使用することができる。
図10に、汎用レジスタの使用方法を示す。各レジスタは独立して使用方法を選択することができる。
汎用レジスタER7には、汎用レジスタとしての機能に加えて、スタックポインタ(SP)としての機能が割り当てられており、例外処理やサブルーチン分岐などで暗黙的に使用される。図11にスタックの状態を示す。
(2)コントロールレジスタ
コントロールレジスタは、24ビットのプログラムカウンタ(PC)と8ビットの拡張レジスタ(エクステンドレジスタ)(EXR)および8ビットのコンディションコードレジスタ(CCR)を含んでいる。
1.プログラムカウンタ(PC)
24ビットのカウンタで、CPUが次に実行する命令のアドレスを示している。CPUの命令は、すべて2バイト(ワード)を単位としているため、最下位ビットは無効である。(命令コードのリード時には最下位ビットは”0”とみなされる)。
分岐命令の実行アドレスの上位8ビットは無視される。プログラム領域として使用できるのは、H’00000000〜H’00FFFFFFの領域である。
2.拡張レジスタ(EXR)
8ビットのレジスタで、トレースビット(T)、割込みマスクビット(I2〜I0)を含む8ビットで構成されている。
ビット7:トレースビット(T)
トレースビットか否かを指定する。本ビットが”0”にクリアされているときは命令を順次実行する。”1”にセットされているときは1命令実行する毎にトレース例外処理を実行する。
ビット6〜4:リザーブビット
リザーブビットである。
ビット2〜0:割込みマスクビット(I2〜I0)
割込み要求マスクレベル(0〜7)を指定する。
EXRは、LDC、STC、ANDC、ORC、XORC命令で実行することができる。このうち、STCを除く命令を実行した場合、実行終了後3ステートの間は、NMIを含めてすべての割込みは受け付けられない。
3.コンディションコードレジスタ(CCR)
8ビットのレジスタで、CPUの内部状態を示す。割込みマスクビット(I)とハーフキャリ(H)、ネガティブ(N)、ゼロ(Z)、オーバフロー(V)、キャリ(C)を含む8ビットで構成されている。
ビット7:割込みマスクビット(I)
本ビットが”1”にセットされると、割込みがマスクされる。ただし、NMIはIビットに関係なく受け付けられる。例外処理の実行が開始されたときに”1”にセットされる。
ビット6:ユーザビット/割込みマスクビット(UI)
ソフトウェア(LDC、STC、ANDC、ORC、ZORC命令)でリード/ライトできる。割込みマスクビットとしても使用可能である。
ビット5:ハーフキャリフラグ(H)
ADD.B、ADDX.B、SUB.B、SUBX.B、CMP.B、NEG.B命令の実行により、ビット3にキャリまたはボローが生じたとき”1”にセットされ、生じなかったとき”0”にクリアされる。また、ADD.W、SUB.W、CMP.W、NEG.W命令の実行により、ビット11にキャリまたはボローが生じたとき、ADD.L、SUB.L、CMP.L、NEG.L命令の実行により、ビット27にキャリまたはボローが生じたとき、”1”にセットされ、生じなかったとき”0”にクリアされる。
ビット4:ユーザビット(U)
ソフトウェア(LDC、STC、ANDC、ORC、XORC命令)でリート/ライトできる。
ビット3:ネガティブフラグ(N)
データの最上位ビットを符号ビットとみなし、最上位ビットの値を格納する。
ビット2:ゼロフラグ(Z)
データがゼロのとき”1”にセットされ、ゼロ以外のとき”0”にクリアされる。
ビット1:オーバフローフラグ(V)
算術演算命令により、オーバフローが生じたとき”1”にセットされる。それ以外のとき”0”にクリアされる。
ビット0:キャリフラグ(C)
演算の実行により、キャリが生じたとき”1”にセットされ、生じなかったとき”0”にクリアされる。キャリには次の種類がある。
(a)加算結果のキャリ
(b)減算結果のボロー
(c)シフト/ローテートのキャリ
また、キャリフラグには、ビットアキュムレータの機能があり、ビット操作命令で使用される。なお、命令によってはフラグが変化しない場合がある。CCRは、LDC、STC、ANDC、ORC、XORC命令で操作することができる。また、N、Z、V、Cの各フラグは、条件分岐命令(Bcc)で使用される。
4.積和レジスタ(MAC)
64ビットのレジスタであり、積和演算結果を格納する。32ビットのMACH、MACLから構成される。MACHは下位10ビットが有効であり、上位は符号拡張されている。
図12に、CPUの基本動作タイミングを示す。
ADD.W R0、R1のようなレジスタ間演算のタイミングである。特に制限はされないものの、内部データバスは16ビットであって、内蔵ROM、RAMのリード/ライトを1ステートでリード/ライト可能とする。
T0のC2(φ#同期。#は反転論理を示す)で、CPU1のアドレスバッファ(MAB)33からアドレスがIABに出力される。
T1のC1(φ同期)で、IABの内容がPABに出力され、リードサイクルが開始される。C2でリードデータが内部データバスに得られ、これをIR21にラッチする。以上の動作は以前の命令の実行の制御によって行われる。
直前の命令の実行が終了すると、最も早く命令の実行が開始される場合には、T2のC1で命令コードがCONT22に入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行なう。命令の一部(レジスタ指定フィールド:RSEL入力信号1)がレジスタセレクタ23に与えられる。
レジスタ間演算命令では、T2のC2で、PCの内容を内部バスGBに読み出して、MAB33とINC27に入力する。MAB33からアドレスIABが出力される。レジスタセレクタ23に制御信号を与える。RSEL入力信号1と制御信号A(Rs−DB出力、Rd−GB出力)とに基づいて、レジスタ選択信号Bが生成される。RSEL入力信号2がレジスタセレクタ23に与えられる。
T3から、次の次の命令がリードされる。T3のC1で、INC27でインクリメント(+2)された結果が、内部バスWBを経由して、PC30にライトされる。RSEL入力信号2と制御信号B(WB−Rd入力)とに基づいて、レジスタ選択信号Cが生成される。レジスタ選択信号Bがレジスタを選択して、ソース側、デスティネーション側のレジスタ(S、D)のデータをALU26に入力する。ALU26の演算内容はCONT22が制御信号Cによって指示する。加減算・論理演算・シフトなどは1クロックで演算を行なうことができる。例えば、上記命令では16ビットの加算を行なう。次の命令のCONT22へのロードを指示する。RSEL入力信号2と制御信号B(WB−Rd入力)とに基づいて、レジスタ選択信号Cが生成される。
T3のC2で、ALU26の演算結果(R)が、内部バスWBを経由して、レジスタ選択信号Cが選択したデスティネーション側のレジスタにライトされる。制御信号Cによって、CCR31の更新を行なう。更に次の次の命令をIR21に取り込む。同時に、次の命令の実行が開始され、例えば、PC30の内容を読み出して、MAB33とINC27に入力される。レジスタ間演算を実質的に1ステートで実行できる。2つの演算器26、27の入出力バスの数に対応した数の内部バスとして(演算器に対応して、内部バスを増加させることなく)、バス即ち配線の増加による物理的規模の増加を抑止している。
図13に、CPUの基本動作タイミングを示す。
MOV.W R0、@R1のような、レジスタ間接によるデータライトのタイミングである。
T0のC2で、CPU1のMAB33からアドレスがIABに出力される。
T1のC1で、アドレスがPABに出力され、リードサイクルが開始される。C2でリードデータが内部データバスに得られ、これをIR21にラッチする。
直前の命令の実行が終了すると、T2のC1で命令コードがCONT22に入力されて、命令の内容が解読され、各部の制御を行なう。命令の一部のレジスタ指定フィールド(RSEL入力信号1)がレジスタセレクタ23に与えられる。レジスタ間接によるデータライトでは、制御信号AとRSEL入力信号1とに基づいて、レジスタ選択信号Aが与えられ、アドレスとして指定されたレジスタが選択される。
T2のC2で、選択されたレジスタの内容(A)を内部バスGBに読み出して、MAB33を経由してアドレスIABに出力される。RSEL入力信号2がレジスタセレクタ23に与えられる。RSEL入力信号2と制御信号B(Rd−DB出力)とに基づいて、レジスタ選択信号Bが生成される。
T3のC1で、制御信号Cの一部がCONT22に入力され、状態遷移が行われる(ステートマシンが構成される)。IABの内容に基づいて、ライトサイクルが開始される。選択されたレジスタの内容(D)を内部バスDBに読み出して、データバッファ(DBW)を経由して内部データバスに出力される。
T3のC2で、PC30の内容を内部バスGBに読み出して、MAB33とINC27に入力する。MAB33からアドレスIABが出力される。RSEL入力信号1と制御信号A(Rd−GB出力)とに基づいて、レジスタ選択信号Bが生成される。
T4から、次の次の命令がリードされる。
T4のC1で、INC27でインクリメント(+2)された結果が、内部バスWBを経由して、PC30にライトされる。レジスタ選択信号Bがレジスタを選択して、データレジスタ(D)のデータをALU26に入力する。ALU26の演算内容はCONT22が制御信号Cによって指示する。転送の場合はデータのチェックのみを行なう。次の命令のCONT22へのロードを指示する。
T4のC2で、制御信号Cによって、チェックした結果によって、CCR31の更新を行なう。更に次の次の命令をIR21に取り込む。同時に、次の命令の実行が開始され、例えば、PC30の内容を読み出して、MAB33とINC27に入力される。
RSELに入力するタイミングを、RSEL入力1(アドレスレジスタ、ソースレジスタ)とRSEL入力2(データレジスタ、ディスティネーションレジスタ)のように、レジスタ指定フィールド毎にことなったタイミング(φ同期とφ#同期)とすることにより、命令実行の高速化を実現することができる。
表16乃至表19に、本発明に関係のある命令の説明を示す。
表16は命令コードを示し、表18は命令の実行状態を示し、表19はコンディションコードの変化を示している。表17はレジスタフィールドと汎用レジスタの対応を示している。
積和演算を行なうMAC命令、MACレジスタをクリアするCLRMAC命令、汎用レジスタの内容をMACレジスタに転送するLDMAC命令、MACレジスタの内容を汎用レジスタに転送するSTMAC命令がある。
また、汎用レジスタの待避/復帰命令には、1本のレジスタの待避/復帰命令に、PUSH、POP命令が、複数レジスタの待避/復帰命令にSTM/LDM命令がある。STM/LDM命令には、指定するレジスタ本数に対応して3種類がある。
図14に、乗算器2の概略ブロック図を示す。
乗算器2は、入力ラッチ(X)61、入力ラッチ(Y)62、部分積生成回路63、マツチプレクサ64、デコーダ65A、65B、65C、選択回路66A、66B、66C、加算器67、フィードバック回路68、乗算結果レジスタ69などによって構成されている。
乗算器2は16×16ビットの乗算を行なうことを基本動作とし、さらに、これを利用して、16×16ビット+42ビットの積和演算を可能としている。
乗算器は乗算動作は、2次のブースのデコードを用いて、16ビット×6ビットを3回行なうようにされる。
16ビットの乗数Yは、Y=−y[16]・2^15+Σ(y[i]・2^(i−1))=Σ(y[2j]+y[2j+1]−2・y[2j+2])・2^2jと表現される。i=1〜15、j=0〜7、y[0]=0である。
被乗数Xとの乗算は、X・Y=Σ(y[2j]+y[2j+1]−2・y[2j+2])・X・2^2jとなる。y[2j]+y[2j+1]−2・y[2j+2]は、y[2j]、y[2j+1]、y[2j+2]の値の組み合わせにより、0、±1、±2の5種類があるから、部分積(y[2j]+y[2j+1]−2・y[2j+2])・Xは、0、±X、±2Xの5種類である。この内、0、Xは直ちに得られる。2Xは、1ビットの左シフト(最下位ビットは0)、−Xは2の補数であり、論理反転+1で得られる。−2Xは、論理反転+1の1ビットの左シフト(最下位ビットは0)で得る。
X側は、採りうる0、±X、±2Xの5種類の部分積(17ビット)を生成しておく。この5種類を部分積選択回路66A〜66Cに与える。
一方、Y入力のy[2j]、y[2j+1]、y[2j+2]をデコードして、0、±1、±2を判定して、この結果によって、部分積選択回路66A〜66Cを制御して、前記5種類の部分積を選択する。1回に2ビット単位3種類の選択を行なう。これを加算器67で加算する。加算は、2ビットずつシフトしたそれぞれ17ビットの部分積を加算して、22ビット分の結果を得る。不足する上位ビットは符号拡張したデータとする。
この内、下位6ビットは、乗算結果レジスタ69のビット0〜5に格納される。上位16ビットはフィードバック回路68を介して、2回めの加算に含められる。2回目の処理では、前記同様に得られた部分積選択回路66A〜66Cの出力である、2ビットずつシフトしたそれぞれ17ビットの部分積と、1回めの処理の上位16ビットを加算する。22ビット分の結果を得る。不足する上位ビットは符号拡張したデータとする。この内、下位6ビットは、乗算結果レジスタ69のビット11〜6に格納される。上位16ビットはフィードバック回路68を介して、2回めの加算に含められる。
同様に3回めの処理が行われる。加算結果下位20ビットが乗算結果レジスタ69のビット31〜12に格納される。加算結果の最上位2ビットは無視する。
積和演算の場合は、前回の結果が同時に加算されるようにする。
更に、前回の結果の上位ビットとの4回目の加算を行って、42ビットの結果を得る。16ビット×16ビットの積和の結果を42ビットで得ることにより、約1000回の積和演算を繰り返してもオーバフローしないことになる。
内部論理の構成上は、40ビットの結果とすれば、加算器が22ビット長でよく、論理的規模を最適化できる。
図15に、上記のワードサイズ乗算(16ビット×16ビット)の演算方法を示す。
8ビット×8ビットのバイトサイズ乗算は、上位を拡張する。符号無しの場合0拡張、符号付きの場合符号拡張を行なう。いずれの場合も、上位は全ビット”0”か全ビット”1”かのいずれかであって、ブースのデコードは0になる。このため、3回目の処理は行なわずに、2回の処理で済む。
図4において、CPU1から乗算器2に、乗算を示す信号として、MUL信号(制御信号B)、符号付き/無しを示す信号としてUNSINP信号(制御信号B)、バイト/ワードサイズを示す信号として、BYTE信号(制御信号B)、積和演算の起動信号として、MAC信号(制御信号B)、MACHからCPUへのデータ転送要求信号として、STMACH信号(制御信号C)、MACLからCPUへのデータ転送要求信号として、STMACL信号(制御信号C)、CPUからMACHへのデータ転送要求信号として、LDMACH信号(制御信号B)、CPUからMACLへのデータ転送要求信号として、LDMACL信号(制御信号B)、MACレジスタのクリア信号として、CLRMAC信号(制御信号B)、乗数の転送信号として、STX信号(制御信号B)、被乗数の転送信号として、STY信号(制御信号B)、乗算結果の転送信号として、MULRD信号(制御信号C)を与える。
また、乗算器2からCPU1へ、演算実行中を示す信号として、BUSY信号、フラグに反映すべきデータとして、VFLAG、ZFLAG、NFLAG信号が与えられる。
CPU−乗算器の相互のデータ転送にXバス、Yバスを使用する。
また、SYSCR13から飽和演算の選択を示す信号として、FIXED信号が与えられる。また、テストモード信号として、TESTMODE信号が与えられる。TESTMODE信号が活性状態になって、テストモードが指示されると、乗算器は1回の処理のみで動作を終了するようにする。
処理を短縮することによって、CPUの命令実行ステートも短縮できる。入力データの組み合わせを種々変更してテストする場合に、テスト時間を短縮できる。加算を1回しか行なわないので、テスト設計を容易にすることができる。3回の処理を行って、加算結果が蓄積されて、所望の動作のテストの結果を演算結果として得にくくなることがない。
TESTMODE信号が非活性状態であっても、CPU乃至乗算器のテストを行なうことができることは言うまでもない。TESTMODE信号は、前記のCPUSのようにレジスタの出力として供給することができる。
表20に乗算器2の内部のフラグの検出方式およびCPU1への転送方式を示す。
乗算器2のフラグ仕様は次のように、1.Vフラグおよび2.Nフラグ、Zフラグから構成されている。
1.Vフラグ
セット条件はMAC命令実行中にオーバフローまたはアンダフローが発生したときである。
クリア条件はLDMACまたはCLRMAC命令を実行したときである。
乗算器からCCRへの転送は、STMAC実行時に行われる。
従って、一連の連続した積和演算中に1回でもオーバフローまたはアンダフローが発生すると、乗算器のVフラグはセットされた状態を保持する。LDMACまたはCLRMAC命令を実行して、新しい一連の積和演算の開始が判断されると、乗算器のVフラグはクリアされる。
2.Nフラグ、Zフラグ
MUL命令用N、ZフラグとMAC命令用N、Zフラグを別々に設けて出力する。
乗算器からCCRへの転送は、乗算(MUL)命令の場合、乗算結果の転送時、MAC命令の場合STMAC実行時に行われる。
なお、NフラグとZフラグは、LDMAC/CLRMACによって変化しない。
図16にVフラグ仕様の実現の概念図を示し、図17にNフラグ、Zフラグ仕様の実現の概念図を示す。
Vフラグはセットリセット型のフリップフロップ(RS−F/F)で構成され、一旦、オーバフローまたはアンダフローが発生すると、STMACにより読み出すまで状態を保持する。
N、Vフラグはラッチ回路(D−F/F)とマルチプレクサ(MPX)で構成される。MAC命令実行時の演算結果はラッチ回路に保持され、マルチプレクサに与えられる。また、乗算命令実行時の演算結果は、直接マルチプレクサに与えられる。マルチプレクサはSTMAC命令のときラッチ回路の出力を出力し、それ以外のとき演算結果を直接出力する。
MAC命令とその他の命令は並列して動作する。MAC命令のフラグを随時CCRに反映しては、並列実行中の命令のフラグ動作と矛盾してしまう。MAC命令のフラグを乗算器内部で保持して、STMAC命令実行時にCCRに転送するようにして、上記矛盾を回避することができる。
図18に、バススイッチ34のブロック図を示す。
バススイッチ34は、選択回路71A、71B、拡張回路72A、72B、72C、出力バッファ73A、73B、73C、73Dから構成される。バススイッチは、CPU内部バスのGB、DB、WBと、乗算器のXバス、Yバスと、マイクロコンピュータの内部バスであるIDBのインタフェースを行なう。
乗算の開始時、及びLDMAC命令の場合は、GB、DBからXバス、Yバスに入力される。GB、DBの入力は、選択回路71A、71Bで選択される。これは汎用レジスタ及び内部バスが32ビット構成であるために、乗数、被乗数が8ビットまたは16ビットであるために、CONT22の制御信号A及びレジスタ制御信号Aに基づいて、所定の部分が選択される。
選択回路71A、71Bの出力は、拡張回路72A、72Bに入力される。CONT22の制御信号Aに基づいて、符号無しバイトサイズ乗算(MULXU.B)の場合、上位8ビットを0拡張する。また、符号付きバイトサイズ乗算(MULXS.B)の場合、上位8ビットを符号拡張する。ワードサイズの場合は、選択回路71A、71Bの出力をそのまま出力する。
選択回路71A、71Bの出力は出力バッファ73B、73Cに入力される。CONT22の制御信号Aに基づいて、所定のタイミングで、拡張回路72A、72Bの出力をXバスまたはYバスに出力する。
乗算の終了時、及びSTMAC命令の場合は、Xバス、YバスからWBへの出力が行われる。Xバス、Yバスの入力は拡張回路72Cに入力される。これは、MACHの上位22ビットを符号拡張する。拡張回路72Cの出力は出力バッファに入力される。CONT22の制御信号Cに基づいて、所定のタイミングで、拡張回路72Cの出力をWBに出力する。
MAC命令のデータリード時、IDBからXバス、Yバスへの入力が、それぞれ1回ずつ行われる。CONT22の制御信号Aに基づいて、所定のタイミングで、IDBの内容をXバスまたはYバスに出力する。また、IDBは、DBWからの出力を入力可能とされ、DBR及びIRへデータを入力可能とされる。
図19、20に、MAC命令の動作タイミングを示す。
例えば、MAC @ER1+,@ER2+命令などの例である。この場合のER1を第1のアドレスレジスタ、ER2を第2のアドレスレジスタとする。前記同様に、T2からMAC命令の実行が開始される。
まず、プリフィックスコードの実行を行い、PC30の内容をアドレスとした命令のリードを行い、また、PC30の内容のインクリメントを行なう。
T3のφ#で、レジスタ制御信号Aに基づいて、第1のアドレスの内容をGBに読み出して、MAB33に転送し、IABに出力する。
T4のφで、第1のアドレスの内容をGBに読み出して、ALU26に入力し、インクリメントを行なう。
T4のφ#で、インクリメント結果を、WB経由で、第1のアドレスレジスタに格納する。バススイッチ34に入力した、第1のリードデータをXバスに出力すると共に、制御信号Bに含まれるSTX信号を活性状態にし、乗算器2にこの内容を入力ラッチXにラッチさせる。同時に、第2のアドレスの内容をGBに読み出して、MABに転送し、IABに出力する。
T5のφで、第2のアドレスの内容をGBに読み出して、ALU26に入力し、インクリメントを行なう。T5のφ#で、インクリメント結果を、WB経由で、第2のアドレスレジスタに格納する。バススイッチ34に入力した、第2のリードデータをYバスに出力すると共に、制御信号Bに含まれるSTY信号を活性状態にし、乗算器2にこの内容を入力ラッチYにラッチさせる。MAC信号を活性状態にして、積和演算動作の開始を指示する。同時に、PC30の内容をアドレスとした命令のリードを行い、また、PC30の内容のインクリメントを行なう。
T6のφで、インクリメント結果をPC30に格納する。一方、BUSY信号が活性状態になる。MAC命令では、CPU1は乗算器2とは並列に動作し、BUSY信号を無視して、次の命令の実行を開始する。
MAC命令を連続して実行した場合も、次のMAC命令がアドレス計算を行っている間に、乗算器の動作が終了するために、MAC命令実行にウェイトを挿入することはない。
プリフィックスコードを付した命令コードとすることにより、特開平6−51981号公報に記載されているように、互換性を保持しつつ命令セットを拡張することができる。また、乗算器動作中に、次の積和演算を行った場合、命令フェッチとデータのアクセスを行なうことができるから、命令長が長くなっても実行時間を低下させることがない。積和演算を連続的に高速に実行することができる。
乗算器2は、演算終了時点で、SYSCR13のMACSビットを参照して、オーバフローが発生していれば、MACレジスタの内容を、上限(H’7FFFFFFF)または下限(H’80000000)に固定する。
図21、22に、STMAC、LDMAC命令の動作タイミングを示す。
例えば、STMAC MACH,ER2命令などの例である。前記同様に、T2からSTMAC命令の実行が開始される。
まず、BUSY信号の状態をサンプリングする。BUSY信号が活性状態であれば、ウェイト状態になる。
T2のφ#でPCの内容がGBに読み出され、MAB33に入力されて、IABに出力される。また、INC27に入力されて、インクリメント動作が開始される。
CPU内部のクロックがロウレベルで固定され、CPUの動作を停止する。直前にMAC命令を実行した場合、BUSY信号は3ステートの期間活性状態であり、STMAC命令も3ステートウェイト状態になる。
T5でBUSY信号が非活性状態になると、T6からクロックの動作が開始される。
T6のφで、インクリメント結果がWBに出力され、PC30に格納される。STMACHまたはSTMACL信号が活性状態になって、MACレジスタの読み出しが指示される。MACレジスタの内容がXバス、Yバスに出力される。特に制限はされないものの、Xバスが上位、Yバスが下位の内容とされる。
T6のφ#で、Xバス、Yバスの内容がWBに出力されて、指定されたレジスタ(STMAC MACH,ER2の場合は、ER2)に格納される。同時に、乗算器のフラグの内容がCCRのN、Z、Vフラグに格納される。
また、LDMAC ER1,MACL命令などの例である。
T8からLDMAC命令の実行が開始される。
T9のφで、指定されたレジスタ(LDMAC ER1,MACLの場合は、ER1)の内容が読み出される。この内容がXバス、Yバスに出力される。
T9のφ#で、LDMACHまたはLDMACL信号が活性状態になる。PC30の内容がGB経由で、MAB33とINC27に入力される。
T10のφで、インクリメントされた結果がWB経由で、PC30に格納される。また、Xバス、Yバスの内容がMACレジスタに格納される。
前記同様に、BUSY信号が活性状態の場合は、LDMAC命令も活性状態になるようにしてもよい。
CLRMAC命令は、概略LDMAC命令と同様の動作で、LDMAC命令のLDMACH、L信号と同じタイミングで、CLRMAC信号を活性状態にするようにすればよい。
図23、24に、乗算器を用いた乗算命令のタイミング図を示す。
なお、CONT22の部分に、内部のステートマシンのステップの番号を記載した。これは、基本的には、CONT22の出力のフィードバック信号で形成される。また、制御信号CPUSを用いて、乗算器を使用するか使用しないかを選択する。例えば、MULXU.W R1,ER0などのバイトサイズ・符号無し乗算の例である。前記同様に、T2から実行を開始する。
命令が解読されると、まず、T2のφ#で、レジスタ制御信号Aによって、汎用レジスタの読みだしを指示する。読出された結果は、GB、DBおよびバススイッチ34を介して、Xバス、Yバスに出力される。
制御信号Bに含まれるSTX、STY信号に基づいて、Xバス、Yバスの内容は、T3のφで乗算器の入力ラッチにラッチされる。また、同時に、制御信号Bに含まれるMUL信号によって、乗算器に乗算を指示する。CONT22から、バイト/ワードの選択、符号付/符号無の選択、乗算/積和の選択を上記制御信号によって指示する。
乗算器は、T3のφ#で、BUSY信号を与える。また、マルチプレクサやデコーダを動作させる。T4のφで、1回目の加算を行なう。T4のφで部分積を乗算結果レジスタとフィードバックラッチに格納する。これを3回繰り返す。BUSY信号が活性状態になったことに呼応して、CPUはウェイト状態になる。
T5のφでBUSYが非活性状態になって、CPUは動作を再開し、T6のφで、制御信号Cに含まれる、MULRD信号を活性状態にして、乗算結果レジスタのリードを指示する。乗算結果レジスタの内容は、Xバス、Yバスおよびバススイッチ34を経由して、T6のφ#でWBを経由して、レジスタ制御信号Cによって指定されるレジスタに格納される。同時に、乗算の結果フラグがCCR31に格納される。
前記の通り、乗算命令はBUSY信号によって、クロックが停止し、ウェイト状態となる。バイトサイズ符号無し乗算命令(MULXU.B R0L,R1など)は1ウェイトが挿入され、3ステートで実行される。ワードサイズ符号無し乗算命令(MULXU.W R0,ER1など)は2ウェイトが挿入され、4ステートで実行される。なお、符号付き乗算の場合は、それぞれ、プリフィックスコードの実行が付加される。
BUSY信号によって、演算実行の終了を判定することにより、制御回路(CONT22)の論理を縮小することができる。
TESTMODE信号が活性状態になって、テストモードを指示された場合には、乗算器は1ステップの動作のみを行い、BUSY信号は非活性状態を保持する。CPUは1ステートで処理を終了する。
図25、26に、乗算器を用いない乗算命令のタイミング図を示す。乗算器を用いない乗算は、特に制限はされないものの、除算と類似のシーケンスで行なうようにする。
命令が解読されると、まず、汎用レジスタの読みだしを指示する。読出された結果は、符号判定を行なう。符号付/符号無の選択に対応して、符号判定を行い、除数は符号反転し、負数にする。そのほかは正数にする。
被乗数を上位、下位は0にして1ビットずつシフトし、シフトした結果によって、下位側に乗数を加算するかを決める。その結果に対して、さらにシフトを行い、シフトした結果によって、下位側に乗数を加算を行っていく。これを8または16回繰返して、乗算結果の絶対値を得る。例えば、MULXU.B R1L,R0などのバイトサイズ・符号無し乗算の例である。前記同様に、T2から除算命令の実行が開始される。前記のような、所定の処理を行った後、T5から部分乗算を行なう。
部分乗算は、左シフト処理と加算で構成される。前回の加算と次回のシフト処理を同一のALU処理で行なうようにする。
T5のφ1に同期して、指定されたレジスタ(ディスティネーションレジスタRd)から被乗数を読み込み、シフト処理を行なう。シフト処理の結果(部分積)がφ#に同期してWBを経由して、Rdにライトされる。また、シフトアウトされたキャリが内部で保持される。
T6のφ1に同期して、Rdから部分積を読み込み、部分乗算処理を行なう。前回のキャリが”1”である場合、部分積の下位8ビットに乗数を加算し、16ビットでシフト処理を行い、最下位ビットは”0”とする。前記以外の場合、部分積に16ビットでシフト処理を行い、最下位ビットは”0”とする。かかる結果がφ#に同期してWBを経由して、Rdにライトされる。また、シフトアウトされたキャリが内部で保持される。この動作を7回繰り返す。
T13では、上記同様の判定を行い、前回のキャリが”1”である場合、部分積の下位8ビットに乗数を加算する。前記以外の場合、部分積を保持する。16ビットの積が得られる。かかる結果がφ#に同期してWBを経由して、Rdにライトされる。符号付きの場合は、T14で符号処理を行なう。また、ワードサイズの場合は、部分乗算処理が8回追加される。
先に保持した符号判定結果に基づいて、積の符号処理を行なう。すなわち、乗数・被乗数の一方が正数、他方が負数のときは、積の符号を反転する(0から積を引く)。
図27に、乗算命令の状態遷移図を示す。例えば、MULXU.B R1L,R0などのバイトサイズ・符号無し乗算の例である。命令の実行が開始されると、CPUS信号の状態によって分岐する。
CPUS信号が活性状態であって、乗算器の使用が許可されると、図6の動作を行なう。即ち、ステップ1で、指定されたレジスタの内容を、GB、DBを経由して、X、Yバスに出力して、乗算器に供給する。BUSY信号の状態を判定する。テストモードであれば、BUSY信号は非活性状態であって、直ちにステップ2に遷移する。
BUSY信号が活性状態であると、WAIT状態に遷移する。BUSY信号は非活性状態になるとステップ2に遷移する。
ステップ2では、X、Yバスの内容をWBを経由して、指定されたレジスタにライトする。例えば、乗算器のフラグの内容をCCR31に格納する。次の命令の実行を開始する。
CPUS信号が非活性状態であって、乗算器の使用が禁止されると、図25、26の動作を行なう。即ち、ステップ1、2でデータアライメントなどを行った後、ステップ3から、部分乗算処理を行なう。ステップ3では、GB上位に被乗数を出力し、これをシフトする。
ステップ4では、GBに部分積を、DB下位に乗数を出力し、ALU26で加算を行なう。前のステップでシフトアウトしたビットが”1”であれば、加算した結果が選択され、シフトアウトしたビットが”0”であれば、GBの内容が選択され、シフトを行なう。これをステップ10まで繰り返す。
ステップ11では、GBに部分積を、DB下位に乗数を出力し、ALU26で加算を行なう。前のステップでシフトアウトしたビットが”1”であれば、加算した結果が選択され、シフトアウトしたビットが”0”であれば、GBの内容が選択される。シフトは行なわない。ステップ12で、命令のリードを行なう。例えば、積を検査して、CCRに反映する。次の命令の実行を開始する。
図25、26に、除算命令のタイミング図を示している。例えば、DIVXU.B R1L,R0などのバイトサイズ・符号無し除算の例である。前記同様に、T2から除算命令の実行が開始される。除数の符号反転などの、所定の処理を行った後、T5から部分除算を行なう。部分除算は、左シフト処理と減算で構成される。前回の減算と次回のシフト処理を同一のALU処理で行なうようにする。
T5のφ1に同期して、指定されたレジスタ(ディスティネーションレジスタRd)から被除数を読み込み、シフト処理を行なう。シフト処理の結果(部分剰余)がφ#に同期してWBを経由して、Rdにライトされる。また、シフトアウトされたキャリが内部で保持される。
T6のφ1に同期して、Rdから部分剰余を読み込み、部分除算処理を行なう。前回のキャリが”1”である場合、または、部分剰余の上位8ビットが除数以上である場合、部分剰余の上位8ビットから除数を減算(除数の符号反転を行っている場合、除数の反転を加算)し、16ビットでシフト処理を行い、最下位ビットは”1”とする。前記以外の場合、部分剰余に16ビットでシフト処理を行い、最下位ビットは”0”とする。かかる結果がφ#に同期してWBを経由して、Rdにライトされる。また、シフトアウトされたキャリが内部で保持される。この動作を7回繰り返す。
T13では、上記同様の判定を行い、前回のキャリが”1”である場合、または、部分剰余の上位8ビットが除数以上である場合、部分剰余の上位8ビットから除数を減算し、下位8ビットでシフト処理を行い、最下位ビットは”1”とする。前記以外の場合、部分剰余に下位8ビットでシフト処理を行い、最下位ビットは”0”とする。いずれの場合も、ビット7の値は失われる。上位8ビットに剰余、下位8ビットに商が得られる。かかる結果がφ#に同期してWBを経由して、Rdにライトされる。
符号付きの場合は、T14で符号処理を行なう。また、ワードサイズの場合は、部分除算処理が8回追加される。
図28に、ALU26の概略ブロック図を示す。ALU26は、算術論理演算回路76と、選択回路77、シフト回路78、制御回路79から構成される。乗除算に直接関係のない部分は省略している。
算術論理演算回路76は、GBとDBの内容を入力して、加算、減算、論理積、論理和、排他的論理和などの演算を行い、結果を出力する。選択回路77は、算術論理演算回路の出力と、GBの内容を入力して、いずれかを選択して出力する。シフト回路78は、選択回路77の出力を入力して、シフト処理を行なう。
選択回路77、シフト回路78は制御回路79によって制御される。制御回路79は、CONT22の与える制御信号と算術論理演算回路76とシフト回路78の出力によって、選択回路77の選択とシフト回路78のシフト入力を制御する。制御回路79が、前記の部分乗算、部分除算の判定を行なう。条件が成立していれば、算術論理演算回路76の出力を選択し、除算の場合、1をシフト回路に入力する。条件が不成立であれば、GBの入力を選択し、除算の場合、0をシフト回路に入力する。乗算の場合のシフト回路の入力は、0とされる。
除算の部分除算と乗算の部分乗算の処理のシーケンス、及びALU26の回路構成を共通化する。除算と乗算を共通化して、CONT22の論理規模を縮小できる。
これにより、乗算器を持たないCPUを容易に提供することができる。乗算器を持つCPUにおいて不必要な乗算器を用いない乗算の論理を除算と共通化して、論理規模の増加を最低限にすることができる。
また、CPUSによって、乗算器を用いない選択を可能にすることによって、テスト性を向上することができる。テスト時に、乗算器を用いるか用いないかを選択することに両方の論理をテストの対象にすることができる。
複数命令の待避/復帰命令の命令コードは表16の通りである。
最初に使用するレジスタ番号が、命令コード中に指定される。例えば、平成5年3月(株)日立製作所発行『H8/500シリーズプログラミングマニュアル』に記載の複数命令の待避/復帰命令のように任意のレジスタの組み合わせを指定するのではなく、連続したレジスタ番号の固定の組み合わせとし、2、3、4本の固定の組み合わせとしている。命令コードも、レジスタ本数に応じて3種類を用意している。
複数命令の待避命令は、待避するレジスタの本数に対応して、
STM(ERl−ERl+1),@−SP
STM(ERm−ERm+2),@−SP
STM(ERn−ERn+3),@−SP
の3種類を有する。l=0、2、4、6であり、m、n=0、4である。指定した汎用レジスタをスタックに待避する。例えば、ER0とER1をスタックに待避する場合は、
STM(ER0−ER1),@−SP
を用いる。ER0、ER1の順番でスタックにライトされ、スタックポインタ(ER7)は+8される。命令コード中のレジスタ指定部は、最初に待避されるレジスタ番号にしてある。
図29、30に複数レジスタの待避命令の実行シーケンスを示す。例えば、STM.L ER0−ER1,@−SPなどの2本の汎用レジスタを待避する例である。レジスタ指定フィールドはB’000である(B’は2進数を示す)。
前記同様に、T2から除算命令の実行が開始される。特に制限はされないものの、命令コードの第1ワードはプリフィックスコードであり、次の命令コードの動作を指定し、PCをインクリメントするほかの動作は行なわない。
第2ワードの命令コードは、PUSH命令と共通にされる。
T4のφで、SPの内容をGBに読み出し、ALU26に入力する。ALU26では−4の演算を行なう。なお、前記の通り、実行前のSPはスタックの先頭アドレスを示しているとする。
T4のφ#で演算結果がWBとGBに出力される。WBからSPに書き込まれ、GBからMAB33に格納される。MAB33の内容がIABに出力される。また、第1の制御信号BとRSEL2(=B’000)とによって、待避されるレジスタが選択され、レジスタ制御信号Bが生成される。
T5のφで、選択されたレジスタ(ER0)の内容がDB経由で、DBW24に転送される。
T5のφ#で、転送されたデータ(ER0の内容)の上位16ビット(Eレジスタの内容)が内部データバスに出力される。また、MAB33のインクリメント機能によって、IABの出力値を+2とする。
T6のφで、更に、SPの内容をGBに読み出し、ALU26に入力する。ALU26では−4の演算を行なう。
T6のφ#で、DBW24に転送されたデータの下位16ビット(Rレジスタの内容)が内部データバスに出力される。ALU26の演算結果がWBとGBに出力される。WBからSPに書き込まれ、GBからMABに格納される。MAB33の内容がIABに出力される。また、第2の制御信号BによってRSELのビット0が反転される。第1の制御信号とRSEL2(=B’001)とによって、待避されるレジスタが選択され、レジスタ制御信号Bが生成される。
T7のφで、選択されたレジスタ(ER1)の内容がDB経由で、DBW24に転送される。
T7のφ#で、転送されたデータ(ER1の内容)の上位16ビット(Eレジスタの内容)が内部データバスに出力される。また、MAB33のインクリメント機能によって、IABの出力値を+2とする。
T8のφ#で、DBW24に転送されたデータの下位16ビット(Rレジスタの内容)が内部データバスに出力される。
T8のφ#以降で、前記同様に、次の次の命令の読み出しと、PC30のインクリメント(+2)を行なう。
レジスタ3本を指定した場合は、実行ステート数が2ステート長くなり、SPのデクリメント(−4)と、RSELのビット1が反転される。RSELは、レジスタ指定フィールドが000の場合、010とされ、汎用レジスタER2が選択される。ライト動作が2回行われる。
レジスタ4本を指定した場合は、更に、実行ステート数が2ステート長くなり、SPのデクリメント(−4)と、RSELのビット1とビット0が反転される。RSELは、レジスタ指定フィールドが000の場合、011とされ、汎用レジスタER23が選択される。ライト動作が2回行われる。
レジスタ番号の下位ビットが固定であるので、これを命令処理の実行に従って、変更させることが容易である。例えば、2本のレジスタを待避する場合、命令コード上のレジスタ指定フィールドの下位ビットは0であるので、1回めのレジスタ指定は、レジスタ指定フィールドの値に従い、2回のレジスタ指定は、CONT22の制御に従って、レジスタ指定フィールドの下位1ビットを1に変更して、行なうようにする。
一方、PUSH命令はレジスタ1本の待避であり、前記の2回目の待避動作を行なわないようにされ、実行動作の共通化を図っている。
図31、32に複数レジスタの復帰命令の実行シーケンスを示す。例えば、LDM.L @ER7+,ER0−ER1などの2本の汎用レジスタを待避する例である。レジスタ指定フィールドは001である。
図33、34に、RSEL2入力制御回路の具体的な構成、およびその動作説明を示す。この制御回路は、アンド回路75A、75B、オア回路80A、80Bから構成される。
ビット2には、オペコードのレジスタ指定フィールドのビット2がそのまま入力される。ビット1、0には、オアゲートとアンドゲートを介して入力される。オアゲートの他方の入力はSTM制御信号1、0であり、アンドゲートの他方の入力はLDM制御信号1、0の反転とされる。STM制御信号1、0およびLDM制御信号1、0は、CONT22の出力である制御信号Bに含まれる。
STM制御信号が活性状態になると、当該RSELビットは1になる。また、LDM制御信号が活性状態になると、当該RSELビットは0になる。STM、LDM命令と指定したレジスタ本数に従って、STM制御信号、LDM制御信号が生成される。
これにより、レジスタ選択回路をそのほかの命令と共通化することができる。共通化によって、物理的規模の増加を抑止できる。
図35、36に、C言語で書かれた関数と、これをCPUの命令に変換したリストの概略を示す。このリストには、オフセット(相対アドレス)、命令コード、Cラベル、Cソース及びアセンブラ命令の各項目が示されている。
C言語からCPUの命令へのコンパイルについては、例えば、平成4年9月(株)日立製作所発行『H8/300シリーズCコンパイラ』に記載されている。引数を汎用レジスタER0、ER1に設定しておくことができる。
関数Proc1では、引数をレジスタ渡しとし、これをER0に割り当てている。関数内の処理で、ER2、3、4、6を使用するため、関数処理の先頭で、
STM (ER2−ER3),@−SP
STM (ER4−ER6),@−SP
を実行して、関数の最後で、
LDM @SP+,(ER4−ER6)
LDM @SP+,(ER2−ER3)
を実行して、サブルーチンからリターン(RTS)している。
ER0、ER1は引数領域のため、関数内では使用せず、内容の待避/復帰も行なわない。
また、この関数内で呼び出される関数Proc3は、引数をレジスタ渡しとし、これをER0に割り当てている。関数内の処理で、ER5を使用するため、関数処理の先頭で、1レジスタの待避
PUSH.L ER5
を実行して、関数の最後で、
POP.L ER5
を実行して、サブルーチンからリターン(RTS)している。
スタックポインタはER7と兼用であるから、ER7を待避/復帰することは意味がない。従って、タスク切替えを行なう場合に使用可能なすべてのレジスタを待避する場合には、
STM @SP+,(ER0−ER3)
STM @SP+,(ER4−ER6)
の2命令を用いる。ER0からER6の順番でスタックに待避される。同様に、復帰する場合には、
LDM @SP+,(ER4−ER6)
LDM @SP+,(ER0−ER3)
の2命令を用いる。ER6からER0の順番でスタックから復帰される。
前記のように任意の組み合わせを指定できないが、予め、レジスタの割当てを行っておくことにより、実質的な制約にはなりにくい。7本のレジスタを待避/復帰する場合に2命令を用いることになるが、全体的な実行ステート数やプログラム容量に対しては影響が小さい。少なくとも、1本のレジスタずつの待避/復帰命令を用いるより効果がある。後者の場合、4バイト×7、5ステート×7であるのに対して、前者では、4バイト×2、9+11ステートで実行できる。少なくとも、命令リードのためのリードサイクルや、アドレス計算のための内部動作の分を短縮して、高速化を図ることができる。
前記C言語で書かれたプログラムのように、関数乃至サブルーチンを多く用いるプログラムの高速化を実現することができる。
また、上記のような関数乃至サブルーチンの場合のほかに、割り込み処理ルーチンにおいても、同様のレジスタの待避/復帰を行なう必要がある。マイクロコンピュータが機器制御などを行なう場合には、割り込み処理については、割り込みのイベントが発生してから、実際の割り込み処理を実行するまでの時間を短縮することによって、リアルタイム制御性を向上することができる。複数レジスタの待避を高速に実行可能にすることにより、かかるリアルタイム制御性の向上に効果がある。
また、固定の組み合わせにし、各命令の実行ステート数を固定にすることにより、内部の条件分岐を行なうことをなくし、内部論理を簡潔にし、論理規模を縮小できる。マイクロプログラムによらず、ワイアードロジックなどでも容易に実現できる。マイクロプログラムによらず、ワイアードロジックなどとすることにより、論理回路の高速化に寄与することができる。特に、C言語など関数乃至サブルーチンを多く用いるプログラムを高速に実行することができる。
図37、38に、割込み例外処理のシーケンスを示す。
図39に、例外処理の状態遷移図を示す。
前記同様に、T2から割り込み例外処理の実行が開始される。プリフェッチした命令はキャンセルされ、図示されない割り込み要求信号に呼応して、CONT22の入力が切り換えられる。
ステップ1の動作として、PC30のデクリメントを行なう。T2のφ#で、PC30の内容を読み出して、GB経由で、INC27でデクリメント(−4)を行なう。これはプリフェッチをキャンセルしたことに対応して、待避すべきPC30の値を算出する。
T3のφで、デクリメントした結果を、WB経由で一旦PC30に格納する。
ステップ2で、SPをデクリメントし、この内容をアドレスとして、PC30の内容をデータとして、ライト動作を行なう。即ち、T3のφで、同時に、SPの内容を読み出して、GB経由でALU26でデクリメント(−2)を行なう。
T3のφ#で、デクリメントした結果を、WB経由でSPに格納するとともに、GB経由でMAB33に転送し、IABに出力させる。
T4のφで、PC30の内容をDB経由でDBW24に転送する。DBW24の内容は、T4のφ#から、内部データバスに出力される。
ステップ3で、SPをデクリメントし、この内容をアドレスとして、PC30の上位8ビットとCCR31の内容をデータとして、ライト動作を行なう。
T4のφで、同時に、SPの内容を読み出して、GB経由でALU26でデクリメント(−2)を行なう。
T4のφ#で、デクリメントした結果を、WB経由でSPに格納するとともに、GB経由でMAB33に転送し、IABに出力させる。DBW24に保持したPC30の内容下位16ビットを内部データバスに出力する。
T5のφで、CCR31の内容をDB経由でDBW24に転送する。T4で格納したPC30の上位8ビットは保持される。DBW24の内容は、T5のφ#から、内部データバスに出力される。
INTM1信号が非活性状態であれば、ステップ4に遷移する。INTM1信号が活性状態であれば、ステップ12に遷移し、SPをデクリメントし、この内容をアドレスとして、EXRの内容をデータとして、ライト動作を行なう。
T5のφで、SPの内容を読み出して、GB経由でALU27でデクリメント(−2)を行なう。
T5のφ#で、デクリメントした結果を、WB経由でSPに格納する。
T6のφで、EXRの内容をDB経由でDBW24に転送する。T6のφ#から、内部データバスに出力される。
ステップ4で、ベクタアドレスの内容をリードする。
T5のφ#で、同時に、VAGの内容をGB経由でMAB33に転送し、IABに出力させる。VAGには、図示されない、割り込みコントローラから与えられるベクタ番号に基づいて、ベクタアドレスを生成する。
ステップ5で、ベクタアドレスのリード動作の終了を待つ。
ステップ6で、DBR25に格納した、ベクタアドレスの内容をアドレスとして、命令のリードを行なう。DBR25の内容をインクリメントし、PC30に格納する。
T8のφ#で、DBR25に格納したベクタアドレスのリード内容(分岐先の先頭アドレス)をGB経由で、MAB33に転送し、IABに出力させ、ALU26でインクリメント(+2)する。
T9のφで、インクリメントした結果を、WB経由でPC30に格納する。
ステップ7で、PC30の内容をアドレスとして、命令のリードを行い、PC30のインクリメントを行なう。
T9のφ#で、PC30の内容(分岐先の先頭アドレス)をGB経由で、MAB33に転送し、IABに出力させ、ALU26でインクリメント(+2)する。リードした命令をIR21に格納する。
T10のφで、インクリメントした結果を、WB経由でPC30に格納する。
次の命令の実行を開始させる。
制御信号INTM1に従って、ステップ12を行なうか、行なわないかが選択され、スタックを2回行なうか、3回行なうかが選択される。スタックを2回行なう場合には、PCとCCR31のみが待避される。SPは−4となる。上記T5の動作に相当する部分(ステップ12)が実行されない。3回行なう場合には、PC30とCCR31及びEXRが待避される。SPは−6となる。
なお、ステップ1単位の動作が複数ステートにまたがっているのは、1つのCONT22の入力に対応して、複数の異なるタイミングの制御信号A、B、C及びレジスタ選択信号A、B、Cが生成されるのに対応する。
図40、41に、例外処理後のスタックの状態を示す。図41はノーマルモードを示し、図42はアドバンストモードを示している。
図42に、RTE命令の実行シーケンスを示す。
図43に、例外処理の状態遷移図を示す。
前記同様に、T2からRTE命令の実行が開始される。
ステップ1の動作として、SPの内容をアドレスとして、スタックのリードを行なう。T2のφ#で、SPの内容を読み出して、GB経由で、MAB33に転送し、IABに出力させる。
T3のφで、SPの内容を読み出して、GB経由で、ALU27でインクリメント(+2)する。IABのアドレスでスタックをリードする。T3のφ#で、リードした内容をDBR25に格納する。
INTM1信号が非活性状態であれば、ステップ2に遷移する。INTM1信号が活性状態であれば、ステップ10に遷移し、リードした結果をEXRに格納する。SPをインクリメントし、この内容でリードを行なう。
T3のφ#で、同時に、インクリメントした結果を、WB経由でSPに格納する。また、GBを経由して、MAB33に転送し、IABに出力させる。
T4のφで、DBR25の内容をGBに読み出し、これをALU27に入力する。T4のφ#で、ALU27はGBから入力した内容をそのまま、WBに出力し、EXRに格納する。
ステップ2で、リードした結果をCCR31に格納する。MAB33に格納した内容を、MAB33でインクリメントさせる。この内容でリードを行なう。なお、MAB33のインクリメント機能は、特開平4−333153号公報などに記載されている。
T5のφで、DBR25の内容をGBに読み出し、これをALU27に入力する。T5のφ#で、ALU27はGBから入力した内容をそのまま、WBに出力し、CCR31に格納する。
ステップ3で、SPの内容をインクリメント(+4)する。
T6のφで、SPの内容を読み出して、GB経由で、ALU26でインクリメント(+4)する。
T6のφ#で、インクリメントした結果を、WB経由でSPに格納する。
ステップ4で、DBR25に格納した、スタックから復帰したPC30の内容をアドレスとして、命令のリードを行なう。DBR25の内容をインクリメントし、PC30に格納する。
T6のφ#で、同時に、DBR25に格納したベクタアドレスのリード内容(分岐先の先頭アドレス)をGB経由で、MABに転送し、IABに出力させ、ALUでインクリメント(+2)する。
T7のφで、インクリメントした結果を、WB経由でPC30に格納する。
ステップ5で、PC30の内容をアドレスとして、命令のリードを行い、PC30のインクリメントを行なう。
T7のφ#で、PC30の内容(分岐先の先頭アドレス)をGB経由で、MAB33に転送し、IABに出力させ、ALU26でインクリメント(+2)する。リードした命令をIRに格納する。
T8のφで、インクリメントした結果を、WB経由でPC30に格納する。次の命令の実行を開始させる。
例えば、INTM1信号が0レベルの場合には、前記従来CPU(例えば、前記平成5年6月(株)日立製作所発行『H8/300Hシリーズプログラミングマニュアル』に記載のCPU)と同一のスタックの構造とされる。命令コードが共通であることと相俟って、従来CPUによって書かれたプログラムをそのまま実行することができる。
新たな、コンディションコードや割込みマスクビットやトレースビットなどを追加する場合には、これに対応したプログラムを作成することになるから、スタックの構造が異なっても実質的な問題はない。割込みマスクビットを追加するなどして、使い勝手を向上することができる。
なお、前記の通りINTM1ビットがSYSCRに存在し、このビットの状態がINTM1信号に反映されるようになっている。リセット後に、かかるSYSCRの設定を行なうことにより、EXRを使用するかしないかが選択される。
図44にCONT22の一部の論理を示す。このCONT22は、アンド回路86A〜86Dによって構成される。
EXRを使用しない、すなわち、INTM1ビットを”0”にクリアすると、EXRのビットは全て”0”とみなされ、設定値は、無視されるようにされる。
次に、図4におけるエミュレーション用インタフェース39に含まれる制御レジスタ41の構成を示す。この制御レジスタ41は、以下説明するように、(1)ASEコントロールレジスタ D (ASECRD)、(2)ブレークコントロールレジスタ A B(BRCRA、B)、(3)ブレークアドレスレジスタ A、B(BARA、B)、(4)ブレークアドレスマスクレジスタ A、B(BAMRA、B)、および(5)ASE専用スタックレジスタ(BRKSTKR)から構成されている。
図45に、(1)ASEコントロールレジスタ D (ASECRD)の構成を示す。このレジスタは8ビットリード/ライト可能なレジスタで、シングルステップの設定、RTB命令実行後の割込制御、多重ブレークの許可禁止、ウインドウ機能を指定する。各ビットの内容を表21乃至表24に示す。
図46に、(2)ブレークコントロールレジスタ A B(BRCRA、B)の構成を示す。このレジスタは、(a)BRCRA、(b)BRCRBからなり、各々は8ビットのリード/ライトが可能なレジスタで、それぞれPCブレークのチャネルA、Bの制御を行なう。各ビットの内容を表25乃至表28に示す。
図47に、(3)ブレークアドレスレジスタ A、B(BARA、B)の構成を示す。このレジスタは、(a)BARA、(b)BARBからなり、各々は32ビットのリード/ライトが可能なレジスタで、それぞれPCブレークのチャネルA、Bのアドレスを指定する。32ビットのレジスタをバイトサイズに分割して、BARR、E、H、Lと表記される場合もある。最上位のBARRはリザーブされている。リードすると不定値が読み出される。ライトは無効である。
図48に、(4)ブレークアドレスマスクレジスタ A、B(BAMRA、B)の構成を示す。このレジスタは、(a)BAMRA、(b)BAMRBからなり、各々は32ビットのリード/ライトが可能なレジスタで、それぞれPCブレークのチャネルA、Bのアドレス比較のマスクを行なうビットを指定する。BAMRのビットを”1”にセットすると、このビットに対応するアドレスのビットは、アドレス比較対象から除外される。32ビットのレジスタをバイトサイズに分割して、BAMRR、E、H、Lと表記される場合もある。最上位のBARRはリザーブされている。リードすると不定値が読み出される。ライトは無効である。
図49に、(5)ASE専用スタックレジスタ(BRKSTKR)の構成を示す。このレジスタは、6バイト(48ビット)のリード/ライトが可能なレジスタで、ユーザモード⇔ブレークモードの遷移時に、スタック領域として使用する。ユーザのSPは使用せず、保持される。スタックされるリソースおよびスタックの構造は、MCU動作モード(ノーマルモード/アドバンストモード)および、制御レジスタの設定(SYSCRのINTM1ビット)によって相違される。表29にこのレジスタの使用方法を示す。
エミュレーション用ソフトウェアの実行状態への遷移(ブレーク)時には、固定アドレスのブレークスタックレジスタを使用するようにする。ブレーク例外処理や、ブレークからのリターン命令時には、ユーザのスタックポインタ(ER7)を使用せず、固定的なスタックアドレスを生成する。かかるスタックアドレスの生成はEMLSP29による。
図50に、EMLSP29の構成を示す。このEMLSP29は、クロックトバッファで構成される。
かかるクロックトバッファの内、ビット23〜10は1固定、ビット5、4、0は0固定、ビット9〜6は、外部からの指定を入力する。また、ビット3、2、1はCONT22の制御信号を入力する。CMOS回路で構成する場合、必要に応じて論理反転を用いればよい。クロックトバッファの出力はGBに接続されている。また制御信号mは、CONTの制御信号とクロック(φ#)の論理積信号である。
通常のレジスタ回路が、データを保持するためのラッチ回路を持たなければならないが、EMLSP29は、これを持たず、小型化を図っている。
従って、ブレークスタックレジスタの先頭アドレスは、B’000000であって、64kバイト単位で16通りのアドレスを選択可能とされる。マイクロコンピュータの内部I/Oレジスタの配置によって、アドレスを変更できる。
ブレーク例外処理の実行シーケンスは、図37、38と同様であり、そこでのSP(ER7)の読み出しに代わって、EMLSP29を読み出すようにする。
この場合、最初(T3のφ)は下位アドレスをB’000110として、デクリメントした内容のB’000100がスタックのアドレスとされる。
2回目(T4のφ)は下位アドレスをB’000100として、デクリメントした内容のB’000010がスタックのアドレスとされる。
3回目(T5のφ)は下位アドレスをB’000010として、デクリメントした内容のB’000000がスタックのアドレスとされる。3回目は、INTM信号が活性状態のときに有効である。読み出されるビット2、1は、CONT22の制御信号によって選択する。
リターン命令の実行シーケンスは、図42と同様であり、SP(ER7)の読み出しに代わって、EMLSP29を読み出すようにする。
最初(T2のφ#)はINTM1信号によって異なり、INTM1信号が非活性状態であれば、下位アドレスをB’000010として、INTM1信号が活性状態であれば、下位アドレスをB’000000として、読み出す。これらがスタックのアドレスとなる。
2回目(T3のφ)は、INTM1信号が活性状態である場合に有効であり、下位アドレスをB’000010として、デクリメントした結果をアドレスとしてリードを行なう。
3回目はMAB33のインクリメントによってアドレスを生成し、EMLSP29は使用しない。
これにより、固定的な出力回路として論理規模を縮小できる。ユーザに公開されない資源による論理規模の増大を最小限にすることができる。
図51に、ブレーク例外処理の実行タイミングを示す。実行シーケンスは図37、38の例外処理タイミングと同様である。
前記同様に、T2から割り込み例外処理の実行が開始される。プリフェッチした命令はキャンセルされ、図示されないブレーク要求信号に呼応して、CONT22の入力が切り換えられる。
T3のバス動作が行われない期間に、ブレークモードを示す信号BRKAK#が活性状態になる。
図52に、ブレーク制御論理の回路構成を示す。この回路は、アンド回路81A乃至81G、オア回路82A乃至82D、フリップフロップ83から構成されている。
CPUに対するブレーク要求は、3要因が存在する。第1はBRK端子による要求である。第2はアドレス比較Aによる要求であり、これは、BRKCRのBIEAビットによって許可される。第3はアドレス比較Bによる要求であり、これは、BRKCRのBIEBビットによって許可される。なお、かかるアドレス比較は、前記の通り、(CA23・AR23+¬CA23・¬AR23+AMR23)・…・(CAn・ARn+¬CAn・¬ARn+AMRn)・…・(CA0・AR0+¬CA0・¬AR0+AMR0)と表現される。(¬は論理反転を示す)。
これらの論理和信号が、ブレーク要求として、CPUに与えられる。ブレークモードでは、MBIEビットの状態によってBRK端子によるブレーク要求の許可禁止が選択される。即ち、ブレークモードでMBIEビットが”0”にクリアされている場合は、ブレーク要求が抑止される。アドレス比較によるブレーク要求は、ブレークモードで禁止される。
また、MBIEビットは、フリップフロップで構成され、BRKAK信号の反転信号で”0”にクリアされる。かかるフリップフロップの入力は、所定のデータバスのビットであって、クロックは、ブレークモード信号とアドレスデコード信号とライト信号の論理積信号とされる。かかるアドレスデコード信号は、CPUの出力するアドレスがBRKCRの存在するアドレスになったとき、活性状態とされる。即ち、ブレークモードでのみライト可能とされる。
即ち、ブレークモードに遷移した直後は、ブレーク要求が禁止状態であって、不所望のブレークの多重例外処理(スタックした内容の破壊)が禁止される。また、BRKCRのSSTPビットと、BRKAK信号の反転信号との論理積が、シングルステップブレーク要求として、CPUに与えられる。
シングルステップブレーク要求と、RTB命令実行信号との論理積信号と、ブレーク要求が、CPU内部で、CPUブレーク例外処理要求として認識される。これらの例外処理の内容は共通とされる。
CPUはRTB命令実行時には、かかるシングルステップブレーク要求を無視する。
上記実施の形態によれば、以下の作用効果を得るものである。
(1)既存の命令セットと互換性を維持しつつ、乗算器を内蔵することに当っては、ポストインクリメントレジスタ間接のアドレッシングモードのみをサポートすることによって、アドレッシングモードの増加を最小限にして、かつ処理性能を低下させずに積和演算を実行可能にすることができる。また、アドレスレジスタの補正をレジスタ間演算命令で行い、これを1ステートで実行することができ、アドレッシングの柔軟性を向上することができる。さらに、積和演算をCPUの内部動作(ポストインクリメントのアドレス計算)と並行に行なうことによって、実行ステート数の短縮を行なうことができる。
(2)乗算器を利用して乗算命令を実行することにあたっては、乗算の結果(積、フラグ)を直接汎用レジスタ、CCRに格納するようにして、直ちに結果を利用できるようにし、実質的な乗算の実行速度を向上することができる。また、積和演算の結果(MAC)をリード(STMAC)すると同時に、乗算器内部で保持したフラグをCCRに格納することによって、積和演算結果の利用や判定を容易に行なうことができ、使い勝手を向上することができる。
(3)乗算器を取外し可能にすることによって、乗算器を取外した場合は、積和演算をサポートしないことによって、容易に下位CPUを実現し、論理的・物理的規模を縮小し、製造費用を低減した別のマイクロコンピュータを容易に開発することができる。また、汎用的な乗算命令を、乗算器によらずにサポートすることによって、かかる別のマイクロコンピュータにおける使い勝手の低下を防止できる。さらに、乗算器によらない乗算命令を除算と同一のシーケンスで実行するようにして、乗算器を持つマイクロコンピュータにおいても冗長な論理を最低限にすることができる。
また、乗算器使用するか使用しないかの制御信号を与えて制御することによって、テスト性を向上したり、エミュレータを共通化したりすることができる。全体的な開発効率を向上することができる。さらにまた、乗算器を削除し、小型化したCPUを用いて、マイクロコンピュータを構成することによって、半導体集積回路の論理規模・物理的規模を縮小して、製造費用の縮小を図ることができる。
(4)乗算器とCPUを一体に構成して、乗算器・CPU間の配線を短縮して、物理的規模を縮小する。また、高速化に寄与することができる。
(5)乗算器のテストモードを設定して、このときの乗算器の処理を1ステップのみにすることによって、論理規模の増加を最低限にして、テストの容易性を向上することができる。テストステップを短縮することができる。
(6)内部動作のパイプラインに対応して、入出力タイミングの異なるレジスタ選択回路を複数持つことにより、実質的に1命令/1ステート実行を行なうことができる。
(7)複数レジスタの退避/復帰命令を持ち、この組み合わせを固定的にすることによって、論理規模の縮小を図ることができる。レジスタの本数の異なる命令を複数命令サポートすることによって、使い勝手の低下を防ぐことができる。また、複数レジスタの退避/復帰命令を関数(サブルーチン)の入り口/出口で実行することによって、C言語などで記述された場合のように、関数の使用頻度が高い場合に、処理速度を特に向上することができる。さらに、割り込み例外処理ルーチンの先頭で複数レジスタの退避を用いることにより、リアルタイム性の向上を図ることができる。
(8)EXRの有効/無効を切り換えることで、互換性を維持することと、機能拡張とを両立することができる。EXRを無効とし、例外処理において退避/復帰を行なわないようにすることで、スタックの節約と、割込み応答時間の高速化に寄与することができる。また、互換性を維持する。さらに、EXRを有効とすることで、割り込みマスクレベルを拡張したり、トレース機能を追加したりして、使い勝手を向上することができる。
(9)エミュレータ用の固定的なスタックポインタを持つことによって、ユーザプログラムとエミュレーションプログラムの遷移時に、ユーザのスタックポインタとは独立して、固定的なアドレスに対して退避および復帰が行われるから、エミュレータのソフトウェア、ハードウェアの開発を容易にすることができる。
また、エミュレータ用のスタックポインタを固定的にすることによって、ユーザに公開しない資源を最小限の論理的・物理的規模にすることができる。ユーザプログラムからエミュレーションプログラムへの遷移(ブレーク)を多重に行なうことを禁止することを可能にすることによって、不所望のスタックの内容の破壊を防止することができる。
以上本発明者等によってなされた発明を実施の形態に限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能である。実施の形態を相互に組み合せて使用することもできる。
例えば、CPUの命令セットやレジスタ構成は変更可能である。内部バス幅なども変更可能である。但し、命令の大部分の命令コード長より、小さいバス幅でないことが望ましい。
また、乗算器の内部構成なども種々変更可能である。16ビット×6ビットを3回繰り返すのではなく、16ビット×4ビットを4回繰り返すようにしてもよい。命令実行ステートと論理的規模に鑑みて選択すればよい。
さらに、飽和演算の指定、乗算器あり/なしの指定、テストモードの指定方法が種々変更可能であることは言うまでもない。
さらにまた、乗算器に限らず除算器を内蔵するものであっても良い。
また、互換性を維持すべき対象は、前記例に限定されない。一般的に、CPUの例外処理時に、コントロールレジスタの内容を待避することは行われており、そのほかのCPUについても、本発明を適用して、互換性を維持しつつ、コントロールレジスタの機能を拡張することができる。
さらに、シングルチップマイクロコンピュータのその他の機能ブロックについても何等制約されない。
以上の説明では主として本発明者によってなされた発明をその背景となった利用分野であるシングルチップマイクロコンピュータに適用した場合について説明したが、それに限定されるものではなく、その他のデータ処理装置にも適用可能であり、本発明は少なくとも、複数の動作モードを選択して動作するデータ処理装置に適用することができる。
1…CPU、2…乗算器、3…システムコントローラ(SYSC)、4…割込コントローラ(INT)、5…ROM、6…RAM、9…シリアルコミュニケーションインターフェース(SCI)、13…システムコントロールレジスタ(SYSCR)、14…制御レジスタ(CPUCR)、21…命令レジスタ(IR)、22…命令デコーダ・制御回路(CONT)、23…レジスタセレクタ(RSEL)、24…ライトデータバッファ(DBW)、25…リードデータバッファ(DBR)、26、27…演算器、29…エミュレータスタックポインタ(EMLSP)、30…プログラムカウンタ(PC)、31…コンディションレジスタ(CCR)、32…拡張レジスタ(EXR)、33…アドレスバッファ(MAB)、34…バススイッチ、38…エミュレーション用プロセッサ、39…エミュレーション用インタフェース、44…インタフェースケーブル、48…エミュレーションメモリ、49…ブレーク制御回路、50…リアルタイムトレース回路、58…CMOSインバータ回路、65A〜65C…デコーダ、66A〜66C、71A、71B、77…選択回路、67…加算器、72A〜72C…拡張回路、76…算術論理演算回路、78…シフト回路、79…制御回路、75A、75B、81A〜81G、86A〜86D…アンド回路、80A、80B、82A〜82D…オア回路、83…フリップフロップ。