(57)【特許請求の範囲】
【請求項１】
複数のプログラムカウンタと複数のループカウンタとを備えたループ制御装置であって、
前記複数のプログラムカウンタから選択した１つのプログラムカウンタの値を命令メモリのアドレスとして出力する選択手段と、
前記命令メモリが前記選択手段により出力されたアドレスに格納している命令を命令実行手段へ出力する命令出力手段と、
前記命令出力手段の出力する命令がループ命令の場合に、当該ループ命令に従って実行されるループ処理のエンドアドレスと、当該ループ処理を実行するプログラムカウンタを示す第１の識別子と、当該ループ処理のループ回数に関する情報を保持するループカウンタを示す第２の識別子と、を対応付けて保持するループ情報を複数格納可能なスタックと、
前記命令出力手段がループ命令を出力する際に当該ループ命令に関するループ情報を前記スタックに格納し、前記選択手段が新しくプログラムカウンタを選択した場合に、当該プログラムカウンタを示す第１の識別子を含むループ情報のうち前記スタックの先頭に最も近いループ情報を参照して、当該ループ情報の含むエンドアドレスと当該ループ情報の含む第２の識別子の示すループカウンタの値とに基づいて、前記選択手段が選択しているプログラムカウンタによって実行しているループ処理が終了するかを判定する制御手段とを備えることを特徴とするループ制御装置。
【請求項２】
前記選択手段に供給され、当該選択手段の選択するプログラムカウンタを示すプログラムカウンタ選択信号と前記プログラムカウンタを示す第１の識別子との一致を検出する第１の比較手段と、
前記選択手段が出力するプログラムカウンタの値と前記エンドアドレスとの一致を検出する第２の比較手段と、
前記スタックの保持する第２の識別子に基づき、前記複数のループカウンタの１つの値を選択する出力選択手段と、
前記出力選択手段の出力が所定値に一致するかを検出する第３の比較手段とを更に備え、
前記制御手段は、前記第１、第２、第３の比較手段の出力に応じて、前記ループカウンタの保持する値を制御することを特徴とする請求項１記載のループ制御装置。
【請求項３】
前記第２の識別子と対応する差分保持手段を更に有し、
前記制御手段は、前記第１の比較手段の出力が一致を示し、前記スタックの先頭に最も近いループ情報の有するエンドアドレスに対応する前記第２の比較手段の出力が一致を示している場合に、
前記ループ情報に対応する前記第３の比較手段の出力が一致を示していない場合は、前記選択手段が選択しているプログラムカウンタの値から、前記ループ情報に格納されている第２の識別子が示す差分保持手段の保持する値を減算し、当該第２の識別子が示すループカウンタの保持する値を１減算するように制御し、
前記ループ情報に対応する前記第３の比較手段の出力が一致を示している場合は、前記ループ情報を無効化すると共に、当該ループ情報に格納されている第２の識別子が示すループカウンタの保持する値を１減算或いは０にするように制御することを特徴とする請求項２記載のループ制御装置。
【請求項４】
前記第２の識別子と対応する差分保持手段を更に有し、
前記制御手段は、前記第１の比較手段の出力が一致を示し、前記スタックの先頭に最も近いループ情報を含む２つ以上の前記ループ情報に対応する前記第２の比較手段の出力が一致を示している場合に、
前記２つ以上のループ情報に対応する前記第３の比較手段の出力の少なくとも１つが一致を示していない場合は、一致を示していないもののうち前記スタックの先頭に最も近いループ情報に格納されている前記第２の識別子が示す差分保持手段の保持する値を現在選択されているプログラムカウンタから減算し、前記ループ情報に格納されている前記第２の識別子が示すループカウンタの保持する値を１減算するように制御し、
前記２つ以上のループ情報に対応する前記第３の比較手段の出力の全てが一致を示している場合は、前記２つ以上のループ情報を全て無効化すると共に、前記２つ以上のループ情報に格納されている前記第２の識別子が示す２つ以上のループカウンタの保持する全ての値を１減算或いは０にするように制御することを特徴とする請求項２記載のループ制御装置。
【請求項５】
前記スタックの段数は前記ループカウンタの数と一致することを特徴とする請求項１乃至４のいずれか１項に記載のループ制御装置。
【請求項６】
複数のプログラムカウンタと、複数のループカウンタと、ループ命令に従って実行されるループ処理のエンドアドレスと当該ループ処理を実行するプログラムカウンタを示す第１の識別子と当該ループ処理のループ回数に関する情報を保持するループカウンタを示す第２の識別子とを対応付けて保持するループ情報を複数格納可能なスタックとを備えたループ制御装置の制御方法であって、
前記複数のプログラムカウンタから選択した１つのプログラムカウンタの値を命令メモリのアドレスとして出力する選択ステップと、
前記命令メモリが前記選択ステップにより出力されたアドレスに格納している命令を命令実行手段へ出力する命令出力ステップと、
前記命令出力ステップにおいてループ命令を出力する際に当該ループ命令に関するループ情報を前記スタックに格納し、前記選択ステップが新しくプログラムカウンタを選択する際に当該プログラムカウンタを示す第１の識別子を含むループ情報のうち前記スタックの先頭に最も近いループ情報を参照して、当該ループ情報が含むエンドアドレスと当該ループ情報が含む第２の識別子とに基づいて、前記選択ステップで選択しているプログラムカウンタによって実行しているループ処理の終了を判定する制御ステップとを備えることを特徴とする制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ループ機能を有するプログラムのシーケンス制御に関し、特に複数のプログラムカウンタが各々多重ループを使用するループ制御装置及びその制御方法に関する。
【背景技術】
【０００２】
従来、多重ループを処理するプログラムシーケンス制御を行うループ制御装置がある（例えば、特許文献１参照）。ループ制御装置においては、ループスタートアドレス、ループエンドアドレス、ループ回数等をスタック構造として格納し、スタックの先頭を参照することにより、上記制御を実現する手法が一般的に用いられている。
【特許文献１】特開平８―６３３５５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
しかしながら、従来のループ制御装置においては、そもそも、実行中の命令の命令メモリ上のアドレスを示すプログラムカウンタが複数ある場合の想定がなされていない。そのため、多重ループが複数のプログラムカウンタのそれぞれで実行されている場合、スタックの先頭は、複数のプログラムカウンタのうち何れか１つのプログラムカウンタの内周ループの情報を保持しているに過ぎず、全く用をなさない。スタック構造をプログラムカウンタの数だけ用意する方法が考えられるが、スタック構造が「プログラムカウンタ数×ループカウンタ数」の規模となり、必要以上に回路規模が増大してしまうという問題点がある。
【０００４】
本発明の目的は、簡易且つ小規模な回路構成により、複数のプログラムカウンタが並列的に多重ループを効率良く実行することを可能とし、特に複数のプログラムによる多重ループ処理を実行する場合でも少ないスタック構造で実行可能とすることで回路規模の増大を抑制可能としたループ制御装置及びその制御方法を提供することにある。
【課題を解決するための手段】
【０００５】
上述の目的を達成するために、本発明は、複数のプログラムカウンタと複数のループカウンタとを備えたループ制御装置であって、前記複数のプログラムカウンタから選択した１つのプログラムカウンタの値を命令メモリのアドレスとして出力する選択手段と、前記命令メモリが前記選択手段により出力されたアドレスに格納している命令を命令実行手段へ出力する命令出力手段と、前記命令出力手段の出力する命令がループ命令の場合に、当該ループ命令に従って実行されるループ処理のエンドアドレスと、当該ループ処理を実行するプログラムカウンタを示す第１の識別子と、当該ループ処理のループ回数に関する情報を保持するループカウンタを示す第２の識別子と、を対応付けて保持するループ情報を複数格納可能なスタックと、前記命令出力手段がループ命令を出力する際に当該ループ命令に関するループ情報を前記スタックに格納し、前記選択手段が新しくプログラムカウンタを選択した場合に、当該プログラムカウンタを示す第１の識別子を含むループ情報のうち前記スタックの先頭に最も近いループ情報を参照して、当該ループ情報の含むエンドアドレスと当該ループ情報の含む第２の識別子の示すループカウンタの値とに基づいて、前記選択手段が選択しているプログラムカウンタによって実行しているループ処理が終了するかを判定する制御手段とを備えることを特徴とする。
【発明の効果】
【０００６】
本発明によれば、複数のプログラムによる多重ループ処理を実行する場合でも少ないスタック構造で実行できるため回路規模の増大を抑制できる。
【発明を実施するための最良の形態】
【０００７】
以下、本発明の実施の形態を図面に基づき説明する。
【０００８】
［第１の実施の形態］
図１は、本発明の第１の実施の形態に係るループ制御装置の構成を示すブロック図である。
【０００９】
図１において、ループ制御装置は、プログラムカウンタ１−１、１−２、１−３、プログラムカウンタ選択部２、命令メモリ３、命令デコード部４、命令実行部５、ループ差分レジスタ６、ループカウンタ７、プログラムカウンタ選択信号生成部（以下選択信号生成部と略称）８、ループ情報スタック９、スタック制御部１０、プログラムカウンタ更新部１１、マルチプレクサ１２、加算器１３、第１の比較器群１４、第２の比較器群１５、マルチプレクサ群１６、第３の比較器群１７、減算器１８を備えている。尚、図１では全ての接続を図示しているわけではなく、説明に必要な代表的な接続のみを図示している。
【００１０】
プロラムカウンタ１−１、１−２、１−３は、実行中の命令の命令メモリ３上のアドレスを示すものであり、各々、例えば６ビットのフリップフロップから構成されている。プログラムカウンタ選択部２は、複数のプログラムカウンタ１−１、１−２、１−３のうち何れかのプログラムカウンタに格納された値を、プログラムカウンタ選択信号に基づいて命令メモリ３のアドレスとして選択し出力する。命令メモリ３は、データ転送命令を格納するメモリである。命令デコード部４は、命令メモリ３のデータ出力である命令を解読する。命令実行部５は、命令デコード部４で解読された命令を実行する。
【００１１】
ループ差分レジスタ６（後述のオフセットレジスタOFSTに相当）は、ループスタートアドレスとループエンドアドレスの差分を保持する。ループカウンタ７（後述のループレジスタLPに相当）は、命令のループ回数を保持する。ループ差分レジスタ６及びループカウンタ７は、各々３つずつ設けられており、命令実行部５により所定値が設定される。選択信号生成部８は、命令実行部５が生成する選択許可信号に基づき、命令実行毎にプログラムカウンタ選択部２に送出するプログラムカウンタ選択信号を生成する。
【００１２】
ループ情報スタック９は、ループ情報を格納する。即ち、ループ情報スタック９は、ループ実行中であることを示すフラグ（IN_USE(０),IN_USE(１),IN_USE(２)）と、ループ命令を実行したプログラムカウンタを示す識別子（即ちプログラムカウンタ選択信号の値）（PC_SEL(０),PC_SEL(１),PC_SEL(２)）と、ループ命令がどのループカウンタ及びループ差分レジスタを使用するかを示す識別子（LP_SEL(０),LP_SEL(１),LP_SEL(２)）と、ループ命令が実行された際のプログラムカウンタ値とループカウンタ及びループ差分レジスタを示す識別子によって示されるループ差分レジスタ６の値を加算した値（即ちループエンドアドレス）（LP_END(０),LP_END(１),LP_END(２)）を保持する。
【００１３】
スタック制御部１０は、ループ情報スタック９を制御するものであり、後述の制御を行う。プログラムカウンタ更新部１１は、プログラムカウンタ選択信号に基づきデータ転送命令実行毎に選択されたプログラムカウンタの値を１ずつ更新、または、スタック制御部１０が出力するループバック指示信号に基づきループの先頭アドレスに更新する。マルチプレクサ１２は、命令デコード部４がループ命令を解読した際に出力するループカウンタの識別子（LP_SEL）に基づいて、３つのループ差分レジスタ６の値のうち１つの値を選択する。加算器１３は、マルチプレクサ１２の出力とプログラムカウンタ選択部２の出力（Address）とを加算する。
【００１４】
第１の比較器群１４は、選択信号生成部８が出力するプログラムカウンタ選択信号（PC_SEL）と、ループ情報スタック９に格納されているループ命令を実行したプログラムカウンタを示す識別子（PC_SEL(０),PC_SEL(１),PC_SEL(２)）とが一致しているか否かを比較する。第２の比較器群１５は、プログラムカウンタ選択部２の出力（Address）と、ループ情報スタック９に格納されているループエンドアドレス（LP_END(０), LP_END (１), LP_END (２)）とが一致しているか否かを比較する。
【００１５】
マルチプレクサ群１６は、ループ情報スタック９に格納されている、ループ命令がどのループカウンタ及びループ差分レジスタを使用するかを示すループカウンタ識別子（LP_SEL(０),LP_SEL(１),LP_SEL(２)）に基づいて、３つのループカウンタ７の値のうち１つの値を選択する。第３の比較器群１７は、３つのマルチプレクサ群１６の各々の出力が１と一致しているか否かを比較する。減算器群１８は、スタック制御部１０が出力するループエンド検出信号に基づいて、３つのループカウンタ７の値のうち１乃至３つの値を１減算する。
【００１６】
ループ制御装置のスタック制御部１０における特徴的な制御をまとめると下記のようになる。
【００１７】
スタック制御部１０は、第１の比較器群１４の出力が一致を示し、ループ情報スタック９の先頭に最も近く且つループ実行中であることを示すフラグがセットされているエントリに対応する第２の比較器群１５の出力が一致を示している場合（換言すれば、第１の比較器群１４の出力match_pc(y)=“y”且つループ情報スタック９の出力in_use(y)= “1”であるようなyのうち、ループ情報スタック９の先頭に最も近いyに着目して、第２の比較器群１５の出力match_end (y)=“ y”である状態）に、第３の比較器群１７の出力に応じて以下の制御を行う。
【００１８】
即ち、スタック制御部１０は、上記エントリに対応する第３の比較器群１７の出力が一致を示していない場合は、上記エントリに格納されているループカウンタ及びループ差分レジスタを示す識別子によって示されるループ差分レジスタ６の保持する値を、現在選択されているプログラムカウンタの値から減算し、上記エントリに格納されているループカウンタ及びループ差分レジスタを示す識別子によって示されるループカウンタ７の保持する値を１減算するように制御する。
【００１９】
また、スタック制御部１０は、上記エントリに対応する第３の比較器群１７の出力が一致を示している場合は、ループ情報スタック９の上記エントリを無効化（IN_USE(0)をクリア）すると共に、上記エントリに格納されているループカウンタ及びループ差分レジスタを示す識別子によって示されるループカウンタ７の保持する値を１減算するか或いは０にクリアするように制御する。
【００２０】
更に、スタック制御部１０は、第１の比較器群１４の出力が一致を示し、ループ情報スタック９のループ実行中であることを示すフラグがセットされている２つ以上のエントリに対応する第２の比較器群１５の出力が一致を示している場合、第３の比較器群１７の出力に応じて以下の制御を行う。
【００２１】
即ち、スタック制御部１０は、上記２つ以上のエントリに対応する第３の比較器群１７の出力の少なくとも１つが一致を示していない場合は、一致を示していないもののうちループ情報スタック９の先頭に最も近いエントリに格納されているループカウンタ及びループ差分レジスタを示す識別子によって示されるループ差分レジスタ６の保持する値を、現在選択されているプログラムカウンタの値から減算し、上記エントリに格納されているループカウンタ及びループ差分レジスタを示す識別子によって示されるループカウンタ７の保持する値を１減算するように制御する。
【００２２】
また、スタック制御部１０は、上記２つ以上のエントリに対応する第３の比較器群１７の出力の全てが一致を示している場合は、ループ情報スタック９の上記２つ以上のエントリを全て無効化すると共に、上記２つ以上のエントリに格納されているループカウンタ及びループ差分レジスタを示す２つ以上の識別子によって示される２つ以上のループカウンタ７の保持する全ての値を１減算するか或いは０にクリアするように制御する。
【００２３】
次に、ループ制御装置を構成する上記各部のうち、命令メモリ３、プロラムカウンタ１−１、１−２、１−３、プログラムカウンタ選択部２、プログラムカウンタ更新部１１、選択信号生成部８の詳細構成を説明する。
【００２４】
図２は、命令メモリ３の詳細構成を示す図である。
【００２５】
図２において、命令メモリ３は、例えば２ポート(１Read/１Write)のSRAMから構成されており、データ幅は３２ビット、ワード長は６４である。命令メモリ３の読み出しアドレス(READ ADDRESS)は６ビットであり、読み出し許可信号(READ ENABLE)をアサートすると、３２ビットの読み出しデータがREAD DATAポートから読み出される。本実施の形態では、読み出しアドレスはプログラムカウンタ選択部２から供給され、読み出しデータは命令デコード部４に供給される。
【００２６】
命令メモリ３の書き込みアドレス(WRITE ADDRESS)は６ビットであり、書き込み許可信号(WRITE ENABLE)をアサートすると、３２ビットの書き込みデータ（WRITE DATA）信号上にドライブされている命令データが命令メモリ３の書き込みアドレスに書き込まれる。本実施の形態では、書き込みアドレス、書き込みデータ共に不図示の外部デバイスから供給される。
【００２７】
命令メモリ３に対する命令データの書き込みが終わるとリセットが解除され、ループ制御装置は動作を開始する。プログラムカウンタ１−１、１−２、１−３は、上述したように各々６ビットのフリップフロップから構成されており、リセット時の初期値は、各々、“００００００”, “０１００００”, “１０００００”となっている。即ち、プログラムカウンタ１−１は０x０番地からの命令を実行し、プログラムカウンタ１−２は０x１０番地からの命令を実行し、プログラムカウンタ１−３は０x２０番地からの命令を実行する。
【００２８】
図３は、プログラムカウンタ１−１、１−２、１−３、プログラムカウンタ選択部２、プログラムカウンタ更新部１１の詳細構成を示すブロック図である。
【００２９】
図３において、プログラムカウンタ更新部１１は、プログラムカウンタ１−１に対応したセレクタ１１−１、１１−２、＋１加算器１１−３と、プログラムカウンタ１−２に対応したセレクタ１１−４、１１−５、＋１加算器１１−６と、プログラムカウンタ１−３に対応したセレクタ１１−７、１１−８、＋１加算器１１−９とを備えている。
【００３０】
プログラムカウンタ１−１にはセレクタ１１−１の出力が入力される。セレクタ１１−１は、プログラムカウンタ１−１の現在の値、現在の値に１を加算した値、LOAD命令によりローディングされる値（store_d）、LOOP命令によりループバックする際のプログラムカウンタ１−１の戻り値（lp_back_pc）、JUMP命令によるジャンプ先アドレス(jump_pc)のうちの１つを選択して出力する。セレクタ１１−２は、プログラムカウンタ１−１の出力値、プログラムカウンタ１−１の出力値に１を加えた値(＋１加算器１１−３の出力値)のうちの何れかをプログラムカウンタ選択信号pc_selに基づいて選択する。即ち、当該クロックサイクルにおいてプログラムカウンタ１−１が選択されている場合は１を加えた値を選択し、プログラムカウンタ１−１が非選択の場合は現在の値を選択する。
【００３１】
プログラムカウンタ更新部１１におけるプログラムカウンタ１−２及び１−３に各々対応する部分においても、上記と同様の構成が採られており、プログラムカウンタ更新部１１によりプログラムカウンタ１−２及び１−３の値の更新がなされる。
【００３２】
プログラムカウンタ選択部２は、選択信号生成部８から出力される３ビットのプログラムカウンタ選択信号pc_sel[２:０]に応じて、プログラムカウンタ１−１(PC(０))、１−２(PC(１))、１−３(PC(２))の各出力のうちの１つを選択し、命令メモリ３の読み取りアドレスとして出力する。プログラムカウンタ選択信号pc_sel[２:０]は、one-hotの信号（（３ビット中１ビットが“１”となる信号））である。
【００３３】
プログラムカウンタ選択部２は、プログラムカウンタ選択信号pc_sel が“００１”のときプログラムカウンタ１−１を選択し、プログラムカウンタ選択信号pc_sel が“０１０”のときプログラムカウンタ１−２を選択し、プログラムカウンタ選択信号pc_sel が“１００”のときプログラムカウンタ１−３を選択する。即ち、プログラムカウンタ選択信号pc_sel[n]= “１”のときプログラムカウンタPC(n) を選択する（ただしn=０,１，２）。
【００３４】
図４は、選択信号生成部８の詳細構成を示すブロック図である。
【００３５】
図４において、選択信号生成部８は、フリップフロップ８−１、８−２、８−３、セレクタ８−４、８−５、８−６、デコーダ８−７を備えている。
【００３６】
フリップフロップ８−１、８−２、８−３は、各々、クロック信号線とリセット信号線に接続されており、出力がプログラムカウンタ選択信号となる。フリップフロップ８−１は、リセット信号により“１”がセットされ、D入力にはセレクタ８−４の出力が接続され、Q出力がプログラムカウンタ選択信号pc_sel[０]となる。フリップフロップ８−２は、リセット信号により“０”がセットされ、D入力にはセレクタ８−５の出力が接続され、Q出力がプログラムカウンタ選択信号pc_sel[１]となる。フリップフロップ８−３は、リセット信号により“０”がセットされ、D入力にはセレクタ８−６の出力が接続され、Q出力がプログラムカウンタ選択信号pc_sel[２]となる。
【００３７】
デコーダ８−７は、命令実行部５が出力するプログラムカウンタ選択許可信号pc_en[２:０]と、命令実行のストール指示を示すストール信号をデコードし、セレクタ８−４、８−５、８−６に対して選択制御信号sel-_cnt[０] 、sel-_cnt[１]、 sel-_cnt[２]を各々出力する。デコーダ８−７のデコード方式を図５に示す。
【００３８】
図５は、プログラムカウンタ選択許可信号のデコード方式と選択制御信号の関係を示す図である。
【００３９】
図５において、図示の表は、入力であるストールと、プログラムカウンタ選択許可信号pc_en[２:０]に対する出力である選択制御信号sel_cnt[２:０]の関係を示している。例えば、ストールが“１”の場合、選択制御信号sel_cntは全て２となり、選択信号生成部８の全フリップフロップは現在の値を保持する。即ち、プログラムカウンタ選択信号pc_selは更新されない。
【００４０】
ストールが“０”の場合でプログラムカウンタ選択許可信号pc_en=“１１１”の場合、選択制御信号sel_cntは全て０となり、プログラムカウンタ選択信号pc_selはシフトレジスタ動作する。即ち、プログラムカウンタ選択信号pc_selは“００１”→“０１０”→“１００”→“００１”と遷移し、プログラムカウンタはPC(０)→PC(１)→PC(２)→PC(０)の順に選択される。
【００４１】
ストールが“０”の場合でプログラムカウンタ選択許可信号pc_en=“０１１”の場合は、プログラムカウンタPC(２)が選択不許可となるように、選択制御信号sel_cnt=“３０１”となる。即ち、プログラムカウンタ選択信号pc_selは“００１”→“０１０”→“００１”→“０１０”→“００１”と遷移し、プログラムカウンタはPC(０)→PC(１)→PC(０)→PC(１)→PC(０)の順に選択される。
【００４２】
プログラムカウンタ選択部２によって選択されたプログラムカウンタに対応する命令は、命令メモリ３から読み出され、命令デコード部４に入力される。命令は３２ビットからなり、図６に示すように解読される。
【００４３】
図６は、命令の解読結果を示す図である。
【００４４】
図６において、３２ビットの命令をInst[３１:０]と表記すると、Inst[３１：３０]= “００”のときは特殊命令(Special Instruction)、Inst[３１：３０]= “０１”のときはロード命令(Load Instruction)、Inst[３１：３０]= “１０”のときはストア命令(Store Instruction)、Inst[３１：３０]= “１１”のときは無効命令とそれぞれ解読する。
【００４５】
ロード命令とは、不図示のメモリからループ制御装置の内部リソースへのデータ転送命令である。ストア命令とは、ループ制御装置の内部リソースからメモリへのデータ転送命令である。特殊命令には、NOP命令（なにもしない命令）、ループ命令（LOOP）、ジャンプ命令（JUMP）等の一般的なプロセッサに備わっている命令が含まれる。
【００４６】
Inst[２９:２７]は、データサイズを示すフィールドであり、詳細は図７に示されている。例えば“０００”の場合は１バイトの転送、“１００”の場合は５バイトの転送であることを示す。Inst[２６:２３]は、転送元リソースのインデックスを示すフィールド、Inst[２２:１９]は、転送先リソースのインデックスを示すフィールドであり、Inst[１８：１６]で示されるリソースの識別子（ロード命令の場合はデータ転送先、ストア命令の場合はデータ転送元を示す）と共にどの内部リソースの何番目のリソースを転送対象にするかを示す。
【００４７】
内部リソース識別子の詳細は図８に示されている。“０００”の場合は、PC即ちプログラムカウンタを示す。“００１”の場合は、AR即ちアドレスレジスタ（命令実行部５の内部リソースに相当）を示す。“０１０”の場合は、GPR即ち汎用レジスタ（命令実行部５の内部リソースに相当）を示す。“０１１”の場合は、OUT/IN即ちDMAポートを示す（OUT/INはロードかストアかにより識別される）。“１００”の場合は、LP即ちループレジスタ(図１のループカウンタ７に相当)を示す。“１０１”の場合は、OFST即ちオフセットレジスタ(図１のループ差分レジスタ６に相当)を示す。
【００４８】
ロード命令の場合のデータ転送元とストア命令の場合のデータ転送先を示す内部リソース識別子は、アドレスレジスタARに固定されており、インデックスのみをそれぞれのインデックスフィールドにより指定する。
【００４９】
Inst[１５:１３]は、データ転送元またはデータ転送先の有効バイトレーンを示すフィールドであり、データサイズフィールドと共に何バイトをどのバイトレーンに転送するか、またはどのバイトレーンから転送するかを示す。
【００５０】
図９及び図１０は、データサイズフィールド(size)とバイトレーンフィールド(pos_d/s)と有効バイトレーンの関係を示す図である。
【００５１】
図９及び図１０において、図示の表は、データサイズとバイトレーンの組み合わせにより有効となる有効バイトレーンを詳細に示している。データは６４ビットであり、バイトレーンは、[６３:５６]、[５５:４８]、[４７:４０]、[３９:３２]、[３１：２４]、[２１：１６]、[１５:８]、[７:０]の８レーンあり、有効バイトレーンに”v”を表記している。例えばデータサイズフィールド(size)が“０００”即ち１バイトで、バイトレーンフィールド(pos_d/s)が“０１１”即ち第４バイトレーンの場合、データ[３１：２４] （データバス信号）を使用して１バイトのデータが転送される。
【００５２】
本実施の形態における命令のより理解を深めるために、いくつかの命令の実例を示す。
【００５３】
Inst=“０１_０００_０００１_００１０_１００_００１_００００００００００００”の場合、ロード命令であり、アドレスレジスタAR(１)の示すメモリ上の１バイトデータを、ループレジスタLP(２)の[１５:８]にロードする。
【００５４】
Inst=“１０_１１１_０００１_００１０_０１１_０００_００００００００００００”の場合、ストア命令であり、DMA入力ポートIN(１)から読み込まれた８バイトデータを、アドレスレジスタAR(２)の示すメモリ上にストアする。
【００５５】
図１１は、特殊命令のエンコーディングを示す図である。
【００５６】
図１１において、EnableThreadは、特定のプログラムカウンタを有効にする命令であり、当該プログラムカウンタ以外の休眠中の他のプログラムカウンタを起動するときに使用できる。DisableThreadは、特定のプログラムカウンタを無効にする命令であり、当該プログラムカウンタ以外の実行中の他のプログラムカウンタを休眠状態にする場合や、プログラムの実行が終了した際に自分自身を休眠状態にする際に使用できる。JUMPは、ジャンプ命令であり、オペランドInst[２１：１２]を現在選択中のプログラムカウンタにコピーする。本実施の形態ではプログラムカウンタは６ビットであるので、実際はInst[１７：１２]がコピーされる。
【００５７】
LoadImmidiateByteは、即値を内部リソースにロードする命令であり、オペランドInst[７:０]で示される１バイトを、その他のオペランドにより特定される内部リソースにコピーする。ClearResigerは、内部リソースを０クリアする命令である。LoopInは、ループ突入命令であり、LoopIndicator（Inst[２２:１９]）で指定されるループレジスタLP(図１のループカウンタ７に相当)及びオフセットレジスタOFST(図１のループ差分レジスタ６に相当)の組み合わせによりループを実現する。
【００５８】
上記図１に戻り、命令実行部５は、命令デコード部４の命令解読結果に応じてデータ転送などを実行する。また、命令実行部５は、内部リソースとして、汎用レジスタGPRとアドレスレジスタARをそれぞれ４本ずつ備えている。更に、命令実行部５は、ダイレクトメモリアクセスデバイスとの間におけるデータ転送を行うためのDMAポート（IN(０)及びOUT(０)）と、メモリとの間におけるデータ転送を行うためのバスインタフェースを備えている（以上不図示）。
【００５９】
汎用レジスタGPRは、データを一時的に保持するレジスタであり、例えばメモリからロードしたデータを１バイト毎に別の内部リソースにコピーするときなどに用いる。アドレスレジスタARは、バスインタフェースに対して出力するアドレスを生成するレジスタである。尚、一般的なプロセッサと同様に、１データ転送毎にアドレスレジスタARの値を更新するモード(自動更新アドレッシングモード)を備える構成も好ましい。
【００６０】
更に、命令実行部５は、プログラムカウンタの実行抑制機能を備えており、上述したEnableThread命令、DisableThread命令の実行に応じて、選択信号生成部８の入力となるプログラムカウンタ選択許可信号を生成する。
【００６１】
次に、上記構成を有する本実施の形態のループ制御装置における各種制御について図１乃至図２１を参照しながら詳細に説明する。
【００６２】
最初に、ループ制御装置の最も重要な機能であるループ制御について説明する。
【００６３】
まず、簡単のために、１つのプログラムカウンタが１重のループを実行する例を挙げてループ命令の機能を説明する。ループレジスタLP（ループカウンタ７）は、命令のループ回数を示し、オフセットレジスタOFST（ループ差分レジスタ６）は、ループバックすべき命令のアドレスとループ命令のアドレスとの差分を示す。
【００６４】
命令実行部５により、ループレジスタLPとオフセットレジスタOFSTにそれぞれ所定値をロードし、ループ命令を実行することによりループ内に入る。プログラムカウンタが進行してプログラムカウンタの値がオフセットレジスタOFSTに格納された値分だけ進んだときに、プログラムカウンタの値をループ命令の次の命令を示すアドレスに更新する。即ち、プログラムカウンタの値から「オフセットレジスタOFSTの値−１」を減算すると共にループレジスタLPの値を１減算する。ループレジスタLPの値が１である場合は、ループレジスタLPをクリアすると共にループを脱出する。即ち、プログラムカウンタの値に単に１加算する。
【００６５】
非常に単純なループを用いたプログラム例を以下に示す。
命令アドレス    命令
０x００         AR(０)[７:０]に即値０x２０をロード
０x０１         LP(０)にAR(０)の示すメモリ上の値をロード(メモリの０x２０番地上の                データ=０x２０)
０x０２         OFST(０)に即値０x０１をロード
０x０３         LoopIn命令 （インディケータ０）
０x０４         DMAPort(０)から読み出したデータをAR(１)の示すメモリアドレスに
ストアしAR(１)++
０x０５         DisableThreadにより自分自身を休眠させる。
【００６６】
上記命令列によれば、０x０３番地のLoopIn命令の実行によりループに入り、０x０４番地のDMAPort(０)からメモリへのデータ転送において、プログラムカウンタの値がLoopIn命令のアドレス(０x０３番地)＋オフセットレジスタ(０x０１番地)と一致するため、ループバックする。更に、LoopIn命令の次アドレス即ち０x０４番地にジャンプすると共に、ループレジスタLP(０)の値を１減算する(LP(０)=３１)。この処理を、ループレジスタLP(０)が示すループ回数、即ち３２回繰り返してループを抜けて終了する。
【００６７】
次に、スタック制御部１０によるループ情報スタック９の制御手順を図２２のフローチャートを参照しながら説明する。本フローチャートに示す処理はスタック制御部１０が制御プログラムに基づき実行する。
【００６８】
まず、命令デコード部４がループ命令を検出すると（ステップＳ１）、スタック制御部１０によりループ情報スタック９の使用中フラグ（ループ実行中であることを示すフラグ）IN_USE(０)に“１”がプッシュされる。これと同時に、選択信号生成部８からプログラムカウンタ選択信号PC_SELがループ情報スタック９のPC_SEL(０)にプッシュされ、加算器１３の出力即ちループエンドアドレスがループ情報スタック９のLP_END(０)にプッシュされ、命令デコード部４が出力するLoopIndicator即ちLP_SEL信号がループ情報スタック９のLP_SEL(０)にプッシュされる。スタック制御部１０が内部的に保持するスタックポインタは０から１に更新される（ステップＳ２）。
【００６９】
プログラムカウンタの値が進んで、ループ命令に対応するループエンドアドレスに到達（一致）すると、第２の比較器群１５の出力match_end(０)が“１”となり、現在選択中のプログラムカウンタの識別子と、ループ情報スタック９に格納されている情報から現在ループ状態にあることが示されているプログラムカウンタの識別子とが同一であることから、第１の比較器群１４の出力match_pc(０)とループ情報スタック９の出力in_use(０)が共に“１”であるため、ループエンドが検出される（ステップＳ３）。このとき、第３の比較器群１７により、ループ情報スタック９のLP_SEL(０)に基づいてマルチプレクサ群１６で選択される出力が１と一致しているか否かが比較され、該出力が１である場合、lp_exp(０)信号が“１”となる。
【００７０】
lp_exp(０)信号が“１”の場合（ステップＳ４の判定が“１”）、ループ命令の満了（終了）を意味するので、スタック制御部１０は、減算器１８を操作してループレジスタLP(０)をデクリメント（即ち０にクリア）すると共に、ループ情報スタック９のIN_USE(０)をクリアし、内部的なスタックポインタを１から０に更新する（ステップＳ５）。
【００７１】
lp_exp(０)信号が“０”の場合（ステップＳ４の判定が“０”）、ループ命令の継続を意味するので、スタック制御部１０は、減算器１８を操作してループレジスタLP(０)をデクリメントすると共に、プログラムカウンタ更新部１１に対しloop_back信号をアサートする。プログラムカウンタ更新部１１は、上述したように、lp_back_pc即ちPC-OFST+１をPCにロードする（ステップＳ６）。これにより、プログラムカウンタはループ命令の次の命令を示すようになる。
【００７２】
次に、多重ループの動作を図２３及び図２４のフローチャートを参照しながら説明する。本フローチャートに示す処理はスタック制御部１０が制御プログラムに基づき実行する。
【００７３】
まず、命令デコード部４がループ命令０を検出すると（ステップＳ１１）、ループ情報スタック９のIN_USE(０)に“１”がプッシュされる。これと同時に、プログラムカウンタ選択信号PC_SELがループ情報スタック９のPC_SEL(０)にプッシュされ、加算器１３の出力即ちループエンドアドレスがループ情報スタック９のLP_END(０)にプッシュされ、命令デコード部４が出力するLoopIndicator即ちLP_SEL信号がループ情報スタック９のLP_SEL(０)にプッシュされる。スタック制御部１０が内部的に保持するスタックポインタは０から１に更新される（ステップＳ１２）。
【００７４】
プログラムカウンタの値が進み、命令デコード部４が更にループ命令１を検出すると（ステップＳ１３）、ループ情報スタック９のIN_USE(１)に“１”がプッシュされる。これと同時に、プログラムカウンタ選択信号PC_SELがループ情報スタック９のPC_SEL(１)にプッシュされ、加算器１３の出力即ちループエンドアドレスがループ情報スタック９のLP_END(１)にプッシュされ、命令デコード部４が出力するLoopIndicator即ちLP_SEL信号がループ情報スタック９のLP_SEL(１)にプッシュされる。スタック制御部１０が内部的に保持するスタックポインタは１から２に更新される（ステップＳ１４）。
【００７５】
更に、プログラムカウンタの値が進んで、ループ命令１に対応するループエンドアドレスに到達（一致）すると、第２の比較器群１５の出力match_end(１)が“１”となり、現在選択中のプログラムカウンタの識別子と、ループ情報スタック９に格納されている情報から現在ループ状態にあることが示されているプログラムカウンタの識別子とが同一であることから、第１の比較器群１４の出力match_pc(１)とループ情報スタック９の出力in_use(１)が共に“１”であるため、ループエンドが検出される（ステップＳ１５）。このとき、第３の比較器群１７により、ループ情報スタック９のLP_SEL(１)に基づいてマルチプレクサ群１６で選択される出力が１と一致しているか否かが比較され、該出力が１である場合、lp_exp(１)信号が“１”となる。
【００７６】
lp_exp(１)信号が“０”の場合（ステップＳ１６の判定が“０”）、ループ命令１の継続を意味するので、スタック制御部１０は、減算器１８を操作してループレジスタLP(１)をデクリメントすると共に、プログラムカウンタ更新部１１に対しloop_back信号をアサートする。プログラムカウンタ更新部１１は、上述したように、lp_back_pc即ちPC-OFST+１をPCにロードする（ステップＳ１８）。これにより、プログラムカウンタはループ命令１の次の命令を示すようになる。
【００７７】
lp_exp(１)信号が“１”の場合（ステップＳ１６の判定が“１”）、ループ命令１の満了を意味するので、スタック制御部１０は、減算器１８を操作してループレジスタLP(１)をデクリメント（即ち０にクリア）すると共に、ループ情報スタック９のIN_USE(１)をクリアし、内部的なスタックポインタを２から１に更新する（ステップＳ１７）。
【００７８】
ここで、第１の比較器群１４の出力match_pc(０)、第２の比較器群１５の出力match_end(０)、ループ情報スタック９の出力in_use(０)が全て“１”の場合、ループ命令０も同時にループエンドであることが分かる。この場合は、更に、lp_exp(０)の値により、ループ命令０が満了かどうかを判定する。
【００７９】
ループ命令０が満了の場合は（ステップＳ１９の判定が満了：lp_exp(０)=１）、スタック制御部１０は、減算器１８を操作してループレジスタLP(０)をデクリメント（即ち０にクリア）すると共に、ループ情報スタック９のIN_USE(０)をクリアし、内部的なスタックポインタを１から０に更新する（ステップＳ２０）。
【００８０】
ループ命令０が継続の場合は（ステップＳ１９の判定が継続：lp_exp(０)=０）、スタック制御部１０は、減算器１８を操作してループレジスタLP(０)をデクリメントすると共に、lp_back_pc即ちPC-OFST+１をPCにロードする（ステップＳ２１）。これにより、プログラムカウンタはループ命令０の次の命令を示すようになる。
【００８１】
次に、複数のプログラムカウンタと多重ループの動作を説明する。
【００８２】
プログラムカウンタPC(０)に対応する命令列を以下に示す。
命令アドレス    命令
０x００         PC(１)をイネーブル
０x０１         LP(０) に即値０x０２をロード
０x０２         OFST(０)に即値０x０５をロード
０x０３         LoopIn命令 （インディケータ０）
０x０４         LP(１) に即値０x０４をロード
０x０５         OFST(１)に即値０x０１をロード
０x０６         LoopIn命令 （インディケータ１）
０x０７         DMAPort(０)から読み出したデータをAR(０)の示すメモリアドレスに
ストアしAR(０)++
０x０８         AR(０)[７:０]に０x１００を加算
０x０９         PC(０)をディスエーブル
プログラムカウンタPC(１)に対応する命令列を以下に示す。
命令アドレス    命令
０x１０         AR(１)[１５:８]に即値０x１０をロード
０x１１         LP(２) に即値０x０２をロード
０x１２         OFST(２)に即値０x０５をロード
０x１３         LoopIn命令 （インディケータ２）
０x１４         DMAPort(１)から読み出したデータをAR(１)の示すメモリアドレスに
ストアしAR(１)++
プログラムカウンタPC(０)は２重ループを使用し、プログラムカウンタPC(１)は単純なループを使用する。プログラムカウンタPC(２)は使用されない。
【００８３】
図１２は、多重ループのプログラムを実行した場合のタイミングを示すタイミングチャートである。
【００８４】
図１２において、図示の例は、多重ループのプログラムを実行した場合のプログラムカウンタPC(０)、プログラムカウンタPC(１)、プログラムカウンタ選択許可信号pc_en、プログラムカウンタ選択信号pc_sel等の挙動を示している。
【００８５】
クロック信号のサイクル（以下サイクルと略称）０は、リセット状態であり、プログラムカウンタ選択許可信号pc_enは初期状態“００１”となり、これによりプログラムカウンタ選択信号pc_selは“００１”となる。
【００８６】
サイクル１では、リセット状態が解除され、プログラムカウンタ選択信号pc_selにより選択されたプログラムカウンタ(Selected PC)はPC(０)であるので、上記命令列に示したようにプログラムカウンタPC(１)をイネーブルとし、プログラムカウンタ選択許可信号pc_enは“０１１”となる。
【００８７】
その結果、サイクル２では、プログラムカウンタ選択信号pc_selは“０１０”となり、プログラムカウンタPC(１)が選択され、命令アドレス０x１０の命令（アドレスレジスタAR(１)[１５:８]に即値０x１０をロード）が実行される。以降、順次、プログラムカウンタPC(０)、プログラムカウンタPC(１)が交互に実行される。
【００８８】
サイクル７では、プログラムカウンタPC(０)=０x０３の示す最初のループ命令が実行される。サイクル７終了時のループ情報スタックの内容を図１３に示す。使用中フラグIN_USE(０)が“１”にセットされ、ループ命令を実行したプログラムカウンタ選択信号pc_sel=“００１”、LoopIndicator“００１”（LP(０)を示す）及びループ終了アドレス(PC(０)+OFST(０)=０x０８)がプッシュされる。
【００８９】
サイクル８では、プログラムカウンタPC(１)＝０x１３の示すループ命令が実行される。サイクル８終了時のループ情報スタック９の内容を図１４に示す。使用中フラグIN_USE(０)が“１”にセットされ、ループ命令を実行したプログラムカウンタ選択信号pc_sel=“０１０”、LoopIndicator“１００”（LP(２)を示す）及びループ終了アドレス(PC(１)+OFST(２)=０x１４)がプッシュされる。
【００９０】
サイクル１０では、ループ情報スタック９に格納されているプログラムカウンタ選択信号pc_sel(０)= “０１０”とループ終了アドレスlp_end(０)=０x１４が、現在のプログラムカウンタ選択信号pc_sel及びプログラムカウンタPCと一致するため、ループ終了判定が実行される。ループレジスタLP(２)の値は４であり１と一致しないためループバックと判定され、ループレジスタLP(２)は１減じられ、プログラムカウンタPC(１)はPC-OFST+１=０x１４-０x０１+１=０x１４となる。サイクル１０と全く同様の動作がサイクル１２及びサイクル１４において発生する。
【００９１】
サイクル１３では、プログラムカウンタPC(０)(=０x０６)の２重ループの内周ループに突入するためのループ命令が実行される。サイクル１３終了時のループ情報スタック９の内容を図１５に示す。使用中フラグIN_USE(０)が“１”にセットされ、ループ命令を実行したプログラムカウンタ選択信号pc_sel=“００１”、LoopIndicator“０１０”（LP(１)を示す）及びループ終了アドレス(PC(０)+OFST(１)=０x０７)がプッシュされる。
【００９２】
サイクル１４では、ループ情報スタック９に格納されているプログラムカウンタ選択信号pc_sel(０)= “０１０”とループ終了アドレスlp_end(０)=０x１４が、現在のプログラムカウンタ選択信号pc_sel及びプログラムカウンタPCと一致するため、ループ終了判定が実行される。この時点でループレジスタLP(２)の値は１となっており１と一致するため、ループ終了と判定され、ループレジスタLP(２)は１減じられ（０にクリアされ）、プログラムカウンタPC(１)はPC+１=０x１５となってループから抜ける。サイクル１４終了時のループ情報スタック９の内容を図１６に示す。ループ情報スタック９の項目(１)がポップされ、使用中フラグIN_USE(２)が“０”にクリアされる。
【００９３】
サイクル１８では、プログラムカウンタPC(１)＝０x１５の命令が実行され、プログラムカウンタPC(１)がディスエーブルとなり(プログラムカウンタ選択信号pc_en=“００１”となり)、サイクル１９以降はプログラムカウンタPC(０)の命令のみが実行される。
【００９４】
一方、サイクル１５、１７、１９、２０では、ループ情報スタック９の先頭に近いもの(図１６のスタック(０))が用いられて、プログラムカウンタPC(０)の内周ループのループ終了判定が実行される。サイクル１５、１７、１９では、ループバックとなり、サイクル２０において、ループ終了となる。サイクル２０終了時のループ情報スタックの内容を図１７に示す。ループ情報スタック９の項目(０)がポップされ、使用中フラグIN_USE(１)が“０”にクリアされる。
【００９５】
サイクル２１では、プログラムカウンタPC(０)の外周ループエンドとなり、外周ループのループ終了判定が実行される。ループレジスタLP(０)の値は２であるので、ループバックとなり、プログラムカウンタPC(０)=PC(０)-OFST(０)+１=０x０８-０x０５+１=０x０４がロードされ、サイクル２２において、０x０４に格納された命令が実行される。
【００９６】
以下、サイクル２４では、再び内周ループに突入し（ループ情報スタック９は図１６の状態になる）、サイクル２５、２６、２７、２８では、ループ終了判定が実行される。サイクル２５、２６、２７では、ループバックとなり、サイクル２８において、ループ終了となる。
【００９７】
サイクル２９では、プログラムカウンタPC(０)の外周ループがループ終了となり(LP(０)＝１)、ループ情報スタック９は図１８に示すように全ての使用中フラグがクリアされる。図１２のタイミングチャートには図示していないが、プログラムカウンタPC(０)は１加算されて０x０９となり、プログラムカウンタPC(０)をディスエーブル、即ちプログラムの実行を終了する。
【００９８】
以上説明したように、本実施の形態によれば、複数のプログラムカウンタ１−１、１−２、１−３が順次参照する命令を実行するプログラムのシーケンス制御において、ループ命令の実行時に、ループ命令に対応するプログラムカウンタを示す識別子（プログラムカウンタ選択信号）と、ループ命令に対応するループエンドアドレスと、ループ命令がどのループカウンタ及びループ差分レジスタを使用するかを示す識別子をループ情報スタック９にプッシュし、プログラムカウンタの値がループエンドアドレスと一致したときに、ループ情報スタック９の先頭からプログラムカウンタを示す識別子を参照することにより、ループ命令終了の有無を判定する。
【００９９】
即ち、プログラムカウンタ選択信号をプログラムカウンタ識別子としてループ情報スタック９の格納情報に加え、ループエンド時にループ終了判定をループ情報スタック９の先頭から実施することにより、複数のプログラムカウンタが並列的にイネーブルとなり、且つそれぞれが多重ループを実行する場合においても、ループバックであるかループ終了であるかの判定を簡易に行うことが可能となる。
【０１００】
これにより、スタック構造をプログラムカウンタの数だけ用意することが不要となり、非常に簡易且つ小規模な回路構成により、複数のプログラムカウンタが並列的に多重ループを効率良く実行することが可能となる。
【０１０１】
［第２の実施の形態］
本発明の第２の実施の形態は、上述した第１の実施の形態に対して、複数のループが同時に満了した場合にどのように処理するかという点において相違する。本実施の形態のその他の要素は、上述した第１の実施の形態（図１〜図４）の対応するものと同一なので、説明を省略する。
【０１０２】
本実施の形態では、プログラムカウンタPC(０)のプログラムを少し変更して以下のようなプログラムを実行する。
命令アドレス    命令
０x００         PC(１)をイネーブル
０x０１         LP(０) に即値０x０２をロード
０x０２         OFST(０)に即値０x０５をロード
０x０３         LoopIn命令 （インディケータ０）
０x０４         LP(１) に即値０x０４をロード
０x０５         OFST(１)に即値０x０１をロード
０x０６         AR(０)[７:０]に０x１００を加算
０x０７         LoopIn命令 （インディケータ１）
０x０８         DMAPort(０)から読み出したデータをAR(０)の示すメモリアドレスに
ストアしAR(０)++
０x０９         PC(０)をディスエーブル
プログラムカウンタPC(０)の内周ループは０x０７から開始し、プログラムカウンタPC(０)の内周ループ及び外周ループ共にループエンドアドレスが０x０８となっている。
【０１０３】
図１９は、変更後のプログラムを実行した場合のタイミングを示すタイミングチャートである。
【０１０４】
図１９において、図示の例は、変更後のプログラムを実行した場合のプログラムカウンタPC(０)、プログラムカウンタPC(１)、プログラムカウンタ選択許可信号pc_en、プログラムカウンタ選択信号pc_sel等の挙動を示している。
【０１０５】
サイクル１５では、全ループが使用中状態となり、ループ情報スタック９の内容は図２０に示すようになる。サイクル１６では、プログラムカウンタPC(１)のループが終了し、ループ情報スタック９の内容は図２１に示すようになる。
【０１０６】
サイクル２１では、プログラムカウンタPC(０)の内周ループ及び外周ループが共にループエンドとなる。ループ情報スタック９の先頭に近いものから評価し、スタック(０)はループレジスタLP(１)=１となっているためループ終了と判定され、スタック(１)はループレジスタLP(０)＝２となっているためループバックと判定される。この場合、ループ終了したものに対応するループ情報スタック９はポップし、プログラムカウンタPC(０)にはループバックに対応する値、即ちPC(１)−OFST(０)+１=０x０８-０x０５+１=０x０４がロードされる。
【０１０７】
サイクル２５では、再びプログラムカウンタPC(０)の内周ループ及び外周ループが共に使用中状態となり(ループ情報スタック９は図２１の状態となり)、サイクル２９において、内周ループ及び外周ループが共にループエンドとなる。サイクル２９では、ループレジスタLP(０)、ループレジスタLP(１)共に１となっているので、内周ループ及び外周ループ共にループ終了と判定され、ループ情報スタック９の使用中フラグは全てクリアされる。図１９のタイミングチャートには図示していないが、プログラムカウンタPC(０)は１加算されて０x０９となり、プログラムカウンタPC(０)をディスエーブル、即ちプログラムの実行を終了する。
【０１０８】
以上説明したように、本実施の形態によれば、第１の実施の形態と同様に、スタック構造をプログラムカウンタの数だけ用意することが不要となり、非常に簡易且つ小規模な回路構成により、複数のプログラムカウンタが並列的に多重ループを効率良く実行することが可能となる。
【０１０９】
［他の実施の形態］
上記第１及び第２の実施の形態では、ループ制御装置について説明したが、本発明のループ制御装置を、ダイレクトメモリアクセス（ＤＭＡ）制御装置に適用することが可能である。また、本発明のループ制御装置を、各種の画像処理装置（プリンタ、複写機、複合機、ファクシミリ等）に適用することが可能である。
【０１１０】
本発明は、上述した実施の形態の機能を実現するソフトウェアのプログラム（図２２〜図２４のフローチャート）をコンピュータ又はＣＰＵに供給し、そのコンピュータ又はＣＰＵが該供給されたプログラムを読出して実行することによって、達成することができる。
【０１１１】
この場合、上記プログラムは、該プログラムを記録した記憶媒体から直接供給されるか、又はインターネット、商用ネットワーク、若しくはローカルエリアネットワーク等に接続される不図示の他のコンピュータやデータベース等からダウンロードすることにより供給される。
【０１１２】
上記プログラムの形態は、オブジェクトコード、インタプリタにより実行されるプログラムコード、ＯＳ（オペレーティングシステム）に供給されるスクリプトデータ等の形態から成ってもよい。
【０１１３】
また、本発明は、上述した実施の形態の機能を実現するソフトウェアのプログラムを記憶した記憶媒体をコンピュータ又はＣＰＵに供給し、そのコンピュータ又はＣＰＵが記憶媒体に記憶されたプログラムを読出して実行することによっても、達成することができる。
【０１１４】
この場合、格納媒体から読出されたプログラムコード自体が上述した各実施の形態の機能を実現すると共に、そのプログラムコードを記憶した記憶媒体は本発明を構成する。
【０１１５】
プログラムコードを記憶する記憶媒体としては、例えば、ＲＯＭ、ＲＡＭ、ＮＶ−ＲＡＭ、フロッピー（登録商標）ディスク、ハードディスク、光ディスク（登録商標）、光磁気ディスク、ＣＤ−ＲＯＭ、ＭＯ、ＣＤ−Ｒ、ＣＤ−ＲＷ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＤＶＤ−ＲＷ、ＤＶＤ＋ＲＷ、磁気テープ、不揮発性のメモリカード等がある。
【０１１６】
上述した実施の形態の機能は、コンピュータから読出されたプログラムコードを実行することによるばかりでなく、コンピュータ上で稼動するＯＳ等がプログラムコードの指示に基づいて実際の処理の一部又は全部を行うことによっても実現することができる。
【図面の簡単な説明】
【０１１７】
【図１】本発明の第１の実施の形態に係るループ制御装置の構成を示すブロック図である。
【図２】命令メモリの詳細構成を示す図である。
【図３】プログラムカウンタ、プログラムカウンタ選択部、プログラムカウンタ更新部の詳細構成を示すブロック図である。
【図４】選択信号生成部の詳細構成を示すブロック図である。
【図５】プログラムカウンタ選択許可信号のデコード方式と選択制御信号の関係を示す図である。
【図６】命令の解読結果を示す図である。
【図７】データサイズフィールドの意味を示す図である。
【図８】内部リソース識別子の意味を示す図である。
【図９】データサイズフィールドとバイトレーンフィールドと有効バイトレーンの関係を示す図である。
【図１０】図９の続きである。
【図１１】特殊命令のエンコーディングを示す図である。
【図１２】多重ループのプログラムを実行した場合のタイミングを示すタイミングチャートである。
【図１３】図１２におけるサイクル７終了時のループ情報スタックの内容を示す図である。
【図１４】図１２におけるサイクル８終了時のループ情報スタックの内容を示す図である。
【図１５】図１２におけるサイクル１３終了時のループ情報スタックの内容を示す図である。
【図１６】図１２におけるサイクル１４終了時のループ情報スタックの内容を示す図である。
【図１７】図１２におけるサイクル２０終了時のループ情報スタックの内容を示す図である。
【図１８】図１２におけるサイクル２９終了時のループ情報スタックの内容を示す図である。
【図１９】本発明の第２の実施の形態に係る変更後のプログラムを実行した場合のタイミングを示すタイミングチャートである。
【図２０】図１９におけるサイクル１５終了時のループ情報スタックの内容を示す図である。
【図２１】図１９におけるサイクル１６終了時のループ情報スタックの内容を示す図である。
【図２２】ループ情報スタックの制御手順を示すフローチャートである。
【図２３】多重ループの動作を示すフローチャートである。
【図２４】図２３の続きである。
【符号の説明】
【０１１８】
１−１、１−２、１−３  プログラムカウンタ
２  プログラムカウンタ選択部（選択手段に対応）
３  命令メモリ
４  命令デコード部
５  命令実行部
６  ループ差分レジスタ（差分保持手段に対応）
７  ループカウンタ（ループ回数保持手段に対応）
８  選択信号生成部
９  ループ情報スタック（スタックに対応）
１０  スタック制御部（制御手段に対応）
１１  プログラムカウンタ更新部
１４  第１の比較器群（第１の比較手段に対応）
１５  第２の比較器群（第２の比較手段に対応）
１６  マルチプレクサ群（出力選択手段に対応）
１７  第３の比較器群（第３の比較手段に対応）
【図１】
0004673007.tif 000002
【図２】
0004673007.tif 000003
【図３】
0004673007.tif 000004
【図４】
0004673007.tif 000005
【図５】
0004673007.tif 000006
【図６】
0004673007.tif 000007
【図７】
0004673007.tif 000008
【図８】
0004673007.tif 000009
【図９】
0004673007.tif 000010
【図１０】
0004673007.tif 000011
【図１１】
0004673007.tif 000012
【図１２】
0004673007.tif 000013
【図１３】
0004673007.tif 000014
【図１４】
0004673007.tif 000015
【図１５】
0004673007.tif 000016
【図１６】
0004673007.tif 000017
【図１７】
0004673007.tif 000018
【図１８】
0004673007.tif 000019
【図１９】
0004673007.tif 000020
【図２０】
0004673007.tif 000021
【図２１】
0004673007.tif 000022
【図２２】
0004673007.tif 000023
【図２３】
0004673007.tif 000024
【図２４】
0004673007.tif 000025