(57)【要約】【課題】命令のフェッチに際して、命令を格納したメモリへの無駄なアクセスを回避すると共に、ＣＰＵの性能低下を防ぐ。【解決手段】フェッチ部１５０は、第１のパルス信号ＣＬＫ１が第２のエッジになったときに、演算部１２０が次に実行する命令の全ての内容をメモリ１９０からフェッチするために必要なフェッチ回数Ｎを算出すると共に、Ｎ回のフェッチを実行する。演算部１２０は、第１のパルス信号ＣＬＫ１の上記第２のエッジの次の第２のエッジまでに命令を実行すると共に、前記次の第２のエッジのときに、次の命令の先頭アドレスをＰＣ１４０とフェッチ部１５０に出力する。フェッチ部１５０は、上記Ｎ回のフェッチのうちの１回目のときに、フェッチアドレスとして演算部１２０が出力した先頭アドレスを用い、Ｋ回目（Ｋ：２以上の整数）のときに、Ｋと、ＰＣ１４０の値と、データバス幅とからフェッチアドレスを算出する。【選択図】図１
2013077216.tif 000002
【特許請求の範囲】
【請求項１】
プログラム・カウンタと、命令を実行する演算部とを含むＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）と、
第１のパルス信号の立上りと立下りの片方と他方を夫々第１のエッジと第２のエッジとした場合に、前記第１のパルス信号が第２のエッジになったときに、前記演算部が次に実行する命令の全ての内容をメモリからフェッチするために必要なフェッチ回数Ｎ（Ｎ：１以上の整数）を算出すると共に、Ｎ回のフェッチを実行して、前記メモリから前記命令の内容を逐次前記ＣＰＵに読み込むフェッチ部とを有し、
前記演算部は、前記第２のエッジの次の第２のエッジまでに、前記フェッチ部がフェッチした前記命令を実行すると共に、前記次の第２のエッジのときに、次に実行する命令の前記メモリにおける先頭アドレスを前記プログラム・カウンタと前記フェッチ部に出力し、
前記フェッチ部は、
前記Ｎ回のフェッチのうちの１回目のときに、フェッチアドレスとして前記演算部が出力した前記先頭アドレスを用い、
前記Ｎ回のフェッチのうちのＫ回目（Ｋ：２以上の整数）のときに、前記Ｋと、前記プログラム・カウンタの値と、１度のアクセスで前記メモリから読み出せるデータ量を示すデータバス幅とからフェッチアドレスを算出することを特徴とするプロセッサ。
【請求項２】
前記第１のパルス信号は、前記フェッチ部により生成され、
前記フェッチ部は、
前記Ｎ回のフェッチのうちのＮ回目のフェッチの完了後に前記第１のパルス信号が第１のエッジになり、前記第１のエッジから所定の時間経過後に前記第１のパルス信号が第２のエッジになるように前記第１のパルスを生成することを特徴とする請求項１に記載のプロセッサ。
【請求項３】
前記フェッチ部は、
前記フェッチ回数Ｎの算出と、フェッチの実行とを行うフェッチ実行部と、
非同期制御回路とを有し、
前記非同期制御回路は、
初期化完了時に前記第１のパルス信号が第１のエッジになり、前記所定時間経過後に前記第１のパルス信号が第２のエッジになるように前記第１のパルス信号を出力し、
前記第１のパルス信号の第２のエッジに応じて前記フェッチ実行部による前記Ｎ回のフェッチのうちの１回目のフェッチの開始後、ｎ回目（１≦ｎ＜Ｎ）回目のフェッチが完了する度に（ｎ＋１）回目のフェッチの開始を指示するタイミング信号を前記フェッチ実行部に出力すると共に、Ｎ回目のフェッチに対応する前記タイミング信号の出力後、初期化を開始することを特徴とする請求項２に記載のプロセッサ。
【請求項４】
前記第１のパルス信号は、前記演算部と前記フェッチ部に供されるクロック信号であることを特徴とする請求項１記載のプロセッサ。
【請求項５】
前記フェッチ部は、
前記フェッチ回数Ｎの算出と、フェッチの実行とを行うフェッチ実行部と、
非同期制御回路とを有し、
前記非同期制御回路は、
前記クロック信号の第２のエッジに応じて前記フェッチ実行部による前記Ｎ回のフェッチのうちの１回目のフェッチの開始後、ｎ回目（１≦ｎ＜Ｎ）回目のフェッチが完了する度に（ｎ＋１）回目のフェッチの開始を指示するタイミング信号を前記フェッチ実行部に出力すると共に、Ｎ回目のフェッチに対応する前記タイミング信号の出力後、初期化を開始することを特徴とする請求項４に記載のプロセッサ。
【請求項６】
前記ＣＰＵは、固定命令長の命令セットを有し、
前記フェッチ部は、
前記演算部が次に実行する命令の前記メモリにおける先頭アドレスと、前記データバス幅と、前記固定命令長とに基づいて、前記フェッチ回数Ｎを算出することを特徴とする請求項１から５のいずれかに記載のプロセッサ。
【請求項７】
前記ＣＰＵは、
可変命令長の命令セットを有し、
前記フェッチ部によりフェッチした命令を一時的格納して前記演算部に供する命令レジスタをさらに備え、
前記フェッチ部は、
前記命令に対する１回目のフェッチにより前記命令レジスタに格納された内容に基づいて該命令の命令長を生成する命令長生成部をさらに有し、
前記命令の１回目のフェッチ後に、前記命令の前記メモリにおける先頭アドレスと、前記データバス幅と、前記命令長生成部が生成した命令長とに基づいて、前記フェッチ回数Ｎを算出することを特徴とする請求項１から５のいずれか１項に記載のプロセッサ。
【請求項８】
前記フェッチ部に対して、前記データバス幅Ｗを設定可能であることを特徴とする請求項１から７のいずれか１項に記載のプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリアクセス技術、より具体的には、メモリから命令をフェッチするメモリアクセス技術に関する。
【背景技術】
【０００２】
近年、世界的に環境問題に対する意識が高まる背景において、各種電子機器に対して動作時及び待機時の消費電力への規制が求められている。また、家庭用の防災・防犯機器や携帯機器など、身の周りに電子機器が増える一方であり、これらの電子機器の開発において、システムレベルでの消費電力の削減は、重要な課題となっている。これは、昨今の電子機器の殆どに搭載されているマイクロコンピュータについても、同様である。
【０００３】
その一方、各種電子機器は、制御の複雑度が増しており、処理能力の向上も求められている。
【０００４】
マイクロコンピュータのＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）の動作を決定するプログラムは、通常、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）などのメモリに格納されている。該プログラムに含まれる各命令は、メモリから順次ＣＰＵに読み込まれ、ＣＰＵにより実行される。
【０００５】
１回のメモリアクセスでメモリから読み出せるデータ長は、メモリのデータバス幅に依存する。例えば、２バイトのデータバス幅のメモリの場合には、１回のメモリアクセスで２バイト分のデータを読み出すことができる。
【０００６】
容量が限られたメモリを有効に使うために、通常、命令はメモリ上に隙間なく配置される。従って、メモリにおいて、命令のデータは、ミスアライン配置されることがある。そのため、例えばメモリのデータバス幅と命令長が共に２バイトであっても、命令は、必ずしも１回のフェッチで読み出せる領域に収まっているとは限らない。これは、処理内容によって、１バイトや２バイト、４バイトなど、命令長が可変する可変長命令体系の場合においてより顕著である。
【０００７】
そのため、１回のフェッチで１命令を読み出せない状況が発生する。１命令の全部が揃わないと該命令を実行できないＣＰＵに対して、該命令が全部読み込まれるまで数サイクルウェイトさせることが行われている。
【０００８】
しかし、ＣＰＵをウェイトさせることは、ＣＰＵの処理効率を低下させてしまう。また、ウェイト中のクロック供給により、余分な電力消費も生じてしまう。性能向上と消費電力削減の両立を求められるマイクロコンピュータにおいては、この問題の解決が求められている。
【０００９】
特許文献１には、メモリアクセスがボトルネックとなってＣＰＵの処理効率を低下させる問題を解決する技術が開示されている。図１２を参照して説明する。
【００１０】
図１２は、特許文献１における図１であり、プロセッサ１を示す。該プロセッサ１は、演算実行ユニット３、フェッチユニット４、レジスタ５および内部メモリ６を有している。演算実行ユニット３、フェッチユニット４、レジスタ５および内部メモリ６は、互いに接続されている。
【００１１】
プロセッサ１とメインメモリ２は、フェッチユニット４を介して接続されている。メインメモリ２は、命令（Ｉｎｓｔｒｕｃｔｉｏｎ）を格納する命令領域２１と、オペランド（Ｏｐｅｒａｎｄ）を格納するオペランド領域２２を備えている。内部メモリ６も、命令を格納する命令領域６１、オペランドを格納するオペランド領域６２を備えている。なお、メインメモリ２は、内部メモリ６に比べて、低速なメモリである。
【００１２】
演算実行ユニット３は、内部メモリ６とレジスタ５を使用して演算する。フェッチユニット４は、メインメモリ２と内部メモリ６との間のデータ転送を行う。演算実行ユニット３とフェッチユニット４は、非同期で動作し、演算実行ユニット３は、第１の動作クロックで動作し、フェッチユニット４は、第１の動作クロックより周波数の小さい第２の動作クロックで動作する。
【００１３】
命令をフェッチするアドレスは、所定のアドレスから分岐命令までは連続した領域となり、メインメモリ２に高速にバーストアクセスすることで命令フェッチを行うことができる。分岐命令の場合はオペランドで示された分岐先に従って、分岐無しの場合と分岐有りの場合の両者の命令をフェッチユニット４が内部メモリ６に蓄積する。これにより、分岐命令実行に対しても演算実行ユニット３のパイプライン処理を遅滞無く継続することができる。
【００１４】
該技術は、高速な内部メモリ６と、分岐無しの場合と分岐有りの場合の両方の命令をメインメモリから内部メモリに読み込むフェッチユニット４とを備えることで、低速なメモリアクセスによるＣＰＵの性能低下を防止できるとされている。
【先行技術文献】
【特許文献】
【００１５】
【特許文献１】特開２００８−１８１１７９号公報
【発明の概要】
【発明が解決しようとする課題】
【００１６】
特許文献１の技術は、分岐の有無に関わらず、今後利用することが予測される一定量の命令をまとめて内部メモリに読み込む所謂先読みによりＣＰＵの性能低下の防止を図っている。これでは、実際に実行されない命令も読み込んでいるため、メインメモリに対する無駄なリードアクセスが発生し、消費電力も増大する。
【００１７】
本発明は、上記事情に鑑みてなされたものであり、命令を格納したメモリへの無駄なアクセスを回避すると共に、ＣＰＵの性能低下を防ぐメモリアクセス技術を提供する。
【課題を解決するための手段】
【００１８】
本発明の１つの態様は、プロセッサである。該プロセッサは、プログラム・カウンタと、命令を実行する演算部とを含むＣＰＵと、前記演算部が実行する命令をメモリからフェッチするフェッチ部を有する。
【００１９】
第１のパルス信号の立上りと立下りの片方と他方を夫々第１のエッジと第２のエッジとした場合に、前記演算部と前記フェッチ部は、下記のように動作する。
【００２０】
フェッチ部は、前記第１のパルス信号が第２のエッジになったときに、前記演算部が次に実行する命令の全ての内容を前記メモリからフェッチするために必要なフェッチ回数Ｎ（Ｎ：１以上の整数）を算出すると共に、Ｎ回のフェッチを実行して、前記メモリから前記命令の内容を逐次前記ＣＰＵに読み込む。
【００２１】
前記演算部は、前記第２のエッジの次の第２のエッジまでに、前記フェッチ部がフェッチした前記命令を実行すると共に、前記次の第２のエッジのときに、次に実行する命令の前記メモリにおける先頭アドレスを前記プログラム・カウンタと前記フェッチ部に出力する。
【００２２】
なお、前記フェッチ部は、前記Ｎ回のフェッチのうちの１回目のときに、フェッチアドレスとして前記演算部が出力した前記先頭アドレスを用い、前記Ｎ回のフェッチのうちのＫ回目（Ｋ：２以上の整数）のときに、前記Ｋと、前記プログラム・カウンタの値と、１度のアクセスで前記メモリから読み出せるデータ量を示すデータバス幅とからフェッチアドレスを算出する。
【００２３】
なお、上記態様のプロセッサを方法、半導体集積回路やマイクロコンピュータなどに置換えて表示したものなども、本発明の態様としては有効である。
【発明の効果】
【００２４】
本発明にかかる技術によれば、命令のフェッチに際して、命令を格納したメモリへの無駄なアクセスを回避すると共に、ＣＰＵの性能低下を防ぐことができる。
【図面の簡単な説明】
【００２５】
【図１】本発明にかかる技術の原理を説明するためのプロセッサを示す図である。
【図２】図１に示すプロセッサにおける演算部とフェッチ部の動作例を示すタイミングチャートである。
【図３】図１に示すプロセッサにおける演算部とフェッチ部の別の動作例を示すタイミングチャートである。
【図４】本発明の実施の形態にかかるマイクロコンピュータを示す図である。
【図５】図４に示すマイクロコンピュータの非同期制御回路における最上段の制御回路を示す図である。
【図６】図５に示す制御回路における信号の遷移例を示す図である。
【図７】図４に示すマイクロコンピュータの非同期制御回路における他の制御回路を示す図である。
【図８】図７に示す制御回路における信号の遷移例を示す図である。
【図９】図４に示すマイクロコンピュータにおけるフェッチ実行部の入出力信号の対応関係を示す図である。
【図１０】メモリに格納された複数の命令の例を示す図である。
【図１１】図９に示す複数の命令のフェッチを説明するためのタイミングチャートである。
【図１２】特許文献１に開示されたプロセッサ
【発明を実施するための形態】
【００２６】
以下、図面を参照して本発明の実施の形態について説明する。説明の明確化のため、以下の記載及び図面は、適宜、省略、及び簡略化がなされている。また、様々な処理を行う機能ブロックとして図面に記載される各要素は、ハードウェアとソフトウェア（プログラム）の組合せによっていろいろな形で実現できることは当業者には理解されるところであり、ハードウェアとソフトウェアのいずれかに限定されるものではない。なお、各図面において、同一の要素には同一の符号が付されており、必要に応じて重複説明は省略されている。
【００２７】
また、上述したプログラムは、様々なタイプの非一時的なコンピュータ可読媒体（ｎｏｎ−ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（ｔａｎｇｉｂｌｅ  ｓｔｏｒａｇｅ  ｍｅｄｉｕｍ）を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Ｐｒｏｇｒａｍｍａｂｌｅ  ＲＯＭ）、ＥＰＲＯＭ（Ｅｒａｓａｂｌｅ  ＰＲＯＭ）、フラッシュＲＯＭ、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【００２８】
本発明の具体的な実施の形態を説明する前に、まず、図１に示すプロセッサ１００を参照して、本発明にかかる技術の原理を説明する。
【００２９】
図１に示すプロセッサ１００は、ＣＰＵ１１０、フェッチ部１５０、メモリ１９０を備える。メモリ１９０は、ＣＰＵ１１０が実行する命令を格納している。
【００３０】
ＣＰＵ１１０は、演算部１２０、命令レジスタ１３０、プログラム・カウンタ（以下「ＰＣ」という）１４０を有する。
【００３１】
命令レジスタ１３０は、メモリ１９０から出力された命令を一時的に格納して、演算部１２０に供する。演算部１２０は、命令レジスタ１３０に格納された命令を実行する。ＰＣ１４０は、演算部１２０による命令の実行中に該命令の先頭アドレスを格納しており、演算部１２０により該命令の実行完了と同時に、演算部１２０により、次に実行すべき命令の先頭アドレスに更新される。
【００３２】
演算部１２０により現在実行中の命令に分岐が含まれない場合には、演算部１２０が次に実行すべき命令の先頭アドレスは、演算部１２０が実行中の命令の先頭アドレスに、実行中の命令の命令長を加算して得たアドレスであり、演算部１２０により現在実行中の命令に分岐が含まれる場合には、演算部１２０が次に実行すべき命令の先頭アドレスは、上記分岐の分岐先のアドレスになる。
【００３３】
演算部１２０とフェッチ部１５０は、第１のパルスＣＬＫ１が供給されている。第１のパルスＣＬＫ１の立上りと立下りの片方と他方を夫々第１のエッジと第２のエッジとした場合に、演算部１２０とフェッチ部１５０は、下記のように動作する。
【００３４】
フェッチ部１５０は、第１のパルスＣＬＫ１が第２のエッジになったときに、演算部１２０が次に実行する命令の全ての内容をメモリ１９０からフェッチするために必要なフェッチ回数Ｎ（Ｎ：１以上の整数）を算出すると共に、Ｎ回のフェッチを実行して、メモリ１９０から該命令の内容を逐次ＣＰＵ１１０に読み込む。
【００３５】
演算部１２０は、第１のパルスＣＬＫ１の上記第２のエッジの次の第２のエッジまでに、フェッチ部１５０がフェッチした命令を実行すると共に、上記次の第２のエッジのときに、次に実行する命令のメモリ１９０における先頭アドレスを、ＰＣ１４０とフェッチ部１５０に出力する。なお、演算部１２０は、具体的には、フェッチ部１５０による上記Ｎ回のフェッチの完了に伴って該Ｎ回のフェッチにより読み込まれた命令を実行し、上記第２のエッジの次の第２のエッジまでに該命令の実行を完了する。
【００３６】
さらに、フェッチ部１５０は、上記Ｎ回のフェッチのうちの１回目のときに、フェッチアドレスとして演算部１２０が出力した先頭アドレスを用い、２回目以降、すなわちＮ回のフェッチのうちのＫ回目（Ｋ：２以上の整数）のときに、Ｋと、ＰＣ１４０の値と、１度のアクセスで前記メモリから読み出せるデータ量（データバス幅）とからフェッチアドレスを算出する。
【００３７】
なお、「フェッチアドレス」は、フェッチ部１５０がフェッチ時にメモリに出力するアドレスを意味する。
【００３８】
分かりやすいように、以下において、例として、第１のパルスＣＬＫ１の立上りを第１のエッジとし、立下りを第２のエッジとして説明する。逆に、第１のパルスＣＬＫ１の立下りを第１のエッジとし、立上りを第２のエッジとしてもよい。
【００３９】
図２は、プロセッサ１００による処理の流れの一例を示すタイミングチャートである。該例において、命令Ａ、Ｂ、Ｃの先頭アドレスを夫々「Ａ」、「Ｂ」、「Ｃ」で示しており、これらの命令の内容を夫々「ＤＡ」、「ＤＢ」、「ＤＣ」で示している。なお、命令Ｂについては、全ての内容をメモリ１９０から読み出すために２回のフェッチが必要であり、命令Ｃについては、１回のフェッチで全ての内容がメモリ１９０から読み出されるとする。
【００４０】
図２の例において、タイミングＴ０において、命令Ａのフェッチが完了し、命令Ａの全ての内容がＣＰＵ１１０に読み出されたとする。図示のように、このとき、ＰＣ１４０には命令Ａの先頭アドレスが格納されており、命令レジスタ１３０には、命令Ａの全ての内容ＤＡが格納されている。そのため、演算部１１０は、タイミングＴ０において、命令Ａの実行を開始する。
【００４１】
なお、図２の例では、タイミングＴ０において、第１のパルスＣＬＫ１が立ち上がる
【００４２】
演算部１２０は、命令Ａの実行が完了すると、次に実行する命令（命令Ｂ）の先頭アドレスをＰＣ１４０とフェッチ部１５０に出力する。そのため、図２に示すように、タイミングＴ１における第１のパルスＣＬＫ１の立下り時に、ＰＣ１４０には、命令Ｂの先頭アドレスが格納されている。
【００４３】
タイミングＴ１における第１のパルスＣＬＫ１の立下りに応じて、フェッチ部１５０は、演算部１２０から受信した命令Ｂの先頭アドレスをメモリ１９０に出力して命令Ｂの１回目のフェッチ（Ｂ１）を行うと共に、命令Ｂの全ての内容をメモリ１９０から読み出すために必要なフェッチ回数Ｎを算出する。ここでは、フェッチ回数Ｎが「２」である。
【００４４】
命令Ｂの１回目のフェッチにより命令Ｂの内容の一部（ＤＢ１）が命令レジスタ１３０に読み込まれる。また、フェッチ回数Ｎが「２」であるため、フェッチ部１５０は、１回目のフェッチＢ１が完了すると（タイミングＴ２）、続いて命令Ｂの２回目のフェッチ（Ｂ２）を行う。
【００４５】
なお、フェッチ部１５０は、１回目のフェッチＢ１のときに、演算部１２０から受信した命令Ｂの先頭アドレスをフェッチアドレスとしてメモリ１９０に出力するが、２回目のフェッチＢ２のときには、ＰＣ１４０の値（命令Ｂの先頭アドレス）に「（Ｋ−１）×データバス幅」を加算して得たアドレスをフェッチアドレスとしてメモリ１９０に出力する。なお、ここでは、Ｋは、「２」である。
【００４６】
図示のように、タイミングＴ３において、命令Ｂの２回目のフェッチにより命令Ｂの残りの内容も命令レジスタ１３０に読み込まれ、命令レジスタ１３０には、命令Ｂの全ての内容ＤＢが格納される。
【００４７】
命令Ｂの全ての内容ＤＢが命令レジスタ１３０に格納されると、演算部１２０は、命令Ｂを実行する。また、命令Ａのときと同様に、命令Ｂの実行が完了すると、次の命令（命令Ｃ）の先頭アドレスをＰＣ１４０とフェッチ部１５０に出力する。
【００４８】
そのため、第１のパルスＣＬＫ１のタイミングＴ１における立下りの次の立下り時（タイミングＴ５）に、ＰＣ１４０には、命令Ｃの先頭アドレスが格納されている。
【００４９】
また、タイミングＴ５における第１のパルスＣＬＫ１の立下りに応じて、フェッチ部１５０は、演算部１２０から受信したアドレス（命令Ｃの先頭アドレス）をメモリ１９０に出力して命令Ｃの１回目のフェッチ（Ｃ１）を行うと共に、命令Ｃの全ての内容をメモリ１９０から読み出すために必要なフェッチ回数Ｎを算出する。ここでは、フェッチ回数Ｎが「１」である。
【００５０】
命令Ｃの１回目のフェッチにより命令Ｃの全ての内容（ＤＣ）が命令レジスタ１３０に読み込まれる（タイミングＴ６）と、演算部１２０は、該命令を実行する（タイミングＴ６〜）
【００５１】
また、フェッチ回数Ｎが「１」であるため、フェッチ部１５０は、命令Ｃについて２回目以降のフェッチをしない。
【００５２】
図２の例では、第１のパルスＣＬＫ１の立下りから立上りまでの１周期内に、フェッチ部１５０による命令のＮ回のフェッチと、演算部１２０による該命令の実行とが交互に行われ、命令の必要なフェッチ回数Ｎが２以上であっても、該命令の全ての内容がＣＰＵ１１０に読み込まれるまでフェッチが繰り返される。
【００５３】
従って、本発明にかかる技術によれば、複数回のフェッチが必要な命令のときにＣＰＵ１１０をウェイトさせる必要が無く、ＣＰＵの処理効率の低下を回避することができる。
【００５４】
フェッチ部１５０は、演算部１２０による現在の命令の実行完了後、すなわち次の命令の先頭アドレスが確定してから次の命令のフェッチを開始する。そのため、演算部１２０が次に実行すべき命令のみがフェッチされ、メモリ１９０に対する無駄なアクセスをせず、消費電力の増大を回避することができる。
【００５５】
図３は、プロセッサ１００による処理の流れの別の例を示すタイミングチャートである。該図において、図２と同様に、命令Ａ、Ｂ、Ｃの先頭アドレスを夫々「Ａ」、「Ｂ」、「Ｃ」で示しており、これらの命令の内容を夫々「ＤＡ」、「ＤＢ」、「ＤＣ」で示している。なお、命令Ｂについては、全ての内容をメモリ１９０から読み出すために２回のフェッチが必要であり、命令Ｃについては、１回のフェッチで全ての内容がメモリ１９０から読み出されるとする。
【００５６】
図２に示す例では、演算部１２０とフェッチ部１５０には、同一の第１のパルスＣＬＫ１が供給されるようになっている。図３の例では、第１のパルスＣＬＫ１は、フェッチ部１５０により生成され、演算部１２０に供される。なお、図２に示す例と比較するために、図２における各タイミングＴも図３に示している。
【００５７】
フェッチ部１５０は、フェッチする命令について、該命令のＮ回目のフェッチの完了後、望ましくはＮ回目のフェッチの完了直後に第１のパルスＣＬＫ１が立ち上がり、該立上りから所定の時間経過後に第１のパルスＣＬＫ１が立ち下がるように第１のパルスＣＬＫ１を生成する。
【００５８】
図３に示すように、タイミングｔ０（タイミングＴ０と同一であるとする）において、フェッチ部１５０は、命令Ａのフェッチが完了したため、第１のパルスＣＬＫ１を立ち上げる。このとき、ＰＣ１４０には命令Ａの先頭アドレスが格納されており、命令レジスタ１３０には、命令Ａの全ての内容ＤＡが格納されている。
【００５９】
また、フェッチ部１５０は、タイミングｔ０から所定時間経過後、第１のパルスＣＬＫ１を立ち下げる。この「所定時間」は、演算部１２０による１つの命令の実行に所要する最大時間以上であればよく、上記最大時間と同長であることが好ましい。ここでは、比較しやすいように、例えば、図２に示す第１のパルスＣＬＫ１の周期の半分と同長であるとする。そのため、第１のパルスＣＬＫ１が立ち下がるタイミングｔ１は、図２におけるタイミングＴ１と同じである。
【００６０】
タイミングｔ０において、命令Ａのフェッチが完了したため、演算部１２０は、命令Ａを実行すると共に、タイミングｔ１（タイミングＴ１）における第１のパルスＣＬＫ１の立下りに応じて、次に実行する命令（命令Ｂ）の先頭アドレスをＰＣ１４０に格納する。
【００６１】
また、タイミングｔ１において、フェッチ部１５０は、第１のパルスＣＬＫ１を立ち下げると共に、ＰＣ１４０に格納されたアドレスをメモリ１９０に出力して命令Ｂの１回目のフェッチ（Ｂ１）を行い、命令Ｂの全ての内容をメモリ１９０から読み出すために必要なフェッチ回数Ｎを算出する。前述したように、命令Ｂに対応するフェッチ回数Ｎが「２」である。
【００６２】
命令Ｂの１回目のフェッチにより命令Ｂの内容の一部（ＤＢ１）が命令レジスタ１３０に読み込まれる。また、フェッチ回数Ｎが「２」であるため、フェッチ部１５０は、１回目のフェッチＢ１が完了すると（タイミングｔ２＝Ｔ２）、続いて命令Ｂの２回目のフェッチ（Ｂ２）を行う。
【００６３】
図示のように、タイミングｔ３（＝Ｔ３）において、命令Ｂの２回目のフェッチにより命令Ｂの残りの内容も命令レジスタ１３０に読み込まれ、命令レジスタ１３０には、命令Ｂの全ての内容ＤＢが格納される。
【００６４】
ここで、演算部１２０は、命令Ｂの実行を開始する。また、フェッチ部１５０は、直に第１のパルスＣＬＫ１を立ち上げる。
【００６５】
タイミングｔ４では、上述した所定の時間が経過したため、フェッチ部１５０は、第１のパルスＣＬＫ１を立ち下げる。第１のパルスＣＬＫ１の立下りに応じて、演算部１２０は、次に実行する命令（命令Ｃ）の先頭アドレスをＰＣ１４０に格納する。
【００６６】
また、タイミングｔ４において、フェッチ部１５０は、第１のパルスＣＬＫ１を立ち下げると共に、ＰＣ１４０に格納されたアドレスをメモリ１９０に出力して命令Ｃの１回目のフェッチ（Ｃ１）を行い、命令Ｃの全ての内容をメモリ１９０から読み出すために必要なフェッチ回数Ｎを算出する。前述したように、命令Ｃに対応するフェッチ回数Ｎが「１」である。
【００６７】
命令Ｃの１回目のフェッチにより命令Ｃの全ての内容（ＤＣ）が命令レジスタ１３０に読み込まれる（タイミングｔ５＝Ｔ５）。また、フェッチ回数Ｎが「１」であるため、フェッチ部１５０は、命令Ｃについて２回目以降のフェッチをせずに、直に第１のパルスＣＬＫ１を立ち上げる。
【００６８】
また、タイミングｔ５において、命令Ｃの全ての内容が読み込まれたため、演算部１２０は、命令Ｃを実行する。
【００６９】
図２と図３を比較すると分かるように、図２の例の場合、タイミングＴ５において命令Ｃのフェッチが行われ、イミングＴ６において命令Ｃの実行が開始されるが、図３の例の場合、タイミングＴ５と同時刻のタイミングｔ５において、既に命令Ｃの実行が開始されている。
【００７０】
図３に示す例の場合は、図２に示す例と同様の効果を得ることができると共に、フェッチ部１５０がフェッチの進捗状況に応じた第１のパルスＣＬＫ１を生成するため、命令のフェッチと実行をより効率良く行うことができる。
【００７１】
次いで、フェッチ部１５０によるフェッチ回数Ｎの算出を具体的に説明する。
ＣＰＵの命令体系は、固定長命令体系と可変長命令体系に分けることができる。ここで、ＣＰＵ１１０の命令体系が固定長命令体系であるときに、演算部１２０が現在実行している命令に「分岐無し」と「分岐有り」の場合別に説明する。
【００７２】
＜固定長命令体系＞
＜＜分岐無し＞＞
この場合、演算部１２０は、実行が完了した命令の先頭アドレスに命令長（固定値）を加算して得たアドレスをＰＣ１４０とフェッチ部１５０に出力する。また、命令長が固定であるため、フェッチ対象の命令の先頭アドレスが確定した時点で、フェッチ部１５０は、該命令のフェッチ回数Ｎを算出することができる。
【００７３】
具体的には、フェッチ部１５０は、命令長（固定値）と、該命令の先頭アドレスと、メモリ１９０のデータバス幅とに基づいてフェッチ回数Ｎを算出する。
【００７４】
前述したように、命令はメモリ上に隙間なく配置されるため、命令のデータは、ミスアライン配置されることがある。従って、同じ命令長の命令でも、それらの格納位置によって必要なフェッチ回数が異なる可能性がある。
【００７５】
例えば、データバス幅が２バイトであり、命令長も２バイトである。ミスアラインに配置されていない命令は、１回のフェッチでその全てが読み出されるが、ミスアラインに配置された命令は、全てが読み出されるために２回のフェッチが必要である。
【００７６】
従って、フェッチ部１５０は、フェッチ回数Ｎを算出する際に、フェッチ対象の命令の先頭アドレスを参照する必要がある。
【００７７】
＜＜分岐有り＞＞
この場合、演算部１２０は、実行が完了した命令に含まれる分岐により示される分岐先のアドレスをＰＣ１４０とフェッチ部１５０に出力する。このアドレスは、次に実行すべき命令の先頭アドレスになる。
【００７８】
フェッチ部１５０は、「分岐無し」の場合と同様に、次に実行すべき命令の先頭アドレスが確定した時点で、該先頭アドレスと、命令長（固定値）と、データバス幅とから、フェッチ回数Ｎを算出する。
【００７９】
フェッチ部１５０も、「分岐無し」の場合と同様に、算出したＮ回のフェッチを実行する。
【００８０】
なお、フェッチ部１５０は、当該命令について、算出したＮ回のフェッチを行うが、１回目のフェッチの開始は、フェッチ回数Ｎの算出後である必要はない。
【００８１】
１回目のフェッチは、必ず行われる。そのため、例えば、フェッチ対象の命令の先頭アドレスが確定した時点で、フェッチ部１５０は、１回目のフェッチを行うと共に、フェッチ回数Ｎの算出を行う。１回目のフェッチ後、フェッチ部１５０は、算出したフェッチ回数Ｎを参照し、「Ｎ」が１である場合には、２回目以降のフェッチを行わない一方、「Ｎ」が２以上である場合には、さらに「Ｎ−１」回のフェッチを行う。
【００８２】
次に、ＣＰＵ１１０の命令体系が可変長命令体系であるときに説明する。
＜可変長命令体系＞
＜＜分岐無し＞＞
この場合、固定長命令体系のときと同様に、フェッチ対象の命令の先頭アドレスは、演算部１２０が現在実行中の命令の先頭アドレスに命令長を加算したアドレスになる。
【００８３】
可変長命令体系の場合、命令長は、通常、当該命令の先頭（例えば１バイト目）により示される。そのため、フェッチする命令の先頭アドレスが確定した時点では、フェッチ部１５０は、まだ該命令の命令長を知らず、フェッチ回数Ｎを算出することができない。
【００８４】
従って、この場合、フェッチする命令の先頭アドレスが確定した時点で、まず、フェッチ部１５０は、１回目のフェッチを行う。これにより、当該命令の少なくとも先頭部分は、命令レジスタ１３０に格納される。
【００８５】
そして、フェッチ部１５０は、１回目のフェッチにより命令レジスタ１３０に格納された命令の内容から命令長を生成すると共に、生成した命令長と、データバス幅と、該命令の先頭アドレスとから、フェッチ回数Ｎを算出する。
【００８６】
その後のフェッチ部１５０の動作は、固定命令長体系の場合と同様であり、ここで説明を省略する。
【００８７】
＜＜分岐有り＞＞
演算部１２０は、実行が完了した命令に含まれる分岐により示される分岐先のアドレスをＰＣ１４０とフェッチ部１５０に出力する。このアドレスは、次に実行すべき命令の先頭アドレスになる。
【００８８】
フェッチ部１５０は、１回目のフェッチを行う。これにより、該命令の少なくとも先頭部分が命令レジスタ１３０に格納される。
【００８９】
フェッチ部１５０は、「分岐無し」のときと同様に、１回目のフェッチにより命令レジスタ１３０に格納された命令の内容から命令長を生成すると共に、生成した命令長と、データバス幅と、該命令の先頭アドレスとから、フェッチ回数Ｎを算出する。
その後のフェッチ部１５０の動作は、「分岐無し」のときと同様である。
【００９０】
図１において、フェッチ部１５０がＣＰＵ１１０の外部に設けられているが、フェッチ部１５０の全部や、または、一部例えば命令長を生成する機能ブロックの部分をＣＰＵ１１０の内部に設けるようにしてもよい。
【００９１】
以上の本発明にかかる技術の原理を踏まえて、本発明にかかる実施の形態を説明する。
図４は、本発明の実施の形態にかかるマイクロコンピュータ２００を示す。マイクロコンピュータ２００は、メモリ２１０、ＣＰＵ２２０、非同期制御回路３００、フェッチ実行部３６０を備える。
【００９２】
メモリ２１０は、ＣＰＵ２２０が実行する命令を格納しており、フェッチ実行部３６０からアドレスを示す信号ＡＤＲが入力され、該アドレスに格納されたデータ（命令または命令の一部。以下「リードデータＩＮＳ」という）を出力する。なお、信号ＡＤＲは、フェッチ毎にフェッチ実行部３６０からメモリ２１０に出力され、該信号ＡＤＲが示すアドレスは、フェッチアドレスに該当する。
【００９３】
ＣＰＵ２２０は、命令を実行する演算部２２２、分配部２２４、命令レジスタ２２６、プログラム・カウンタ（ＰＣ）２２８、命令長生成部２３０を備える。例として、ＣＰＵ２２０内の全てのレジスタ（命令レジスタ２２６やＰＣ２２８など）は、全て立下り駆動であるとする。
【００９４】
分配部２２４は、メモリ２１０から出力されたリードデータＩＮＳを、フェッチ実行部３６０からの分配信号ＡＴＲに従って命令レジスタ２２６に分配する。分配信号ＡＴＲは、メモリ２１０からのリードデータＩＮＳを命令レジスタ２２６内に格納する際の格納位置例えば何バイト目かを示す信号であり、分配部２２４は、分配信号ＡＴＲに応じて、当該回のフェッチによりメモリ２１０から出力されたリードデータＩＮＳを適切に命令レジスタ２２６に分配する。
【００９５】
命令レジスタ２２６は、分配部２２４により分配されたリードデータＩＮＳを格納する。なお、命令レジスタ２２６は、非同期制御回路３００からのパルス信号ＣＬＫ０（以下「格納パルス」という）に応じて動作する。
【００９６】
ＰＣ２２８は、演算部２２２が次に実行すべき命令のメモリ２１０における先頭アドレスを格納するものである。演算部２２２は、現在の命令を実行した結果、分岐が無い場合にはＰＣ２２８に格納されたアドレスに現在の命令の長さを加算したアドレスを格納する一方、分岐がある場合には分岐先のアドレスをＰＣ２２８に設定する。なお、演算部２２２は、次の命令の先頭アドレスをＣ２２８に設定する際に、該先頭アドレスをフェッチ実行部３６０にも出力する。
【００９７】
本実施の形態のプロセッサ１００において、ＣＰＵ２２０が、可変命令長の命令体系を有する。
【００９８】
命令長生成部２３０は、命令レジスタ２２６に格納された命令の長さを取得してフェッチ実行部３６０に供するものである。本実施の形態において、命令長生成部２３０は、当該命令の１回目のフェッチにより命令レジスタ２２６に格納された内容から該命令の命令長ＬＧＨを生成してフェッチ実行部３６０に出力する。
【００９９】
なお、命令長生成部２３０と、非同期制御回路３００と、フェッチ実行部３６０は、フェッチ部２５０を構成する。
【０１００】
フェッチ実行部３６０は、フェッチ対象の命令のフェッチ回数Ｎの算出と、該命令のフェッチの実行を行う。
【０１０１】
非同期制御回路３００は、初期化完了時に第１のパルスＣＬＫ１を立ち上げ、所定時間経過後に第１のパルスＣＬＫ１を立ち下げる。また、非同期制御回路３００は、第１のパルスＣＬＫ１の立下りに応じてフェッチ実行部３６０による命令の１回目のフェッチの開始後、ｎ回目（１≦ｎ＜Ｎ）回目のフェッチが完了する度に（ｎ＋１）回目のフェッチの開始を指示するタイミング信号（後述する第２の制御信号ＣＴＲ２、第３の制御信号ＣＴＲ３、第４の制御信号ＣＴＲ４）をフェッチ実行部３６０に出力する。また、非同期制御回路３００は、Ｎ回目のフェッチに対応する上記タイミング信号の出力後、初期化を開始する。
【０１０２】
フェッチ実行部３６０と非同期制御回路３００をより具体的に説明する。
フェッチ実行部３６０は、演算部２２２から出力されたアドレス（演算部２２２が次に実行する命令の先頭アドレス）と、メモリ２１０のデータバス幅Ｗと、命令長生成部２３０からの命令長ＬＧＨとに基づいて、該命令をメモリ２１０からＣＰＵ２２０に読み込むために必要な回数（フェッチ回数Ｎ）を算出する。本実施の形態において、例として、フェッチ回数Ｎがなり得る最大値が「４」であるとする。
【０１０３】
また、本実施の形態において、フェッチ実行部３６０に対してデータバス幅Ｗが設定可能になっており、フェッチ実行部３６０は、フェッチ回数Ｎの算出に、設定されたデータバス幅Ｗを用いる。なお、このデータバス幅Ｗの設定は、マイクロコンピュータ２００の外部からなされてもよいし、例えばＣＰＵ１１０に備えられた該設定用のレジスタから設定されるようにしてもよい。
【０１０４】
フェッチ実行部３６０は、算出フェッチ回数Ｎに応じた値を、３つの選択制御信号（第１の選択制御信号ＢＲ１、第２の選択制御信号ＢＲ２、第３の選択制御信号ＢＲ３）に出力する。具体的には、Ｎが「１」である場合には、フェッチ実行部３６０は、全ての選択信号に「０」を出力する。Ｎが「２」である場合には、フェッチ実行部３６０は、第１の選択制御信号ＢＲ１にのみ「１」を出力し、他の選択制御信号には「０」を出力する。また、Ｎが「３」である場合には、フェッチ実行部３６０は、第１の選択制御信号ＢＲ１と第２の選択制御信号ＢＲ２に「１」を出力し、第３の選択制御信号ＢＲ３に「０」を出力する。さらに、Ｎが「４」である場合には、フェッチ実行部３６０は、全ての選択制御信号に「１」を出力する。
【０１０５】
フェッチ実行部３６０は、さらに、フェッチアドレスＡＤＲ、分配信号ＡＴＲを出力する。
【０１０６】
フェッチアドレスＡＤＲは、フェッチが行われる度にメモリ２１０に出力される。分配信号ＡＴＲは、フェッチが行われる度に分配部２２４に出力される。
【０１０７】
非同期制御回路３００は、インバータ３０２、制御回路３０４、デマルチプレクサ（ＤＭＵＸ）３１０、制御回路３１２、ＤＭＵＸ３２０、制御回路３２２、ＯＲ回路３２４、ＤＭＵＸ３３０、制御回路３３２、ＯＲ回路３３４、ＯＲ回路３４０、ＯＲ回路３５０を有する。
【０１０８】
制御回路３０４は、入力ＩＮ１に応じて、第１のパルスＣＬＫ１をＣＰＵ２２０とＯＲ回路３５０に出力し、出力ＯＵＴ１をＤＭＵＸ３１０に出力する。図５は、制御回路３０４を示す。
【０１０９】
制御回路３０４は、通常知られているＱモジュール４００である。Ｑモジュール４００は、ＡＮＤ回路４０１、遅延素子４０２、Ｃ素子４０３、インバータ４０４、インバータ４０５、ＡＮＤ回路４０６を備える。Ｃ素子４０３は、ＭｕｌｌｅｒのＣ素子であり、全ての入力値が一致したときにのみ出力がその入力値に遷移する記憶素子である。
【０１１０】
図示のように、入力ＩＮ１は、ＡＮＤ回路４０１とＣ素子４０３に入力される。ＡＮＤ回路４０１は、入力ＩＮ１と、インバータ４０４により反転されたＣ素子４０３の出力との論理積を遅延素子４０２に出力する。遅延素子４０２は、ＡＮＤ回路４０１の出力を所定量遅延する。
【０１１１】
遅延素子４０２の出力は、第１のパルスＣＬＫ１である。この第１のパルスＣＬＫ１は、ＣＰＵ２２０（より具体的には、ＣＰＵ２２０の演算部２２２）とＯＲ回路３５０に出力される。第１のパルスＣＬＫ１は、Ｃ素子４０３とインバータ４０５に出力される。
【０１１２】
Ｃ素子４０３の出力は、インバータ４０４と、ＡＮＤ回路４０６に出力される。ＡＮＤ回路４０６は、Ｃ素子４０３の出力と、インバータ４０５により反転された第１のパルスＣＬＫ１との論理積を出力する。この論理積は、出力ＯＵＴ１であり、ＤＭＵＸ３１０に出力される。
【０１１３】
図６は、制御回路３０４すなわちＱモジュール４００において、入力ＩＮ１の変化に伴った他の各信号の遷移例を示す。
【０１１４】
図示のように、タイミングｔ０において、入力ＩＮ１が立ち上がると、遅延素子４０２の遅延量の分の時間（ｔ１−ｔ２）が経過してタイミングｔ１になると、第１のパルスＣＬＫ１が立ち上がる。
【０１１５】
Ｃ素子４０３の２つの入力（入力ＩＮ１、第１のパルスＣＬＫ１）が共に「１」となったため、Ｃ素子４０３の出力は「０」から「１」に遷移する。
【０１１６】
Ｃ素子４０３の出力が「１」になると、インバータ４０４を介してＡＮＤ回路４０１に入力される信号が「０」になるため、ＡＮＤ回路４０１の出力も「０」になる。
【０１１７】
そして、遅延素子４０２の遅延量分の時間が経過してタイミングｔ２になると、第１のパルスＣＬＫ１も立ち下がる。これに応じて、出力ＯＵＴ１は、立ち上がる。
【０１１８】
その後、タイミングｔ３において、入力ＩＮ１が立ち下がると、Ｃ素子４０３の２つの入力が共に「０」となったため、Ｃ素子４０３の出力は「１」から「０」に遷移する。
【０１１９】
そのため、直後のタイミングｔ４において、出力ＯＵＴ１も立ち下がる。その後、タイミングｔ５で入力ＩＮ１が再び立ち上がると、前述したタイミングｔ０からの信号遷移が繰り返される。
【０１２０】
制御回路３０４からの出力ＯＵＴ１は、ＤＭＵＸ３１０に入力される。ＤＭＵＸ３１０は、１入力２出力デマルチプレクサであり、ＤＭＵＸ３１０からの第１の選択制御信号ＢＲ１に応じて、出力ＯＵＴ１を第１の出力Ｘ１と第２の出力Ｙ１のいずれかに出力する。具体的には、ＤＭＵＸ３１０は、第１の選択制御信号ＢＲ１が「０」であるときに、出力ＯＵＴ１を第１の出力Ｘ１に出力し、第１の選択制御信号ＢＲ１が「１」である場合には、出力ＯＵＴ１を第２の出力Ｙ１に出力する。
【０１２１】
つまり、出力ＯＵＴ１が「０」である場合には、第１の選択制御信号ＢＲ１に関わらず、第１の出力Ｘ１と第２の出力Ｙ１は、共に「０」である。出力ＯＵＴ１が「１」である場合には、第１の選択制御信号ＢＲ１が「０」であるときに第１の出力Ｘ１が「１」であり第２の出力Ｙ１が「０」である一方、第１の選択制御信号ＢＲ１が「１」であるときに、第１の出力Ｘ１が「０」であり、第２の出力Ｙ１が「１」である。
【０１２２】
ＤＭＵＸ３１０の第１の出力Ｘ１は、ＯＲ回路３２４に出力され、第２の出力Ｙ１は、制御回路３１２に出力される。以下、ＤＭＵＸ３１０の第２の出力Ｙ１を、制御回路３１２の入力信号（入力ＩＮ２）ともいう。
【０１２３】
制御回路３１２は、入力ＩＮ２に応じて、第２の制御信号ＣＴＲ２をフェッチ実行部３６０に出力し、第２のパルスＣＬＫ２をＯＲ回路３５０に出力する。図７を参照して制御回路３１２を説明する。
【０１２４】
図７に示すように、制御回路３１２は、Ｑモジュール４００、ＡＮＤ回路４１０、インバータ４１２を有する。Ｑモジュール４００は、入力ＩＮ２を入力され、第２のパルスＣＬＫ２と出力ＯＵＴ２を出力する。図５に示す制御回路３０４のときに既にＱモジュール４００を説明したため、ここで詳細な説明を省略する。
【０１２５】
制御回路３１２では、入力ＩＮ２は、ＡＮＤ回路４１０に入力される。また、出力ＯＵＴ２は、インバータ４１２により反転されてＡＮＤ回路４１０に入力される。
【０１２６】
図８は、制御回路３１２において、入力ＩＮ２の変化に伴った他の各信号の遷移例を示す。
【０１２７】
第２のパルスＣＬＫ２と出力ＯＵＴ２の入力ＩＮ２の変化に伴った遷移は、第１のパルスＣＬＫ１と出力ＯＵＴ１の入力ＩＮ１の変化に伴った遷移と同様である。
【０１２８】
第２の制御信号ＣＴＲ２は、入力ＩＮ２の立上りに応じて立ち上がり（ｔ１０、ｔ１５）、出力ＯＵＴ２の立ち上がりに応じて立ち下がる（ｔ１２）。この第２の制御信号ＣＴＲ２は、前述したように、フェッチ実行部３６０に出力される。
【０１２９】
制御回路３１２の出力ＯＵＴ２は、ＤＭＵＸ３２０に入力される。ＤＭＵＸ３２０も、１入力２出力のデマルチプレクサであり、フェッチ実行部３６０からの第２の選択制御信号ＢＲ２に応じて、入力（出力ＯＵＴ２）を第１の出力Ｘ２と第２の出力Ｙ２のいずれかに出力する。
【０１３０】
ＤＭＵＸ３２０の第１の出力Ｘ２はＯＲ回路３２４に出力され、第２の出力Ｙ２は制御回路３２２に出力される。以下、ＤＭＵＸ３２０の第２の出力Ｙ２を、制御回路３２２の入力信号（入力ＩＮ３）ともいう。
【０１３１】
なお、ＯＲ回路３２４は、ＤＭＵＸ３１０の第１の出力Ｘ１と、ＤＭＵＸ３２０の第１の出力Ｘ２の論理和をＯＲ回路３３４に出力する。
【０１３２】
制御回路３２２は、制御回路３１２と同様の構成を有し、入力ＩＮ３に応じて、第３のパルスＣＬＫ３をＯＲ回路３５０に出力し、第３の制御信号ＣＴＲ３をフェッチ実行部３６０に出力し、出力ＯＵＴ３をＤＭＵＸ３３０に出力する。制御回路３１２に対して行った説明に対して、入力ＩＮ２、第２のパルスＣＬＫ２、第２の制御信号ＣＴＲ２、出力ＯＵＴ２を夫々入力ＩＮ３、第３のパルスＣＬＫ３、第３の制御信号ＣＴＲ３、出力ＯＵＴ３に置換えれば、制御回路３２２の説明になるので、ここで制御回路３２２の詳細な説明を省略する。
【０１３３】
制御回路３２２の出力ＯＵＴ３は、ＤＭＵＸ３３０に入力される。ＤＭＵＸ３３０も、１入力２出力のデマルチプレクサであり、フェッチ実行部３６０からの第３の選択制御信号ＢＲ３に応じて、入力（出力ＯＵＴ３）を第１の出力Ｘ３と第２の出力Ｙ３のいずれかに出力する。
【０１３４】
ＤＭＵＸ３３０の第１の出力Ｘ３はＯＲ回路３３４に出力され、第２の出力Ｙ２は制御回路３３２に出力される。以下、ＤＭＵＸ３３０の第２の出力Ｙ３を、制御回路３３２の入力信号（入力ＩＮ４）ともいう。
【０１３５】
なお、ＯＲ回路３３４は、ＯＲ回路３２４の出力と、ＤＭＵＸ３３０の第１の出力Ｘ３の論理和をＯＲ回路３４０に出力する。
【０１３６】
制御回路３３２は、制御回路３１２及び制御回路３２２と同様の構成を有し、入力ＩＮ４に応じて、第４のパルスＣＬＫ４をＯＲ回路３５０に出力し、第４の制御信号ＣＴＲ４をフェッチ実行部３６０に出力し、出力ＯＵＴ４をＯＲ回路３４０に出力する。制御回路３１２に対して行った説明に対して、入力ＩＮ２、第２のパルスＣＬＫ２、第２の制御信号ＣＴＲ２、出力ＯＵＴ２を夫々入力ＩＮ４、第４のパルスＣＬＫ４、第４の制御信号ＣＴＲ４、出力ＯＵＴ４に置換えれば、制御回路３３２の説明になるので、ここで制御回路３３２の詳細な説明も省略する。
【０１３７】
ＯＲ回路３４０は、ＯＲ回路３３４の出力と、制御回路３３２からの出力ＯＵＴ４との論理和をインバータ３０２に出力する。
【０１３８】
インバータ３０２は、ＯＲ回路３４０の出力を反転させて制御回路３０４に出力する。インバータ３０２の出力は、制御回路３０４の入力ＩＮ１になる。
【０１３９】
また、ＯＲ回路３５０は、４入力のＯＲ回路であり、制御回路３０４からの第１のパルスＣＬＫ１、制御回路３１２からの第２のパルスＣＬＫ２、制御回路３２２からの第３のパルスＣＬＫ３、制御回路３３２からの第４のパルスＣＬＫ４の論理和を命令レジスタ２２６に出力する。ＯＲ回路３５０の出力は、格納パルスＣＬＫ０である。
【０１４０】
非同期制御回路３００とフェッチ実行部３６０の動作をまとめる。
初期状態において、非同期制御回路３００内の全ての信号が０であるとすると、インバータ３０２により入力ＩＮ１が立ち上がる。制御回路３０４の内部動作の後、出力ＯＵＴ１が立ち上がる。その後、第１の選択制御信号ＢＲ１、第２の選択制御信号ＢＲ２、第３の選択制御信号ＢＲ３の値によって、制御回路３１２、制御回路３２２、制御回路３３２の動作が異なる。
【０１４１】
例えば、第１の選択制御信号ＢＲ１、第２の選択制御信号ＢＲ２、第３の選択制御信号ＢＲ３が全て「０」であれば、出力ＯＵＴ１の立上りにより、ＯＲ回路３２４、ＯＲ回路３３４、ＯＲ回路３４０の出力が順々に立ち上がる。この場合、制御回路３１２、制御回路３２２、制御回路３３２は、動作しない。一方、第１の選択制御信号ＢＲ１、第２の選択制御信号ＢＲ２、第３の選択制御信号ＢＲ３が全て「１」であれば、制御回路３１２、制御回路３２２、制御回路３３２は順々に動作し、最終的にＯＲ回路３４０の出力が立ち上がる。
【０１４２】
ＯＲ回路３４０の出力の立上りにより、制御回路３０４の入力ＩＮ１が立ち下がり、さらに、出力ＯＵＴ１も立ち下がる。これにより、制御回路３０４は、初期状態に戻る。同様に、他の制御回路も入力ＩＮ２〜ＩＮ４の立下りにより初期化されていき、最終的には、ＯＲ回路３４０の出力も立ち下がり、非同期制御回路３００は初期状態に戻る。なお、入力ＩＮ１の立ち下がりから、非同期制御回路３００全体が初期状態に戻るまでの動作を初期化と呼ぶ。
【０１４３】
フェッチ実行部３６０は、フェッチ対象の命令の１回目のフェッチ時に、演算部２２２から受信したアドレス（演算部２２２が次に実行する命令のメモリ２１０における先頭アドレス）をメモリ２１０に出力すると共に、該フェッチによりメモリ２１０から出力されるデータの格納すべき位置を示す分配信号ＡＴＲを分配部２２４に出力する。
【０１４４】
１回目のフェッチによりリードデータＩＮＳが命令レジスタ２２６に格納されると、フェッチ実行部３６０は、フェッチ回数Ｎを算出すると共に、算出したフェッチ回数Ｎに応じた値を第１の選択制御信号ＢＲ１、第２の選択制御信号ＢＲ２、第３の選択制御信号ＢＲ３に出力する。
【０１４５】
その後、非同期制御回路３００からフェッチを示すタイミング信号（第２の制御信号ＣＴＲ２、第３の制御信号ＣＴＲ３、第４の制御信号ＣＴＲ４）が入力されれば、入力された制御信号に応じてフェッチを行う。なお、フェッチ実行部３６０は、Ｋ回（Ｋ：２以上の整数）目のフェッチ用のフェッチアドレスとして、ＰＣ２２８の値に、「（Ｋ−１）×データバス幅Ｗ」を加算して得たアドレスを算出する。
【０１４６】
図９は、フェッチ実行部３６０に入力される各信号と、フェッチ実行部３６０が出力する各信号の真理値の対応関係の一例を示す。図９において、「ｘ」ドントケアであることを示す。「ＰＣ値」とは、演算部２２２による更新直前の、ＰＣ２２８に格納されているアドレスを意味する。また、「アドレスＡＤＲ」のの欄に書かれている「ＰＣ」とは上記ＰＣ値を示す。なお、「アドレスＡＤＲ」は、フェッチ実行部３６０が出力するフェッチアドレスを意味し、該アドレスＡＤＲは、各命令について、１回目のフェッチ時には、演算部２２２からフェッチ実行部３６０とＰＣ２２８に出力される値から、２回目以降のフェッチ時には、フェッチ実行部３６０により、ＰＣ２２８の値（更新後の値）から算出されるようになっている。
【０１４７】
分配信号ＡＴＲについては、「０」、「１」、「２」、「３」は、夫々命令レジスタ２２６の０バイト目、１バイト目、２バイト目、３バイト目を示す。なお、データバス幅Ｗと命令長ＬＧＨをバイト単位で表している。また、図９は、あくまで一例を示すものであり、データバス幅Ｗや命令長ＬＧＨの取りうる範囲によって変化する。
【０１４８】
また、図９の１列目の各欄では、英字は命令を示し、英字の後の数字は、該命令の何回目のフェッチが完了した状態であるのかを示す。例えば、「Ｃ１」と「Ｃ２」は、同一の命令Ｃの１回目のフェッチが完了した状態であることと２回目のフェッチが完了した状態であることを夫々示す。
【０１４９】
図９の「Ａ１」の行が示すように、データバス幅Ｗが１バイトであり、命令長ＬＧＨが１バイトである場合に、演算部２２２がＰＣ２２８とフェッチ実行部３６０に出力した次の命令の先頭アドレスが「ＰＣ値＋命令長ＬＧＨ」であり、フェッチ実行部３６０は、次の命令の１回目のフェッチ時に該先頭アドレスをフェッチアドレスＡＤＲとしてメモリ２１０に出力する。同時に、今回のフェッチによりメモリ２１０から出力されたリードデータＩＮＳの格納位置を示す分配信号ＡＴＲとして「０」を分配部２２４に出力する。なお、この場合、フェッチ実行部３６０は、第１の選択制御信号ＢＲ１、第２の選択制御信号ＢＲ２、第３の選択制御信号ＢＲ３を出力しない。第１の選択制御信号ＢＲ１、第２の選択制御信号ＢＲ２、第３の選択制御信号ＢＲ３が共に「０」であるため、第２の制御信号ＣＴＲ２、第３の制御信号ＣＴＲ３、第４の制御信号ＣＴＲ４の出力もない。すなわち、該命令は、１回のフェッチで全てがＣＰＵ２２０に読み込まれる。
【０１５０】
一方、「Ｃ１」〜「Ｃ３」の３行が示すように、データバス幅Ｗが１バイトであり、命令長ＬＧＨが３バイトである場合に、ＰＣ２２８の現在の値が「ＰＣ値」であり、フェッチ実行部３６０は、２回目のフェッチ時にＰＣ２２８の現在の値（「ＰＣ値」）に「（Ｋ−１）×データバス幅Ｗ」の「１」を加算して得た「ＰＣ値＋１」をフェッチアドレスＡＤＲとしてメモリ２１０に出力すると共に、分配信号ＡＴＲとして「１」を分配部２２４に出力する。また、フェッチ実行部３６０は、第１の選択制御信号ＢＲ１、第２の選択制御信号ＢＲ２に「１」を出力し、第３の選択制御信号ＢＲ３を出力しない。
【０１５１】
３回目のフェッチ（「Ｃ２」）時に、フェッチ実行部３６０は、ＰＣ２２８の現在の値（「ＰＣ値」）に「（Ｋ−１）×データバス幅Ｗ」の「２」を加算して得た「ＰＣ値＋２」をフェッチアドレスＡＤＲとしてメモリ２１０に出力し、分配信号ＡＴＲとして「２」を分配部２２４に出力する。また、次の命令の１回目のフェッチ時に「ＰＣ値＋命令長」をフェッチアドレスＡＤＲとしてメモリ２１０に出力し、分配信号ＡＴＲとして「０」を分配部２２４に出力する。すなわち、該命令Ｃは、３回のフェッチにより全てがＣＰＵ２２０に読み込まれる。
【０１５２】
なお、前述したように、メモリ２１０における命令の配置がミスアラインになっているか否かによって、命令長ＬＧＨが同一である２つの命令でも、必要なフェッチ回数が異なる可能性がある。
【０１５３】
例えば、「Ｊ１」の行が示すように、データバス幅Ｗが４バイトであり、ＰＣ値が「００」である場合には、命令長ＬＧＨが１、２、３、４のいずれであるときにも、フェッチ実行部３６０は、第１の選択制御信号ＢＲ１、第２の選択制御信号ＢＲ２、第３の選択制御信号ＢＲ３を出力せず、次の命令の１回目のフェッチとなる「ＰＣ値＋命令長ＬＧＨ」をフェッチアドレスＡＤＲとしてメモリ２１０に出力する。すなわち、１回のフェッチで該命令の全てがＣＰＵ２２０に読み込まれる。
【０１５４】
ところで、データバス幅Ｗが４バイトであり、命令長ＬＧＨが４バイトであっても、ＰＣ値が「０１」である場合には、該命令がミスアラインに配置されているため、１回のフェッチではその全てを読み出すことができない。そのため、「Ｌ１」〜「Ｌ２」の行が示すように、フェッチ実行部３６０は、２回のフェッチを行うために、第１の選択制御信号ＢＲ１に「１」に出力すると共に、１回目のフェッチ（「Ｌ１」）時に「ＰＣ値＋３バイト」をフェッチアドレスＡＤＲとしてメモリ２１０に出力し、２回目のフェッチ（「Ｌ２」）時に「ＰＣ値＋命令長ＬＧＨ」をメモリ２１０に出力する。
【０１５５】
ここで、フェッチする命令の具体例を参照してマイクロコンピュータ２００の各機能ブロックの動作をより詳細に説明する。
【０１５６】
図１０は、メモリ２１０に格納され、フェッチ実行部３６０により順次フェッチされる複数命令の例を示す。なお、メモリ２１０のデータバス幅Ｗは、１６ビットであり、フェッチ実行部３６０とフェッチ実行部３６０に対して設定されている。また、分かりやすいように、各命令に分岐が含まれないと仮定して説明する。
【０１５７】
図１１は、フェッチ実行部３６０が図１０に示す複数の命令をフェッチする際のタイミングチャートである。なお、全てのレジスタが立下り駆動であるとする。
【０１５８】
タイミングＴ１０において制御回路３０４の入力ＩＮ１が立ち上がると、第１のパルスＣＬＫ１は、その後のタイミングＴ１１において立ち上がり、タイミングＴ１２で立ち下がる。
【０１５９】
タイミングＴ１１〜タイミングＴ１２までの間に、演算部２２２は、命令「ｆｆｅｅ」を実行する。この期間において、ＰＣ２２８には、該命令の先頭アドレス「１１０ＥＨ」を格納している。該命令の命令長ＬＧＨ（２バイト）は、命令長生成部２３０により命令レジスタ２２６の１バイト目から生成され、フェッチ実行部３６０に供されている。
【０１６０】
タイミングＴ１２における第１のパルスＣＬＫ１の立下りに応じて、演算部２２２は、ＰＣ２２８や命令レジスタ２２６などのＣＰＵ２２０内の各レジスタを更新する。これにより、ＰＣ２２８には、タイミングＴ１２の後に演算部２２２が実行する命令の先頭アドレスとして、更新前のＰＣ値に命令長ＬＧＨの２バイトを加算して得た新しいＰＣ値（１１１０Ｈ）が格納される。また、演算部２２２は、このアドレスをフェッチ実行部３６０にも出力する。
【０１６１】
タイミングＴ１２における第１のパルスＣＬＫ１の立下りに応じて、フェッチ実行部３６０は、「１１１０Ｈ」をメモリ２１０に出力する。これにより、メモリ２１０からリードデータＩＮＳとして「ａａｃｃ」が出力され、命令レジスタ２２６に格納される。
【０１６２】
ここで、「ｃｃＨ」の命令が１バイトであるとする。命令長生成部２３０は命令「ｃｃＨ」の命令長ＬＧＨ「１」を取得して、フェッチ実行部３６０に出力する。
【０１６３】
なお、命令「ｃｃＨ」が１バイトであるため、図示のように、命令レジスタ２２６には、「ｃｃＨ」のみが格納されている。
【０１６４】
さらに、ＰＣ値と命令長ＬＧＨが確定したことにより、フェッチ実行部３６０は、これ以上フェッチは必要ないと判断し選択信号ＢＲ１〜ＢＲ３を全て「０」のままにする。そのため、制御回路３０４、制御回路３１２、制御回路３２２、制御回路３３２は動作することなく、タイミングＴ２２における第１のパルスＣＬＫ１の立下りに応じてフェッチアドレスＡＤＲも「１１１１Ｈ」に確定する。フェッチアドレスＡＤＲに対応するリードデータＩＮＳは、「ａａＨ」である。
【０１６５】
なお、タイミングＴ１２〜Ｔ２０の間に非同期制御回路３００の初期化が行われ、タイミングＴ２０において、再び制御回路３０４の入力ＩＮ１が立ち上がる。これにより、第１のパルスＣＬＫ１は、その後のタイミングＴ２１において立ち上がり、タイミングＴ２２で立ち下がる。
【０１６６】
演算部２２２は、タイミングＴ２２における第１のパルスＣＬＫ１の立下りに応じて、実行が完了した命令「ｃｃＨ」の次の命令の先頭アドレスをフェッチ実行部３６０に実行すると共に、この先頭アドレスでＰＣ２２８を更新する。
【０１６７】
そのため、タイミングＴ２２において、ＰＣ２２８や命令レジスタ２２６などのＣＰＵ２２０内の各レジスタが更新される。ＰＣ２２８は、新たなＰＣ値として「１１１１Ｈ」を保持し、命令レジスタ２２６には、フェッチアドレスＡＤＲが示すメモリ２１０の「１１１１Ｈ」番地からのリードデータＩＮＳ（「ａａＨ」）が読み込まれる。
【０１６８】
ここで、ａａＨの命令コードは４バイト命令であるとする。命令長ＬＧＨが４バイトを示すため、フェッチ実行部３６０は、フェッチ回数Ｎとして「３」を算出する。そのため、フェッチ実行部３６０は、後２回のフェッチが必要と判断し、第１の選択制御信号ＢＲ１と第２の選択制御信号ＢＲ２に「１」を出力する。
【０１６９】
これにより、まず、制御回路３１２の入力ＩＮ２が立ち上がり、直に第２の制御信号ＣＴＲ２も立ち上がる（タイミングＴ２２）。これに応じて、フェッチ実行部３６０から次のフェッチアドレスＡＤＲとして「１１１２Ｈ」がメモリ２１０に出力され、メモリ２１０からは、「１１１２Ｈ」に格納されたデータ「１１３３Ｈ」が読み出される。
【０１７０】
その後、第２のパルスＣＬＫ２は、タイミングＴ２３で立ち上がり、タイミングＴ２４で立ち下がる。
【０１７１】
タイミングＴ２４における第２のパルスＣＬＫ２の立下りにより、メモリ２１０からリードデータＩＮＳ「１１３３Ｈ」が命令レジスタ２２６にフェッチされる。
【０１７２】
さらに、タイミングＴ２４において、第２の制御信号ＣＴＲ２も立ち下がり、入力ＩＮ３が立ち上がり、直に第３の制御信号ＣＴＲ３が立ち上がる。これにより、フェッチアドレスＡＤＲは「１１１４Ｈ」を示し、メモリ２１０からのリードデータＩＮＳは、「９９７７Ｈ」に変化する。
【０１７３】
その後、第３のパルスＣＬＫ３は、タイミングＴ２５で立ち上がり、タイミングＴ２６で立ち下がる。タイミングＴ２６における第３のパルスＣＬＫ３の立下りによりメモリ２１０からデータ「９９７７Ｈ」が命令レジスタ２２６にフェッチされ、命令レジスタ２２６は、「７７１１３３ａａＨ」に更新される。この時点（タイミングＴ２６）において、１命令分のコード（７７１１３３ａａＨ）が揃う。
【０１７４】
本実施の形態のマイクロコンピュータ２００は、本発明にかかる技術の原理を具現化したものであり、原理の説明時に述べた各々の効果を得ることができる。
【０１７５】
さらに、本実施の形態のマイクロコンピュータ２００では、フェッチ実行部３６０に対してデータバス幅Ｗを設定可能であるため、様々なバス幅Ｗの外部メモリにも対応でき、ユーザに外部メモリを柔軟に選択させることができる。
【０１７６】
以上、実施の形態をもとに本発明を説明した。実施の形態は例示であり、本発明の主旨から逸脱しない限り、上述した実施の形態に対してさまざまな変更、増減を行ってもよい。これらの変更、増減が行われた変形例も本発明の範囲にあることは当業者に理解されるところである。
【符号の説明】
【０１７７】
１  プロセッサ  ２  メインメモリ
３  演算実行ユニット  ４  フェッチユニット
５  レジスタ  ６  内部メモリ
２１  命令領域  ２２  オペランド領域
６１  命令領域  ６２  オペランド領域
１００  プロセッサ  １１０  ＣＰＵ
１２０  演算部  １３０  命令レジスタ
１４０  ＰＣ  １５０  フェッチ部
１９０  メモリ  ２００  マイクロコンピュータ
２１０  メモリ  ２２０  ＣＰＵ
２２２  演算部  ２２４  分配部
２２６  命令レジスタ  ２２８  ＰＣ
２３０  命令長生成部  ２５０  フェッチ部
３００  非同期制御回路  ３０２  インバータ
３０４  制御回路  ３１０  ＤＭＵＸ
３１２  制御回路  ３２０  ＤＭＵＸ
３２２  制御回路  ３２４  ＯＲ回路
３３０  ＤＭＵＸ  ３３２  制御回路
３３４  ＯＲ回路  ３４０  ＯＲ回路
３５０  ＯＲ回路  ３６０  フェッチ実行部
４００  Ｑモジュール  ４０１  ＡＮＤ回路
４０２  遅延素子  ４０３  Ｃ素子
４０４  インバータ  ４０５  インバータ
４０６  ＡＮＤ回路  ４１０  ＡＮＤ回路
４１２  インバータ  ＣＬＫ０  格納パルス
ＣＬＫ１〜ＣＬＫ４  第１〜第４のパルス
ＣＴＲ２〜ＣＴＲ４  第２〜第４の制御信号
ＢＲ１〜ＢＲ３  第１〜第３の選択制御信号
Ｎ  フェッチ回数  ＡＤＲ  フェッチアドレス
ＡＴＲ  分配信号  ＫＧＨ  命令長ＬＧ
Ｗ  データバス幅
【図１】
2013077216.tif 000003
【図２】
2013077216.tif 000004
【図３】
2013077216.tif 000005
【図４】
2013077216.tif 000006
【図５】
2013077216.tif 000007
【図６】
2013077216.tif 000008
【図７】
2013077216.tif 000009
【図８】
2013077216.tif 000010
【図９】
2013077216.tif 000011
【図１０】
2013077216.tif 000012
【図１１】
2013077216.tif 000013
【図１２】
2013077216.tif 000014