(57)【要約】【課題】  高機能かつ高性能のダイレクトメモリアクセス転送を、回路規模を増大することなく実現する。【解決手段】  メモリバスに接続されたメモリ２と、メモリ２との間でデータ転送可能な複数のダイレクトメモリアクセスデバイス１０１、１０２と、に接続されるダイレクトメモリアクセス装置であって、複数のプログラムカウンタ３０１〜３０３と、複数のプログラムカウンタから１つを選択するプログラムカウンタ選択部４と、命令を格納し、選択されたプログラムカウンタが示すアドレスから命令を出力する命令メモリ５と、命令メモリ５から出力された命令に応じて、ダイレクトメモリアクセスデバイスとメモリ間のデータ転送を実行するデータ転送実行部７と、命令メモリ５から出力された命令の内容に対応した転送要求がダイレクトメモリアクセスデバイスから出力されていない場合、データ転送実行部７のデータ転送を抑制する転送抑制部８０４と、を備える。【選択図】  図１
2006119824.tif 000002
【特許請求の範囲】
【請求項１】
メモリバスに接続されたメモリと、
前記メモリとの間でデータ転送可能な複数のダイレクトメモリアクセスデバイスと、
に接続されるダイレクトメモリアクセス装置であって、
複数のプログラムカウンタと、
前記複数のプログラムカウンタから１つのプログラムカウンタを選択するプログラムカウンタ選択部と、
命令を格納し、前記プログラムカウンタ選択部で選択されたプログラムカウンタが示すアドレスから命令を出力する命令メモリと、
前記命令メモリから出力された命令に応じて、前記ダイレクトメモリアクセスデバイスと前記メモリ間のデータ転送を実行するデータ転送実行部と、
前記命令メモリから出力された命令の内容に対応した転送要求がダイレクトメモリアクセスデバイスから出力されていない場合、前記データ転送実行部のデータ転送を抑制する転送抑制部と、
を備えることを特徴とするダイレクトメモリアクセス装置。
【請求項２】
前記命令メモリから出力された命令の内容に対応した転送要求がダイレクトメモリアクセスデバイスから出力されている場合には、前記プログラムカウンタ選択部による、出力された命令に対応するプログラムカウンタの選択を許可し、前記命令メモリから出力された命令の内容に対応した転送要求がダイレクトメモリアクセスデバイスから出力されていない場合には、出力された命令の内容に対応した転送要求が出力されるまで、前記プログラムカウンタ選択部による、該命令を出力するプログラムカウンタの選択を不許可にする選択許可部を更に備えることを特徴とする請求項１に記載のダイレクトメモリアクセス装置。
【請求項３】
前記命令メモリから出力された命令が、プログラムカウンタを指定した中断命令である場合には、前記プログラムカウンタ選択部による、指定されたプログラムカウンタの選択を不許可にし、前記命令メモリから出力された命令が、プログラムカウンタを指定した再開命令である場合には、前記プログラムカウンタ選択部による、指定されたプログラムカウンタの選択を許可にする第２の選択許可部を更に備えることを特徴とする請求項１または２に記載のダイレクトメモリアクセス装置。
【請求項４】
データ転送の実行毎にプログラムカウンタの値を更新するプログラムカウンタ更新部を更に備えることを特徴とする請求項１乃至３の何れかに記載のダイレクトメモリアクセス装置。
【請求項５】
プログラムカウンタを指定した再開命令が、そのプログラムカウンタを指定した中断命令に先立って実行された場合、該中断命令の効果を無効にすることを特徴とする請求項３に記載のダイレクトメモリアクセス装置。
【請求項６】
前記複数のプログラムカウンタは前記命令メモリのそれぞれ異なる複数の領域のアドレスを示し、当該複数の領域にはそれぞれ独立なプログラムが格納されていることを特徴とする請求項１に記載のダイレクトメモリアクセス装置。
【請求項７】
メモリバスに接続されたメモリと、
前記メモリとの間でデータ転送可能な複数のダイレクトメモリアクセスデバイスと、
に接続される、複数のプログラムカウンタと命令メモリとを備えたダイレクトメモリアクセス装置の制御方法であって、
前記複数のプログラムカウンタから１つのプログラムカウンタを選択するプログラムカウンタ選択工程と、
前記命令メモリにおいて、前記プログラムカウンタ選択部で選択されたプログラムカウンタが示すアドレスから命令を出力する出力工程と、
前記命令メモリから出力された命令の内容に対応した転送要求がダイレクトメモリアクセスデバイスから出力されたか否か判定する判定工程と、
前記命令メモリから出力された命令の内容に対応した転送要求がダイレクトメモリアクセスデバイスから出力されていない場合、前記データ転送を抑制する転送抑制工程と、
前記命令メモリから出力された命令の内容に対応した転送要求がダイレクトメモリアクセスデバイスから出力された場合、前記ダイレクトメモリアクセスデバイスと前記メモリ間のデータ転送を実行するデータ転送実行工程と、
を備えることを特徴とするダイレクトメモリアクセス装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はダイレクトメモリアクセス装置及びその制御方法に関するものである。
【背景技術】
【０００２】
従来より、データを生成しメモリに書き込むデバイス、または、メモリからデータを読み出しデータ処理を行うデバイスと、メモリ間のデータ転送を、ＣＰＵに負荷をかけることなく実現するために、様々なダイレクトメモリアクセス装置が提案されている。代表的なダイレクトメモリアクセス装置においては、転送先または転送元のメモリアドレス、転送方向（デバイスからメモリ、メモリからデバイス）、転送するデータのサイズ等を予めＣＰＵにより設定し起動をかけると、設定されたメモリアドレスを順次更新しながら設定されたサイズのデータを転送し終わるまでＣＰＵの介在なしにデバイスとメモリ間のデータ転送を行う。データ転送が完了すると、ダイレクトメモリアクセス装置はＣＰＵに割り込みを通知し、ＣＰＵはデータ転送完了を知り、転送されたデータの処理を行う。さらに、引き続き別のデータ転送を設定し起動するなどする（特許文献１参照）。
【０００３】
このようなダイレクトメモリアクセス装置を用いてデバイスからメモリにデータ転送を行いつつ、転送されたメモリ上のデータをさらに別のデバイスに転送してデータ処理を行うことも多い。つまり、メモリを、２つのデバイスの処理速度緩衝バッファとして用いたり、２つのデバイスのデータアクセス順が異なる場合の一時バッファとして用いたりする。例えば、撮像素子により取り込まれた画像を圧縮符号化する処理において、撮像素子により取り込まれた画像データをダイレクトメモリアクセス装置によりラスタ順にメモリに転送しつつ、転送された矩形領域データを異なるダイレクトメモリアクセス装置により読み出して圧縮符号化する。この場合、撮像素子のデータ取り込み速度と圧縮符号化装置の処理速度が異なり、かつラスタ・ブロック変換が必要であるため、画像データは一時的にメモリに格納される。
【０００４】
本データ転送例において、ダイレクトメモリアクセス装置の設定手順は以下のようになる。撮像素子のデータ取り込み用のダイレクトメモリアクセス装置をＤＭＡ１、圧縮符号化データ転送用のダイレクトメモリアクセス装置をＤＭＡ２とする。全画面分の画像データを格納するためのメモリサイズは巨大であり価格も高いため、通常、画像の一部分のみが格納可能なサイズのメモリを用い、ダブルバッファ動作させることによって間断ないデータ転送を実現する。
【０００５】
ＣＰＵはまず、数ラスタ分の画像データを撮像素子からメモリ(バッファ１)に転送するための設定を、ＤＭＡ１に対して行い、起動をかける。ＤＭＡ１はデータ転送を完了すると、割り込みによりＣＰＵに通知する。ＣＰＵはバッファ１に格納された数ラスタ分のデータを圧縮符号化処理部に転送するための設定を、ＤＭＡ２に対して行い、起動をかけるとともに、次の数ラスタ分の画像データを撮像素子からメモリ(バッファ２)に転送するための設定を、ＤＭＡ１に対して行い、起動をかける。この例では、圧縮符号処理の方が撮像素子からのデータ転送よりも常に早いものとする。そうすると、ＤＭＡ２の完了割り込みは無視することができて、ＣＰＵはＤＭＡ１の完了割り込みを受信するたびに、ＤＭＡ１,ＤＭＡ２に対してバッファ１、バッファ２が交互に使用されるように設定を行い、起動をかければよい。
【特許文献１】特開平５−７３４７７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、従来のダイレクトメモリアクセス装置によるダブルバッファ操作は、ＤＭＡ完了毎にＣＰＵによる２つのダイレクトメモリアクセス装置の設定、起動が必要となるためＣＰＵの負荷が増大するという問題点があった。また、ＣＰＵの割り込みレイテンシによるオーバーヘッドのために、データ転送レートが低下するという問題もあった。さらに、ダブルバッファ動作の例においては、圧縮符号処理の方が撮像素子からのデータ転送よりも常に早いものと仮定したが、どちらの転送が早いのかが不確定である場合、ＣＰＵはＤＭＡ２の完了割り込みも処理する必要があり、どちらが早く終わったかによって処理を切り替える必要がある。この場合には、ＣＰＵの負荷はますます増大する。
【０００７】
ＣＰＵの負荷を軽減するために、それぞれのダイレクトメモリアクセス装置の転送データ量を監視して、データ転送を中断、再開するための専用ハードウエアを装備する方法も考えられるが、様々なアクセスパターンによる複雑なデータ転送を実行するためには、専用ハードウエアが複雑化し回路規模が増大してしまうという問題点があった。また、ハードウエア開発後に新たなアクセスパターンに対応する必要が生じた場合に、ハードウエアを作り直す必要があるという問題点があった。
【０００８】
本発明は上記従来例に鑑みてなされたもので、高機能かつ高性能のダイレクトメモリアクセス転送を、ＣＰＵに対する負荷を増大させることなく、かつ、回路規模を増大することなく実現することを目的とする。
【課題を解決するための手段】
【０００９】
以上の目的を達成するために、本発明によるダイレクトメモリアクセス装置においては、
メモリバスに接続されたメモリと、
前記メモリとの間でデータ転送可能な複数のダイレクトメモリアクセスデバイスと、
に接続されるダイレクトメモリアクセス装置であって、
複数のプログラムカウンタと、
前記複数のプログラムカウンタから１つのプログラムカウンタを選択するプログラムカウンタ選択部と、
命令を格納し、前記プログラムカウンタ選択部で選択されたプログラムカウンタが示すアドレスから命令を出力する命令メモリと、
前記命令メモリから出力された命令に応じて、前記ダイレクトメモリアクセスデバイスと前記メモリ間のデータ転送を実行するデータ転送実行部と、
前記命令メモリから出力された命令の内容に対応した転送要求がダイレクトメモリアクセスデバイスから出力されていない場合、前記データ転送実行部のデータ転送を抑制する転送抑制部と、
を備えることを特徴とする。
【００１０】
上記目的を達成するため、本発明に係る方法は、
メモリバスに接続されたメモリと、
前記メモリとの間でデータ転送可能な複数のダイレクトメモリアクセスデバイスと、
に接続される、複数のプログラムカウンタと命令メモリとを備えたダイレクトメモリアクセス装置の制御方法であって、
前記複数のプログラムカウンタから１つのプログラムカウンタを選択するプログラムカウンタ選択工程と、
前記命令メモリにおいて、前記プログラムカウンタ選択部で選択されたプログラムカウンタが示すアドレスから命令を出力する出力工程と、
前記命令メモリから出力された命令の内容に対応した転送要求がダイレクトメモリアクセスデバイスから出力されたか否か判定する判定工程と、
前記命令メモリから出力された命令の内容に対応した転送要求がダイレクトメモリアクセスデバイスから出力されていない場合、前記データ転送を抑制する転送抑制工程と、
前記命令メモリから出力された命令の内容に対応した転送要求がダイレクトメモリアクセスデバイスから出力された場合、前記ダイレクトメモリアクセスデバイスと前記メモリ間のデータ転送を実行するデータ転送実行工程と、
を備えることを特徴とする。
【発明の効果】
【００１１】
本発明のダイレクトメモリアクセス装置によれば、高機能かつ高性能のダイレクトメモリアクセス転送を、ＣＰＵに対する負荷を増大させることなく、かつ、回路規模を増大することなく実現可能である。特に、ダブルバッファ等を用いて複数のデータ転送を同期を取りながら実行する際に、ＣＰＵの関与を必要としないため、システム全体の性能が向上するという効果がある。
【発明を実施するための最良の形態】
【００１２】
以下に、図面を参照して、この発明の好適な実施の形態を例示的に詳しく説明する。ただし、この実施の形態に記載されている構成要素はあくまで例示であり、この発明の範囲をそれらのみに限定する趣旨のものではない。
【００１３】
（概要）
本実施形態に係るダイレクトメモリアクセス装置は、簡易な構成で、様々なアクセスパターンによる複雑な複数のデータ転送をコンカレントにかつ同期を取りながら実行するためのものである。
【００１４】
この目的のため、複数のプログラムカウンタを備え、プログラムカウンタが順次参照するデータ転送命令に従い、複数のＤＭＡ要求に対応するＤＭＡ転送が実行される。参照されるデータ転送命令列は予め所定のメモリに格納されている。
【００１５】
すなわち、１つのデータ転送実行部に対し、命令メモリを複数の領域に分け、複数の独立したプログラムを格納可能とし、それぞれの領域に対応する複数のプログラムカウンタを設けて、各プログラムの進行を独立に制御する。これにより、複数のデバイスからのデータ転送要求毎に異なるアクセスパターンをプログラム可能となっている。さらに、複数のプログラムカウンタをデータ転送毎に選択することで、複数のプログラムを時分割処理することができ、マルチタスクを可能としている。
【００１６】
また、あるプログラムカウンタの参照するデータ転送命令のソースまたはデスティネーションがＤＭＡのデータポートでありかつＤＭＡ要求が無い場合、このプログラムカウンタは休眠状態となり、他のプログラムカウンタの参照する命令が実行される。ＤＭＡデータポートのＤＭＡ要求イベントが発生すると、休眠状態のプログラムカウンタは実行状態に復帰する。
【００１７】
すなわち、ダイレクトメモリアクセスの対象となるデバイスからの転送要求信号を監視して、転送命令の可否を判断し、転送命令に対応する転送要求がデバイスから出力されていない場合には、データ転送を出口側（転送実行部）で抑制し、ノットレディーなデバイスに対するデータ転送を回避している。また、この場合更に、入口側（プログラムカウンタの選択）でも制限を加え、無駄な命令の実行を回避し全体としての処理速度の向上を図っている。
【００１８】
さらにデータ転送命令の他に、特定のプログラムカウンタを明示的に休眠させる命令と休眠中のプログラムカウンタを実行状態に復帰させる命令を備える。つまり、プログラムの中断、再開の命令を予めプログラム可能に用意しておき、そのような命令に応じて、プログラムカウンタの選択を制御する。
【００１９】
このようにすることで、命令メモリに対するプログラムの書き込み以外にＣＰＵの関与無しに、複数のデータ転送を同期を取りながら実行することを実現する。特に、ダブルバッファ等を用いて複数のデータ転送を同期を取りながら実行する際に、ＣＰＵの関与を必要としないため、システム全体の性能が向上するという効果がある。
【００２０】
（具体的構成）
図１は本発明の実施形態であるダイレクトメモリアクセス装置の電気的な構成を示すブロック図である。
【００２１】
ブロック間を結合する線の表記は、データ系の接続を幅を持つ矢印で図示し、制御系の接続を幅を持たない矢印で図示した。ただし、すべての接続が図示されているわけではなく、説明に必要な代表的な接続のみを図示した。
【００２２】
本装置には、データ転送要求を行う２個のＤＭＡ（ダイレクトメモリアクセス）デバイス１０１、１０２、ＣＰＵバスに接続され、データを格納し、データ転送元またはデータ転送先となるメモリ２と、実行中の命令の命令メモリ５上のアドレスを示す３個のプログラムカウンタ（図中はＰＣ）３０１、３０２、３０３と、選択信号に基づいて、複数のプログラムカウンタ３０１〜３０３のうちいずれかのプログラムカウンタに格納された値を、命令メモリ５のアドレスとして選択するプログラムカウンタ選択部４と、データ転送命令を格納する命令メモリ５と、命令メモリ５のデータ出力であるデータ転送命令を解読し転送方向、転送先・元等を判定する命令デコード部６とが含まれている。命令メモリ５は、プログラムカウンタ選択部４で選択されたプログラムカウンタが示すアドレスから命令を出力する。
【００２３】
また、解読された命令に従って２つのＤＭＡポート７０１、７０２またはバスＩＦ（インターフェース）７０３を駆動してデータ転送を実行するデータ転送実行部７を含む。更に、命令デコード部６の出力から転送元または先を検出する転送元／先検出部８０１、ＤＭＡデバイスからのデータ転送要求を検出するＤＭＡ要求検出部８０２、転送元／先検出部８０１で検出された転送元または先と、データ転送要求を出しているＤＭＡデバイスとが一致しているか否かを判定する一致判定部８０３、判定結果が不一致であればデータ転送実行部７のデータ転送を抑制する信号を出力する実行抑制信号生成部８０４、及び、判定結果が不一致ならば現在実行中の命令に対応するプログラムカウンタを非選択とするための第１選択許可信号を生成する第１選択許可信号生成部８０５とを含む信号生成部８を含む。
【００２４】
実行抑制信号生成部８０４は、命令メモリ５から出力された命令の内容に対応した転送要求がダイレクトメモリアクセスデバイス１０１、１０２から出力されていない場合、データ転送実行部７のデータ転送を抑制する転送抑制部として機能する。また、第１選択許可信号生成部８０５及び選択信号生成部１０は、命令メモリ５から出力された命令の内容に対応した転送要求がダイレクトメモリアクセスデバイス１０１、１０２から出力されている場合には、プログラムカウンタ選択部４による、出力された命令に対応するプログラムカウンタ３０１〜３０３の選択を許可し、命令メモリ５から出力された命令の内容に対応した転送要求がダイレクトメモリアクセスデバイス１０１、１０２から出力されていない場合には、出力された命令の内容に対応した転送要求が出力されるまで、プログラムカウンタ選択部４による、命令を出力するプログラムカウンタ３０１〜３０３の選択を不許可にする選択許可部として機能する。
【００２５】
また、命令デコード部６の出力がサスペンド命令かレジューム命令かを判定し、プログラムカウンタ３０１〜３０３を選択または非選択とするための第２選択許可信号を生成する第２選択信号生成部９と、第１および第２選択許可信号に基づきデータ転送実行毎にプログラムカウンタ選択部４に送出する選択信号を生成する選択信号生成部１０と、選択信号に基づきデータ転送実行毎に選択されたプログラムカウンタの値を１ずつ更新するプログラムカウンタ更新部１１と、図示しないデータポートを経由して命令メモリ５に命令を格納し、ダイレクトメモリアクセス装置の動作を制御するＣＰＵバスに接続されたＣＰＵ１２とを含む。
【００２６】
第２選択信号生成部９及び選択信号生成部１０は、命令メモリ５から出力された命令が、いずれかのプログラムカウンタ３０１〜３０３を指定した中断命令である場合には、プログラムカウンタ選択部４による、指定されたプログラムカウンタ３０１〜３０３の選択を不許可にし、前記命令メモリ５から出力された命令が、いずれかのプログラムカウンタ３０１〜３０３を指定した再開命令である場合には、プログラムカウンタ選択部４による、指定されたプログラムカウンタ３０１〜３０３の選択を許可にする第２の選択許可部として機能する。
【００２７】
ここで、本装置内のブロックのうち、まずＣＰＵ１２のリセットが解除され、ＣＰＵ１２は内蔵ＲＯＭから命令をフェッチし実行することにより、図示しないリセット信号を制御して順次各ブロックのリセットを解除することが可能である。ＣＰＵ１２以外のモジュールがすべてリセットの状態において、まずＣＰＵ１２は、命令メモリ５に対し、ダイレクトメモリアクセス装置が実行する命令を書き込む。
【００２８】
図２は、本実施の形態において使用する命令メモリ５の構成および入出力ポートを示す。命令メモリ５は２ポート(1Read/1Write)のＳＲＡＭであり、データ幅は３２ビット、ワード長は６４である。読み出しアドレス(READ ADDRESS)は６ビットであり、読み出し許可信号(READ ENABLE)をアサートすると３２ビットの読み出しデータがREAD DATAポートより読み出される。本実施の形態においては、読み出しアドレスはプログラムカウンタ選択部４から供給され、読み出しデータは命令デコード部６に供給される。書き込みアドレス(WRITE ADDRESS)は６ビットであり、書き込み許可信号(WRITE ENABLE)をアサートすると、３２ビットの書き込みデータ（WRITE DATA）信号上にドライブされているデータがＳＲＡＭの書き込みアドレスに書き込まれる。本実施の形態では、書き込みアドレス、書き込みデータともにＣＰＵ１２から供給される。
【００２９】
図１に戻り、命令メモリ５への命令データの書き込みが終わると、ＣＰＵ１２が順次各ブロックのリセットを解除し、これによりダイレクトメモリアクセス装置は動作を開始する。プログラムカウンタ３０１、３０２、３０３はおのおの６ビットのフリップフロップから構成されており、リセット時の初期値はおのおの"００００００","０１００００","１０００００"となっている。すなわちプログラムカウンタ３０１は０ｘ０番地からの命令を実行し、プログラムカウンタ３０２は０ｘ１０番地からの命令を実行し、プログラムカウンタ３０３は０ｘ２０番地からの命令を実行する。
【００３０】
プログラムカウンタ３０１,３０２,３０３、プログラムカウンタ選択部４およびプログラムカウンタ更新部１１の詳細ブロック図を図３に示す。プログラムカウンタ３０１にはセレクタ１１０１の出力が入力される。セレクタ１１０１は、プログラムカウンタの現在の値、現在の値に１を加算した値、ＬＯＡＤ命令によりローディングされる値（store_d）、ＬＯＯＰ命令によりループバックする際のプログラムカウンタの戻り値（lp_back_pc）、ＪＵＭＰ命令によるジャンプ先アドレス(jump_pc)のうちの１つを選択して出力する。セレクタ１１０２はプログラムカウンタの出力自身、プログラムカウンタの値に１を加えた値(＋１加算器１１０３の出力)のうちの何れかをプログラムカウンタ選択信号pc_selに基づいて選択する。すなわち、当該クロックサイクルにおいて当該プログラムカウンタが選択されている場合は１を加えた値を選択し、非選択の場合は現在の値を選択する。プログラムカウンタ３０２および３０３においても同様の構成が取られており、プログラムカウンタの更新がなされる。プログラムカウンタ選択部４は３ビットのプログラム選択信号pc_sel[２:０]に応じてプログラムカウンタ３０１(ＰＣ(０))、３０２(ＰＣ(１))、３０３(ＰＣ(２))の出力のうちの１つを選択し、命令メモリの読み取りアドレスとして出力する。pc_sel[２:０]はone-hotの信号であり、"００１"のときプログラムカウンタ３０１を選択し、"０１０"のときプログラムカウンタ３０２を選択し、"１００"のときプログラムカウンタ３０３を選択する。すなわち、pc_sel[ｎ]='１'のときＰＣ(ｎ)を選択する（ただしｎ=０,１,２）。
【００３１】
図４に選択信号生成部１０の詳細ブロック図を示す。フリップフロップ１００１、１００２、１００３は各々クロック信号とリセット信号に接続されており、出力がプログラムカウンタ選択信号となる。フリップフロップ１００１はリセットにより"１"がセットされ、Ｄ入力にはセレクタ１００４の出力が接続され、Ｑ出力がpc_sel[０]となる。フリップフロップ１００２はリセットにより"０"がセットされ、Ｄ入力にはセレクタ１００５の出力が接続され、Ｑ出力がpc_sel[１]となる。フリップフロップ１００３はリセットにより"０"がセットされ、Ｄ入力にはセレクタ１００６の出力が接続され、Ｑ出力がpc_sel[２]となる。
【００３２】
デコーダ１００７は第１選択許可信号生成部８０５の出力する第１選択許可信号pc_en１[２:０]と第２選択許可信号生成部９の出力する第２選択許可信号pc_en２[２:０]のゲート１００８、１００９、１０１０による論理積演算出力pc_en[２:０]と、命令実行のストール指示を示すストール信号とをデコードし、セレクタ１００４、１００５、１００６に対して選択信号を生成する。デコード方式を図５に示す。入力であるストール、論理積演算出力pc_en[２:０]に対する出力である選択信号sel_cnt[２:０]の関係を示す。例えば、ストールが"１"の場合、sel_cntは全て２となり、全フリップフロップは現在の値を保持する。すなわち、pc_selは更新されない。ストールが"０"でpc_en="１１１"の場合、sel_cntは全て０となり、pc_selはシフトレジスタ動作する。すなわち、"００１"→"０１０"→"１００"→"００１"と遷移し、ＰＣ(０)→ＰＣ(１)→ＰＣ(２)→ＰＣ(０)の順に選択される。ストールが"０"でpc_en="０１１"の場合は、ＰＣ(２)が選択不許可となるように、sel_cnt="３０１"となり、pc_selは"００１"→"０１０"→"００１"→"０１０"→"００１"と遷移し、ＰＣ(０)→ＰＣ(１)→ＰＣ(０)→ＰＣ(１)→ＰＣ(０)の順に選択される。
【００３３】
プログラムカウンタ選択部４によって選択されたプログラムカウンタに対応する命令は命令メモリ５から読み出され、命令デコード部６に入力される。命令は３２ビットからなり、図６に示すように解読される。
【００３４】
３２ビット命令をＩｎｓｔ[３１:０]と表記すると、Ｉｎｓｔ[３１:３０]="００"のとき特殊命令(Special Instruction)、"０１"のときロード命令(Load Instruction)、"１０"のときストア命令(Store Instruction)、"１１"は無効命令と解読する。ロード命令とは、メモリからダイレクトメモリアクセス装置の内部リソース（ＤＭＡポートを含む）へのデータ転送命令であり、ストア命令とは、内部リソースからメモリへのデータ転送命令である。特殊命令にはＮＯＰ命令（なにもしない命令）やループ命令（ＬＯＯＰ）、ジャンプ命令（ＪＵＭＰ）等の一般的なプロセッサに備わっている命令が含まれる。
【００３５】
Ｉｎｓｔ[２９:２７]はデータサイズを示すフィールドであり、詳細は図７に示されている。例えば"０００"の場合は１バイト、"１００"の場合は５バイトの転送であることを示す。
【００３６】
Ｉｎｓｔ[２６:２３]は転送元リソースのインデックスを示すフィールド、Ｉｎｓｔ[２２:１９]は転送先リソースのインデックスを示すフィールドであり、Ｉｎｓｔ[１８:１６]で示される内部リソースの識別子（ロード命令の場合は転送先、ストア命令の場合は転送元を示す）とともにどの内部リソースの何番目のリソースを転送対象にするかを示す。
【００３７】
内部リソース識別子の詳細は図８に示されている。"０００"の場合ＰＣすなわちプログラムカウンタを示し、"００１"の場合ＡＲすなわちアドレスレジスタを示し、"０１０"の場合ＧＰＲすなわち汎用レジスタを示し、"０１０"の場合ＩＮ/ＯＵＴすなわちＤＭＡポートを示し（ＩＮ/ＯＵＴはロードかストアかにより識別される）、"１００"の場合ＬＰすなわちループレジスタを示し、"１０１"の場合ＯＦＳＴすなわちオフセットレジスタを示す。
【００３８】
ロード命令の場合の転送元とストア命令の場合の転送先を示す内部リソース識別子はアドレスレジスタに固定されており、インデックスのみをそれぞれのインデックスフィールドにより指定する。
【００３９】
Ｉｎｓｔ[１５:１３]はデータ転送元または先の有効バイトレーンを示すフィールドであり、データサイズフィールドとともに何バイトをどのバイトレーンにまたはどのバイトレーンから転送するかを示す。図９Ａ、図９Ｂは、サイズとバイトレーンの組み合わせにより有効となるバイトレーンを詳細に示している。データは６４ビットであり、バイトレーンは[６３:５６]、[５５:４８]、[４７:４０]、[３９:３２]、[３１:２４]、[２３:１６]、[１５:８]、[７:０]の８レーンあり、有効レーンに"ｖ"が表記されている。例えばサイズフィールド(size)が"０００"すなわち１バイトで、バイトレーンフィールド(pos_d/ｓ)が"０１１"すなわち第４バイトレーンの場合、データ[３１:２４]に１バイトのデータが転送される。
【００４０】
より理解を深めるために、いくつかの命令の実例を示す。
【００４１】
Ｉｎｓｔ="01_000_0001_0010_100_001_000000000000"の場合、ロード命令であり、アドレスレジスタＡＲ(１)の示すメモリ上の１バイトデータを、ループレジスタＬＰ(２)の[１５:８]にロードする。
【００４２】
Ｉｎｓｔ="10_111_0001_0010_011_000_000000000000"の場合、ストア命令であり、ＤＭＡ入力ポートＩＮ(１)から読み込まれた８バイトデータを、アドレスレジスタＡＲ(２)の示すメモリ上にストアする。
【００４３】
図１０は特殊命令のエンコーディングを示す。
【００４４】
EnableThreadは特定のプログラムカウンタを有効にする命令であり、当該プログラムカウンタ以外休眠中の他のプログラムカウンタを起動するときに使用できる。
【００４５】
DisableThreadは特定のプログラムカウンタを無効にする命令であり、当該プログラムカウンタ以外の実行中の他のプログラムカウンタを休眠状態にする場合や、プログラムの実行が終了した際に自分自身を休眠状態にする際に使用できる。
【００４６】
SuspendThread、ResumeThread、WaitTrigger、EmitTriggerは、それぞれ、特定のプログラムカウンタをサスペンド(実行中断)状態にする命令、特定のプログラムカウンタをレジューム（実行再開）する命令、特定のトリガイベントを待って自プログラムカウンタをサスペンド(実行中断)状態にする命令、特定のトリガイベントを発生させる命令である。
【００４７】
ＪＵＭＰはジャンプ命令であり、オペランドＩｎｓｔ[２３:１２]を現在選択中のプログラムカウンタにコピーする。本実施の形態においてはプログラムカウンタは６ビットであるので、実際はＩｎｓｔ[１７:１２]がコピーされる。
【００４８】
LoadImmidiateByteは即値を内部リソースにロードする命令であり、オペランドＩｎｓｔ[７:０]で示される１バイトを、その他のオペランドにより特定される内部リソースにコピーする。
【００４９】
ClearResigerは内部リソースを０クリアする命令である。
【００５０】
LoopInはループ突入命令であり、LoopIndicator（Ｉｎｓｔ[２２:１９]）で指定されるループレジスタＬＰおよびオフセットレジスタＯＦＳＴの組み合わせによりループを実現する。
【００５１】
データ転送実行部７は命令デコード部６の命令解読結果に応じてデータ転送を実行する。また、内部リソースとして、図示しない汎用レジスタＧＰＲ、アドレスレジスタＡＲ、ループレジスタＬＰ、オフセットレジスタＯＦＳＴをそれぞれ４本ずつ備える。さらに、ダイレクトメモリアクセスデバイス１０１とのデータ転送のためにＤＭＡポート７０１（ＩＮ(０)およびＯＵＴ(０)）と、ダイレクトメモリアクセスデバイス１０２とのデータ転送のためにＤＭＡポート７０２（ＩＮ(１)およびＯＵＴ(１)）と、メモリ１とのデータ転送のためにバスインターフェース７０３を備える。
【００５２】
汎用レジスタは、データを一時的に保持するレジスタであり、例えばメモリからロードしたデータを１バイトごとに別の内部リソースにコピーするなどに用いる。
【００５３】
ここで、アドレスレジスタＡＲは、バスインターフェースに対して出力するアドレスを生成する。一般的なプロセッサと同様に１データ転送毎にアドレスレジスタＡＲの値を更新するモード(自動更新アドレッシングモード)を備える構成も好ましい。ループレジスタＬＰは、命令のループ回数を示し、オフセットレジスタＯＦＳＴはループバックすべき命令アドレスを示す。ループレジスタＬＰとオフセットレジスタＯＦＳＴに所定値をロードし、ループ命令を実行することによりループ内に入る。プログラムカウンタが進行してオフセットレジスタＯＦＳＴに格納された値と一致したときにプログラムカウンタの値をループ命令の次の命令を示すアドレスに更新するとともにループレジスタの値を１減じる。ループレジスタＬＰが０になった場合は、ループを脱出する、すなわちプログラムカウンタの値にただ１加える。非常に単純なループを用いたプログラム例を示す。
【００５４】
=============================================================================
命令アドレス  命令
０ｘ００  ＡＲ(０)[７:０]に即値０ｘ２０をロード
０ｘ０１  ＬＰ(０)にＡＲ(０)の示すメモリ上の値をロード(メモリの０ｘ２０番地上のデータ=０ｘ２０)
０ｘ０２  ＯＦＳＴ(０)に即値０ｘ０４をロード
０ｘ０３  LoopIn命令（インディケータ０）
０ｘ０４  ＤＭＡＰｏｒｔ(０)から読み出したデータをＡＲ(１)の示すメモリアドレスにストアしＡＲ(１)++
０ｘ０５  DisableThreadにより自分自身を休眠させる。
=============================================================================
上記命令列によれば、０ｘ０３番地の命令実行によりループに入り、０ｘ０４番地に記述されているように、ＤＭＡポートからメモリへデータを転送し、プログラムカウンタがオフセットレジスタと一致するためループバックしLoopIn命令の次アドレスすなわち０ｘ０４にジャンプする。これをＬＰ(０)の回数、すなわち３２回繰り返してループを抜けて終了する。
【００５５】
信号生成部８は、命令デコード部４による命令デコード結果と、ダイレクトメモリアクセスデバイス１０１，１０２のダイレクトメモリアクセス要求とプログラムカウンタ選択信号生成部１０からのプログラムカウンタ選択信号をもとに、データ転送実行部７への実行抑制信号とプログラムカウンタ選択信号生成部１０への第１選択許可信号を生成する。
【００５６】
図１１は信号生成部８の内部構成を示すブロック図である。６０１，６０２、６０３、６０４、６０５は命令デコード部６に含まれる比較器であるが、説明に好都合のため図１１に示した。比較器６０１は命令がロード命令であるかどうかを判定する。ロード命令である場合にはｌｏａｄ信号をアサートする。比較器６０２は命令がストア命令であるかどうかを判定する。ストア命令である場合にはｓｔｏｒｅ信号をアサートする。比較器６０３は転送元または転送先インデックスが０であるかどうかを判定する。インデックスが０である場合にはＰｏｒｔ０信号をアサートする。比較器６０４は転送元または転送先インデックスが１であるかどうかを判定する。インデックスが１である場合にはＰｏｒｔ１信号をアサートする。比較器６０５は転送元または転送先がＤＭＡポートであるかどうかを判定する。ＤＭＡポートである場合にはＤＭＡ信号をアサートする。
【００５７】
ゲート８１１、８１２、８１３、８１４は転送元・先検出部８０１を構成する。ゲート８１１にはｌｏａｄ,Ｐｏｒｔ０,ＤＭＡ信号が入力され、３入力のＡＮＤがLD_OUT0信号として出力される。LD_OUT0信号はＤＭＡポート０に対してデータをロードする命令が発行されていることを示す。ゲート８１２にはｌｏａｄ,Ｐｏｒｔ１,ＤＭＡ信号が入力され、３入力のＡＮＤがLD_OUT1信号として出力される。LD_OUT1信号はＤＭＡポート１に対してデータをロードする命令が発行されていることを示す。ゲート８１３にはｓｔｏｒｅ,Ｐｏｒｔ０,ＤＭＡ信号が入力され、３入力のＡＮＤがST_IN0信号として出力される。ST_IN0信号はＤＭＡポート０からデータを読み出してメモリにストアする命令が発行されていることを示す。ゲート８１４にはｓｔｏｒｅ,Ｐｏｒｔ１,ＤＭＡ信号が入力され、３入力のＡＮＤがST_IN1信号として出力される。ST_IN1信号はＤＭＡポート１からデータを読み出してメモリにストアする命令が発行されていることを示す。
【００５８】
ゲート８３１、８３２、８３３、８３４は発行された命令に対応するダイレクトメモリアクセス要求がアサートされているかどうかを検出する一致判定部８０３を構成する。ＤＭＡＯＲｅｑ０はダイレクトメモリアクセスデバイス１０１がメモリからのデータ転送を要求しているときに"１"にアサートされ、ＤＭＡＯＲｅｑ１はダイレクトメモリアクセスデバイス１０２がメモリからのデータ転送を要求しているときに"１"にアサートされ、ＤＭＡＩＲｅｑ０はダイレクトメモリアクセスデバイス１０１がメモリへのデータ転送を要求しているときに"１"にアサートされ、ＤＭＡＩＲｅｑ１はダイレクトメモリアクセスデバイス１０２がメモリへのデータ転送を要求しているときに"１"にアサートされる。ゲート８３１、８３２、８３３、８３４の出力は、発行された命令がアクセスしようとしているＤＭＡポートから、データ転送要求がない場合に、"０"レベルとなる。
【００５９】
ゲート８４１は、実行抑制信号生成部８０４を構成するゲートであり、ゲート８３１、８３２、８３３、８３４の出力のいずれか１つが"０"になると出力が"０"となる。従って、ゲート８４１の出力が実行抑制信号（抑制すべき時"０"レベル）となる。
【００６０】
ゲート８５１、８５２、８５３、８５４は、ダイレクトメモリアクセス命令を発行したプログラムカウンタのどれが、どのＤＭＡポートをアクセスしたときに実行抑制を受けたかを検出する。フリップフロップ８５５、８５６、８５７、８５８は実行抑制の検出結果を保持する。ゲート８２１、８２２、８２３、８２４は、実行抑制中のダイレクトメモリアクセス命令に対応するダイレクトメモリアクセス要求が発生したことを検出するＤＭＡ要求検出部８０２を構成する。実行抑制中のダイレクトメモリアクセス命令に対応するダイレクトメモリアクセス要求が発生したことを検出すると、フリップフロップ８５５、８５６、８５７、８５８はクリアされる。ゲート８５９１は実行抑制状態を生成し、ゲート８５９２は実行抑制解除状態を生成する。ゲート８５９３により、特定のプログラムカウンタの実行抑制状態が生成され、これを第１選択許可信号pc_en１[２:０]としてプログラム選択信号生成部１０へ出力する。すなわちpc_en１[ｎ]が"１"の場合、選択が許可され、"０"の場合、選択が不許可となる。
【００６１】
図１１においてはどのプログラムカウンタであるかを整数ｎで示している。ｎは０，１，２の何れかであるので、本実施の形態においてはゲート８２１、８２２、８２３、８２４、８５１、８５２、８５３、８５４、８５９１、８５９２、８５９３およびフリップフロップ８５５、８５６、８５７、８５８はプログラムカウンタの数すなわち３セット存在するが図示を省略している。
【００６２】
第２選択許可信号生成部９は、命令デコード部４による命令デコード結果とプログラムカウンタ選択信号生成部１０からのプログラムカウンタ選択信号をもとに、プログラムカウンタ選択信号生成部１０への第２選択許可信号を生成する。図１２は第２選択許可信号生成部９の内部構成を示すブロック図である。６０６，６０７、６０８、６０９、６１０は命令デコード部６に含まれる比較器であり、６１１、６１２、６１３、６１４は命令デコード部６に含まれるゲート（論理積）であるが、説明に好都合のため図１２に示した。比較器６０６は命令の最上位２ビットをデコードして、命令が特殊命令であるかどうかを判定する。特殊命令である場合にはspecial信号をアサートする。比較器６０７、６０８、６０９、６１０は命令の続く上位６ビットをデコードして、命令がサスペンド命令(SuspendThread)、レジューム命令（ResumeThread）、トリガ待ちサスペンド命令（WaitTrigger）,トリガ発生命令（EmitTrigger）であるかどうかを判定し、それぞれの出力信号をゲート６１１、６１２、６１３、６１４によりspecial信号と論理積をとることにより、それぞれＳＵＳＰ信号、ＲＥＳＵ信号、ＷＡＩＴ信号、ＥＭＩＴ信号を生成する。
【００６３】
命令のビット２３から８は、サスペンド命令またはレジューム命令の場合に、どのプログラムカウンタをサスペンドまたはレジュームさせるかを示す識別子であり、本実施の形態の場合は３個のプログラムカウンタを備えるので、ビット１０から８が有効となる。ビット８（Ｉｎｓｔ[８]）、ビット９（Ｉｎｓｔ[９]）、ビット１０（Ｉｎｓｔ[１０]）は、それぞれプログラムカウンタＰＣ(０)、ＰＣ(１)、ＰＣ（２）に対応する。
【００６４】
以下にサスペンド命令およびレジューム命令により選択許可信号を生成するロジックを解説する。
【００６５】
フリップフロップ９-１はＰＣ(０)の動作状態（実行状態か、サスペンド状態か）を保持しており、リセット時の初期値は'１'、すなわち実行状態を示す。サスペンド命令が実行され（ＳＵＳＰ='１'）、かつプログラムカウンタ識別子がＰＣ(０)を示している場合（Ｉｎｓｔ[８]='１'）、ゲート９-２の論理積出力が'１'となり、これがフリップフロップ９-１のクリア端子を駆動してフリップフロップ９-１の出力が'０'となる。すなわち、プログラムカウンタＰＣ(０)をサスペンド状態とする一要因を生成する。
【００６６】
一方、レジューム命令が実行され（ＲＥＳＵ='１'）、かつプログラムカウンタ識別子がＰＣ(０)を示している場合（Ｉｎｓｔ[８]='１'）、ゲート９０３の論理積出力が'１'となり、これがフリップフロップ９-１のセット端子を駆動してフリップフロップ９-１の出力が'１'となる。すなわち、プログラムカウンタＰＣ(０)を実行状態とする一要因を生成する。
【００６７】
同様に、フリップフロップ９０４はＳＵＳＰ信号およびＲＥＳＵ信号とＩｎｓｔ［９］の値に応じて、ゲート９０５、９０６によりセットまたはリセットされて、プログラムカウンタＰＣ(１)の実行状態を制御する。
【００６８】
全く同様に、フリップフロップ９０７はＳＵＳＰ信号およびＲＥＳＵ信号とＩｎｓｔ［１０］の値に応じて、ゲート９０８、９０９によりセットまたはリセットされて、プログラムカウンタＰＣ(２)の実行状態を制御する。
【００６９】
次に、トリガ待ちサスペンド命令およびトリガ発生命令により選択許可信号を生成するロジックを解説する。
【００７０】
フリップフロップ群９１０はトリガ発生命令によるトリガ発生の履歴を保持する８ビットのフリップフロップからなり、リセット時の初期値は"００００００００"である。トリガ発生命令が実行されると（ＥＭＩＴ＝'１'）、ゲート９１１により、すでにトリガを保持している場合はそのままの値を保ち、トリガを保持していない場合はトリガ識別子であるＩｎｓｔ[２３:１６]をロードする。
【００７１】
フリップフロップ９１２はＰＣ(０)の動作状態（実行状態か、サスペンド状態か）を保持しており、リセット時の初期値は'１'、すなわち実行状態を示す。トリガ待ちサスペンド命令が実行され（ＷＡＩＴ='１'）、プログラムカウンタ選択信号生成部１０からのプログラムカウンタ選択信号がＰＣ(０)を示している場合（pc_sel[０]='１'）、ゲート９１３の論理積出力が'１'となる。さらに、フリップフロップ群９１０の保持するトリガ履歴とトリガ待ちサスペンド命令の待ち受けトリガ識別子Ｉｎｓｔ[２３:１６]がゲート９１４および９１５により比較され、１ビットも共に'１'であるビットがない場合は（ゲート９１５の出力＝'０'）、トリガ待ちサスペンド命令実行以前にトリガが発行されていないと判定され、ゲート９１６によってフリップフロップ９１２のクリア信号が生成される。この結果、フリップフロップ９１２の出力が'０'となり、プログラムカウンタＰＣ(０)をサスペンド状態とする一要因を生成する。この時、フリップフロップ群９１７にはトリガ待ちサスペンド命令の待ち受けトリガ識別子Ｉｎｓｔ[２３:１６]がロードされる。なお、フリップフロップ群９１７のリセット時の初期値は"００００００００"である。ゲート９１４および９１５により比較された結果、１ビットでも共に'１'であるビットがある場合は、トリガ待ちサスペンド命令実行以前にトリガが発行されたと判定され、フリップフロップ９１２をクリアしない。すなわち、サスペンド状態には遷移しない（請求項２に対応）。
【００７２】
さて、トリガ発生命令が実行されると（ＥＭＩＴ＝'１'）、トリガ識別子であるＩｎｓｔ[２３:１６]と待ち受けトリガであるフリップフロップ群９１７の出力がゲート９１８および９１９により比較され、１ビットでも共に'１'のビットがあるならばゲート９２０の出力が'１'となる。この時、フリップフロップ９１２の出力が'０'すなわちプログラムカウンタＰＣ(０)がサスペンド状態にある場合、ゲート９２１によりフリップフロップ９１２がセットされ、プログラムカウンタＰＣ(０)を実行状態とする一要因を生成する。この時、同時に、フリップフロップ群９１０をクリアし、トリガ履歴をリセットする。
【００７３】
プログラムカウンタＰＣ（１）およびＰＣ（２）に関しても、ＰＣ(０)と全く同様に作用し、プログラムカウンタを実行状態とする一要因が生成される。ＰＣ(０)における９１０から９２１が、ＰＣ(１)における９２２から９３４にそれぞれ対応し、また、ＰＣ(２)における９３４から９４５にそれぞれ対応する。
【００７４】
フリップフロップ９０１、９０４、９０７によって生成される、各々のプログラムカウンタの実行状態を制御する信号と、それぞれフリップフロップ９１２、９２４、９３６によって生成される、各々のプログラムカウンタの実行状態を制御する信号との論理積がゲート９４７、９４８、９４９により生成され、第２選択許可信号pc_en２[２:０]を形成し、プログラム選択信号生成部１０へ出力される。
【００７５】
以上に説明した各ブロックの動作説明に基づいて、本実施の形態のダイレクトメモリアクセス装置の全体的な動作を説明する。
【００７６】
まず、サスペンド、レジューム操作を伴わない一般的なダイレクトメモリアクセス動作例を、図１３に示すタイミング図を用いて説明する。基本的にプログラムカウンタＰＣ(０)の示すプログラム(０ｘ０３番地および０ｘ０５番地の命令)がダイレクトメモリアクセスデバイス１０１のデータ転送を行い、プログラムカウンタＰＣ(１)の示すプログラム(０ｘ１２番地および０ｘ１６番地の命令)がダイレクトメモリアクセスデバイス１０２のデータ転送を行うように設定されている。
【００７７】
クロックサイクル０はｒｅｓｅｔ信号がアサート("１")されており、リセット状態である。リセット状態においては、プログラムカウンタ選択信号pc_selは"００１"を出力し、プログラムカウンタ選択許可信号pc_enは"１１１"を出力している。また、プログラムカウンタの初期値はＰＣ(０)＝０ｘ０、ＰＣ(１)＝０ｘ１０、ＰＣ(２)＝０ｘ２０である。クロックサイクル１においてリセットが解除され、まずプログラムカウンタＰＣ(０)が選択され（selected PC = ＰＣ(０)）、命令が実行される。クロックサイクル２ではpc_selが"０１０"となりＰＣ(１)が選択され、クロックサイクル３ではpc_selが"１００"となりＰＣ(２)が選択される。このように順次ＰＣ(０)→ＰＣ(１)→ＰＣ(２)→ＰＣ(０)が選択されて命令が実行される。クロックサイクル４ではダイレクトメモリアクセスデバイス１０２のデータ転送要求ＤＭＡＲｅｑ１がアサート("１")されるが、当該デバイスに対するデータ転送命令が実行されないため転送応答信号ＤＭＡＡｃｋ１はアサートされない。クロックサイクル６においてＰＣ(１)は０ｘ１２となり、このプログラムカウンタがダイレクトメモリアクセスデバイス１０２へのデータ転送命令を示している。実際に実行されるのは次にpc_selが"０１０"になるクロックサイクル８であり、このサイクルにおいてＤＭＡＡｃｋ１がアサートされる。
【００７８】
一方、クロックサイクル１０においてプログラムカウンタＰＣ(０)が示すダイレクトメモリアクセスデバイス１０１へのデータ転送命令が発行されるが、当該サイクルにおいてＤＭＡＲｅｑ０がアサートされていないため、プログラムカウンタＰＣ(０)の示す命令は実行を抑制される。すなわちpc_enの値は"１１０"となりＰＣ(０)は０ｘ０３を示したまま更新されない。ＤＭＡＲｅｑ０がアサートされるクロックサイクル１４までの間、プログラムカウンタＰＣ(１),ＰＣ(２)の示すプログラムが順に実行される。クロックサイクル１４においてＤＭＡＲｅｑ０がアサートされるとpc_enは"１１１"に更新され、クロックサイクル１５においてＰＣ(０)が選択され実行される。すなわち転送応答信号ＤＭＡＡｃｋ０がアサートされてデータ転送が完了する。
【００７９】
クロックサイクル１９においてはＰＣ(１)＝０ｘ１６の示すデータ転送命令が発行されるが、当該サイクルにおいてＤＭＡＲｅｑ１がアサートされていないためpc_enは"１０１"となりＰＣ(０),ＰＣ(２)の示す命令が順に実行される状態となる。ＰＣ(１)の実行が抑制されている間のクロックサイクル２１においてＰＣ(０)＝０ｘ０５の示すデータ転送命令が発行されるが、当該サイクルにおいてはＤＭＡＲｅｑ０がすでにアサート状態のため直ちに実行され、ＤＭＡＡｃｋ０がアサートされる。クロックサイクル２３においてＤＡＭＲｅｑ１がアサートされるとpc_enは"１１１"に復帰し、クロックサイクル２４においてデータ転送命令が実行されＤＭＡＡｃｋ１がアサートされる。
【００８０】
以上の説明により、容易に理解できることは、各ダイレクトメモリアクセスデバイスのデータ転送要求レートが２サイクルだった場合、２つのプログラムカウンタをイネーブルにしておけば、毎クロックサイクルデータ転送が可能である。すなわち、命令デコード部やデータ転送実行部の回路は共通しながらインターリーブ的にダイレクトメモリアクセスデバイスとのデータ転送を行えるため、回路規模を大きくすることなく効率のよいデータ転送を行うことが可能である。しかも、２つのダイレクトメモリアクセスのメモリアドレスの生成パターンを全く異なるものに設定することが可能であるため、非常に柔軟なデータ転送が可能である。例えば、一方のプログラムカウンタでｘ方向の画像データ参照を行い、もう一方のプログラムカウンタでｙ方向のデータ参照を行うようにすればデータ処理を行いながら回転操作を行うことも可能である。
【００８１】
次に、サスペンド、レジューム操作に着目した動作例を、図１４に示すタイミング図を用いて説明する。
【００８２】
サイクル０からサイクル７までの動作は、データ転送要求ＤＭＡＲｅｑ１がアサートされていない点を除いて図１３に示した動作と同等である。サイクル８において、プログラムカウンタＰＣ(１)の実行する命令はＰＣ(０)を対象としたサスペンド命令（ＳＵＳＰ０）である。この結果、サイクル９においてpc_enは"１１１"から"１１０"に遷移する。そして、サイクル１０において、pc_enが"１１１"であれば実行されるはずであったＰＣ(０)は実行されず、代わりにＰＣ(１)の命令が実行される。サイクル１２において、プログラムカウンタＰＣ(１)はＰＣ(０)をレジュームする命令（ＲＥＳＵ０）を実行する。この結果、サイクル１３においてpc_enは"１１０"から"１１１"に遷移し、サイクル１４においてサスペンドされていたＰＣ(０)の命令が実行される。
【００８３】
次に、サイクル１６においてプログラムカウンタＰＣ(２)はトリガ識別子１を待って自らをサスペンドする命令、すなわちトリガ待ちサスペンド命令（ＷＡＩＴ１）を実行する。この結果、サイクル１７においてpc_enは"１１１"から"０１１"に遷移する。そして、サイクル１９において、pc_enが"１１１"であれば実行されるはずであったＰＣ(２)は実行されず、代わりにＰＣ(０)の命令が実行される。このサイクル１９において実行されるＰＣ(０)の命令は、トリガ識別子１のトリガを発生するトリガ発生命令（ＥＭＩＴ１）である。この結果、サイクル２０においてpc_enは"０１１"から"１１１"に遷移する。そして、サイクル２１において、サスペンドされていたＰＣ(２)の命令が実行される。
【００８４】
さらに、サイクル２２においてＰＣ(０)の実行する命令は、トリガ識別子２のトリガを発生するトリガ発生命令（ＥＭＩＴ２）である。この時点でトリガ待ちサスペンド命令によってサスペンドしているプログラムカウンタは存在しないため、前記第２選択許可信号生成部９内のフリップフロップ群９１０、９２２，９３４に"０００００１００"がロードされる。サイクル２４において、プログラムカウンタＰＣ(２)はトリガ識別子２を待って自らをサスペンドする命令、すなわちトリガ待ちサスペンド命令（ＷＡＩＴ２）を実行するが、トリガ待ちサスペンド命令に先立って（サイクル２２）、同一トリガ識別子のトリガ発生命令が実行されているため、サイクル２４におけるトリガ待ちサスペンド命令（ＷＡＩＴ２）は無効化され、pc_enは"１１１"のまま変化しない。その結果、サイクル２７においてプログラムカウンタＰＣ（２）の命令は順番通りに実行される。
【００８５】
本説明から容易に理解されるように、１つのトリガ発生命令は、トリガ待ちサスペンド命令によってサスペンド状態にある２つ以上のプログラムカウンタをレジュームすることも可能である。
【００８６】
（具体例）
本実施の形態のダイレクトメモリアクセス装置の応用への適用例として、ＪＰＥＧエンコーダ装置のブロック図を図１５に示す。ダイレクトメモリアクセスデバイスの実際例としてＪＰＥＧエンコーダモジュール１３が適用されている。エンコーダモジュール１３の入力部にＤＭＡポート７０１が接続され、出力部にＤＭＡポート７０２が接続されている。また、ＣＰＵバス上にメモリマップされたストレージ１４が接続され、ＪＰＥＧ圧縮されたデータを格納することができる。このような構成の場合、プログラムカウンタＰＣ(０)はメモリ２から画像データを読み出してＪＰＥＧエンコーダ１３に入力するためのシーケンスを実行する。ＪＰＥＧエンコーダ１３は、入力された画像データをＪＰＥＧ圧縮し、入力データのデータレートとは異なるデータレートを持った圧縮された符号データを生成し、データ転送要求をアサートする。この要求に応じてプログラムカウンタＰＣ(１)が起動され、符号データをメモリ２に転送する。ストレージ１４のアクセススピードはメモリ２に比べて遅い場合があるので、プログラムカウンタＰＣ(２)により制御されるシーケンスは、符号データを、ダブルバッファを用いてバックグラウンドでストレージ１４に転送する。このような動作においては、プログラムカウンタＰＣ(０)は、メモリ上の画像データを８ｘ８のブロック単位でロードアクセスし、プログラムカウンタＰＣ(１)は、符号データを連続アドレスにストアアクセスし、プログラムカウンタＰＣ(２)は、符号データを連続アドレスからロードアクセスしてストレージのデータポートである固定アドレスにストアアクセスする。
【００８７】
以上のようなデータ転送において重要なことは、データ転送間の同期である。例えば、プログラムカウンタＰＣ(２)により制御されるシーケンス（メモリ２上の符号データのストレージ１４への転送）は、プログラムカウンタＰＣ(１)により制御されるシーケンス（生成された符号データのメモリ２上への転送）を追い越すことはできない。すなわち、生成されたデータ以上のデータをストレージに転送することがあってはならない。逆に、プログラムカウンタＰＣ(１)により制御されるシーケンス（生成された符号データのメモリ２上への転送）は、確保されているメモリ領域の空き容量以上にデータを生成・転送してはならない。つまり、ストレージに転送されていないメモリ領域に符号データを生成・転送することがあってはならない。
【００８８】
図１６は、上述したダブルバッファの同期制御を、トリガ待ちサスペンド命令とトリガ発生命令により実現するための、プログラムカウンタＰＣ(０)、ＰＣ(１)およびＰＣ(２)のシーケンス図である。なお、プログラムカウンタＰＣ(０)に関しては、プログラムカウンタＰＣ(１)がサスペンドすることにより符号データ出力部が停止すると、ＪＰＥＧエンコーダ１３の画像データ入力部のデータ転送要求信号がアサートされないため、信号生成部８の作用により自動的にプログラムカウンタがサスペンドする。本動作の説明はシーケンス図からは省いた。
【００８９】
まず、デフォルトのプログラムカウンタであるＰＣ(０)が起動し、プログラムカウンタＰＣ(１)をイネーブルにする（ENABLE PC１）。次に、メモリ上の画像データをＪＰＥＧエンコーダ１３に転送するダイレクトメモリアクセス転送をデータ転送要求信号に応じて実行する（シーケンス図中（１））。
【００９０】
起動されたプログラムカウンタＰＣ（１）はＪＰＥＧエンコーダ１３の生成する符号データをデータ転送要求信号に応じてメモリ領域Ａに転送する（シーケンス図中（２））。メモリ領域Ａへのデータ転送が完了すると、プログラムカウンタＰＣ（２）をイネーブルにし（ENABLE PC２）、引き続きＪＰＥＧエンコーダ１３の生成する符号データをデータ転送要求信号に応じてメモリ領域Ｂに転送する（シーケンス図中（３））。
【００９１】
プログラムカウンタＰＣ(２)は起動されると、メモリ領域Ａ上の符号データをストレージ１４に転送開始する（シーケンス図中（４））。プログラムカウンタＰＣ(１)は符号データをメモリ領域Ｂに転送完了すると、トリガ識別子０のトリガ発生命令を発行する（ＥＭＩＴ０）。この時点で、トリガ待ちサスペンド状態にあるプログラムカウンタは存在しない。プログラムカウンタＰＣ(１)は引き続きトリガ識別子１のトリガ待ちサスペンド命令を発行し（ＷＡＩＴ１）、自らサスペンド状態に遷移する。
【００９２】
プログラムカウンタＰＣ(２)はメモリ領域Ａ上の符号データをストレージ１４に転送し終わると、トリガ識別子１のトリガ発生命令を発行し（ＥＭＩＴ１）、続いてトリガ識別子０のトリガ待ちサスペンド命令を発行し（ＷＡＩＴ０）、自らサスペンド状態に遷移しようとするが、すでにトリガ識別子０のトリガ発生命令がプログラムカウンタＰＣ（１）により発行されているため、サスペンドはキャンセルされ、引き続きメモリ領域Ｂ上の符号データをストレージ１４に転送開始する（シーケンス図中（５））。
【００９３】
プログラムカウンタＰＣ(２)の発行したトリガ識別子１のトリガにより、サスペンド中のプログラムカウンタＰＣ(１)はレジュームし、ＪＰＥＧエンコーダ１３の生成する符号データをデータ転送要求信号に応じてメモリ領域Ａに転送する（シーケンス図中（６））。プログラムカウンタＰＣ(２)は、メモリ領域Ｂの符号データをストレージ１４に転送し終わると、トリガ識別子１のトリガ発生命令を発行し（ＥＭＩＴ１）、続いてトリガ識別子０のトリガ待ちサスペンド命令を発行し（ＷＡＩＴ０）、自らサスペンド状態に遷移する。
【００９４】
プログラムカウンタＰＣ(１)は、ＪＰＥＧエンコーダ１３の生成する符号データをデータ転送要求信号に応じてメモリ領域Ａに転送し終わると、トリガ識別子０のトリガ発生命令を発行し（ＥＭＩＴ０）、続いてトリガ識別子１のトリガ待ちサスペンド命令を発行し（ＷＡＩＴ１）、自らサスペンド状態に遷移しようとするが、すでにトリガ識別子１のトリガ発生命令がプログラムカウンタＰＣ（２）により発行されているため、サスペンドはキャンセルされ、引き続きＪＰＥＧエンコーダ１３の生成する符号データをデータ転送要求信号に応じてメモリ領域Ｂに転送開始する（シーケンス図中（７））。
【００９５】
プログラムカウンタＰＣ(１)の発行したトリガ識別子０のトリガにより、サスペンド中のプログラムカウンタＰＣ(２)はレジュームし、メモリ領域Ａ上の符号データをストレージ１４に転送開始する（シーケンス図中（８））。
【００９６】
以下同様に、プログラムカウンタＰＣ(１)によるメモリ領域Ａへの転送（シーケンス図中（９））、プログラムカウンタＰＣ(２)によるメモリ領域Ｂからの転送（シーケンス図中（１０））のように、順次メモリ領域ＡおよびＢを交互に同期を取りながらアクセスする。
【００９７】
本シーケンス図の例においては、符号データのメモリ領域への転送時間は、入力画像データに依存するためにまちまちであり、一方、ストレージへの転送時間もストレージのステータスに依存してまちまちであるため、２つの転送のどちらが早く終了するかは不確定である。このような例においても、本装置を適用することにより、非常に簡便にダブルバッファを用いて同期を取りながらデータ転送を行うことが可能となる。
【００９８】
以上のように、それぞれ異なるデータレートとアクセスパターンをもつ３種類のデータ転送を、それぞれのデータ転送要求に応じて並列的に同期を取りながら実行することができる。また、命令デコード部やデータ転送実行部は時分割的に動作させることができるため、効率的かつ複雑なアクセスパターンのデータ転送を、比較的少ない回路規模によって実現することが可能となる。
【００９９】
なお、上記実施形態では、ＤＭＡ装置に３つのプログラムカウンタを設けたが、本発明はこれに限定されるものではなく、２つまたは４つ以上のプログラムカウンタを設けたＤＭＡ装置も本発明の範疇に含まれうる。ただし、ＤＭＡポートの数以上のプログラムカウンタが設けられていることが望ましい。
【図面の簡単な説明】
【０１００】
【図１】本発明の一実施の形態のダイレクトメモリアクセス装置のブロック図である。
【図２】命令メモリの構成図である。
【図３】プログラムカウンタ、プログラムカウンタ選択部、プログラムカウンタ更新部の詳細ブロック図である。
【図４】プログラムカウンタ選択信号生成部の詳細ブロック図である。
【図５】プログラムカウンタ選択許可信号のデコードと選択信号の関係を示す図である。
【図６】命令のデコードを示す図である。
【図７】サイズフィールドの意味を示す図である。
【図８】内部リソースの識別子の意味を示す図である。
【図９Ａ】sizeとpos_d/sと有効バイトレーンの関係を示す図である。
【図９Ｂ】sizeとpos_d/sと有効バイトレーンの関係を示す図である。
【図１０】特殊命令のエンコーディングを示す図である。
【図１１】実行抑制・選択許可信号生成部の詳細なブロック図である。
【図１２】第２選択許可信号生成部の詳細なブロック図である。
【図１３】本発明の一実施の形態のダイレクトメモリアクセス装置のダイレクトメモリアクセス動作を示すタイミング図である。
【図１４】本発明の一実施の形態のダイレクトメモリアクセス装置のサスペンド・レジューム動作を示すタイミング図である。
【図１５】本発明の一実施の形態のダイレクトメモリアクセス装置を応用したＪＰＥＧエンコーダのブロック図である。
【図１６】本発明の一実施の形態のＪＰＥＧエンコーダにおけるダイレクトメモリアクセス動作のシーケンス図である。
【符号の説明】
【０１０１】
１０１、１０２・・・ダイレクトメモリアクセスデバイス
２・・・メモリ
３０１、３０２、３０３・・・プログラムカウンタ
４・・・プログラムカウンタ選択部
５・・・命令メモリ
６・・・命令デコード部
６０１、６０２、６０３、６０４、６０５、６０６、６０７、６０８、６０９、６１０・・・比較器
６１１、６１２、６１３、６１４・・・ゲート
７・・・データ転送実行部
８・・・実行抑制・選択許可信号生成部
８０１・・・命令デコード部の出力から転送元または先を検出するブロック
８０２・・・ダイレクトメモリアクセスデバイスからのデータ転送要求を検出するブロック
８０３・・・デバイスがデータ転送要求を出していることを判定するブロック
８０４・・・データ転送実行部のデータ転送を抑制する信号を出力するブロック
８０５・・・プログラムカウンタを非選択とするための信号を生成するブロック
８１１、８１２、８１３、８１４・・・ゲート
８２１、８２２、８２３、８２４・・・ゲート
８３１、８３２、８３３、８３４・・・ゲート
８４１・・・ゲート
８５１、８５２、８５３、８５４・・・ゲート
８５５、８５６、８５７、８５８・・・フリップフロップ
８５９１、８５９２、８５９３・・・ゲート
９・・・第２選択許可信号生成部
９０１、９-４、９-７、９１２、９２４、９３６・・・フリップフロップ
９１０、９１７、９２２、９２９、９３４、９４１・・・フリップフロップ群
９０２、９０３、９０５、９０６、９０８、９０９・・・ゲート
９１１、９１３、９１４、９１５、９１６、９１８、９１９、９２０、９２１・・・ゲート
９２３、９２５、９２６、９２７、９２８、９３０、９３１、９３２、９３３・・・ゲート
９３５、９３７、９３８、９３９、９４０、９４２、９４３、９４４、９４５・・・ゲート
９４６、９４７、９４８・・・ゲート
１０・・・プログラムカウンタ選択信号生成部
１００１、１００２、１００３・・・フリップフロップ
１００４、１００５、１００６・・・セレクタ
１００７・・・デコーダ
１００８、１００９、１０１０・・・ゲート
１１００・・・プログラムカウンタ更新部
１１０１、１１０２・・・セレクタ
１１０３・・・＋１加算器
１２・・・ＣＰＵ
１３・・・ＪＰＥＧエンコーダ
１４・・・記憶装置
【図１】
2006119824.tif 000003
【図２】
2006119824.tif 000004
【図３】
2006119824.tif 000005
【図４】
2006119824.tif 000006
【図５】
2006119824.tif 000007
【図６】
2006119824.tif 000008
【図７】
2006119824.tif 000009
【図８】
2006119824.tif 000010
【図９Ａ】
2006119824.tif 000011
【図９Ｂ】
2006119824.tif 000012
【図１０】
2006119824.tif 000013
【図１１】
2006119824.tif 000014
【図１２】
2006119824.tif 000015
【図１３】
2006119824.tif 000016
【図１４】
2006119824.tif 000017
【図１５】
2006119824.tif 000018
【図１６】
2006119824.tif 000019