(57)【要約】【課題】フィルタ処理を高速に行うことができるプロセッサを提供することにある。【解決手段】本発明に係る演算ユニットは、フィルタ処理を行うための演算器２０１を具備する。その演算器２０１へのデータ供給はフリップフロップで構成された内部レジスタ１００にて行う。内部レジスタ１００から読み出したデータはシフトレジスタ２００へ出力され、サイクル毎にデータを演算器２０１へ供給する。また、動きベクトルに応じてフィルタの演算方向を変更する機構を具備し、同一命令で水平フィルタや垂直フィルタを行うことにより、分岐命令等による性能低下を防止する。【選択図】図６
2009015637.tif 000002
【特許請求の範囲】
【請求項１】
第１の周期で一の特定処理を行う第１の演算処理と、前記第１の周期と異なる第２の周期で他の特定処理を行う第２の演算処理を実行可能な演算器を複数含むＳＩＭＤ演算器と、命令デコーダを含む演算ユニットにおいて、
投入された命令コードに従い前記命令デコーダは前記複数の演算器のうち動作する数を規定できることを特徴とする演算ユニット。
【請求項２】
請求項１記載の演算ユニットにおいて、更に前記ＳＩＭＤ演算器はシフトレジスタを含み、
投入された命令コードに従い前記命令デコーダは前記シフトレジスタにデータを投入することを特徴とする演算ユニット。
【請求項３】
請求項２記載の演算ユニットにおいて、更に内部レジスタとインデックス生成器を含み、
前記命令デコーダからの入力により前記内部レジスタのアドレスを出力し、前記アドレスを参照して前記内部レジスタのデータを前記シフトレジスタに投入することを特徴とする演算ユニット。
【請求項４】
請求項３記載の演算ユニットにおいて、
前記第１の周期は所定数のクロック周期より構成され、前記第１の周期ごとに第１の演算結果を出力し、前記第１の周期中の各クロック周期の終了後に前記シフトレジスタ中のデータをシフトすることを特徴とする演算ユニット。
【請求項５】
請求項４記載の演算ユニットにおいて、
前記第１の演算結果を前記内部レジスタに格納することを特徴とする演算ユニット。
【請求項６】
請求項５記載の演算ユニットにおいて、
前記第２の周期は所定数のクロック周期より構成され、前記第２の周期ごとに第２の演算結果を出力し、前記第２の周期中の各クロック周期の終了後に前記シフトレジスタ中のデータをシフトすることを特徴とする演算ユニット。
【請求項７】
請求項６記載の演算ユニットにおいて、
前記第２の演算結果を前記内部レジスタに格納することを特徴とする演算ユニット。
【請求項８】
請求項７記載の演算ユニットにおいて、
前記第２の演算処理に前記第１の演算結果を前記データとして投入することを特徴とする演算ユニット。
【請求項９】
シフトレジスタと、第１の周期で一の特定処理を行う第１の演算処理と前記第１の周期と異なる第２の周期で他の特定処理を行う第２の演算処理を実行可能な演算器を複数含むＳＩＭＤ演算器と、命令デコーダと、内部レジスタと、インデックス生成器と、動きベクトルレジスタを含む画像フィルタリング装置において、
投入された命令コードに従い前記命令デコーダは前記複数の演算器のうち動作する数を規定し、
投入された命令コードに従い前記命令デコーダは前記動きベクトルレジスタに動きベクトルデータを蓄積しかつ出力し、
前記命令デコーダの出力及び前記動きベクトルデータを参照して前記インデックス生成器は前記内部レジスタのアドレスを出力し、前記アドレスを参照して前記内部レジスタのデータを前記シフトレジスタに投入し、前記ＳＩＭＤ演算器が演算することを特徴とする画像フィルタリング装置。
【請求項１０】
シフトレジスタと、第１の周期で一の特定処理を行う第１の演算処理とサイクルと異なる第２の周期で他の特定処理を行う第２の演算処理を実行可能な演算器を複数含むＳＩＭＤ演算器と、複数の動きベクトルデータが蓄積された動きベクトルレジスタと、命令デコーダと、内部レジスタと、インデックス生成器を含む画像フィルタリング装置において、
投入された命令コードに従い前記命令デコーダは前記複数の演算器のうち動作する数を規定し、
前記命令デコーダからの出力に従い前記動きベクトルレジスタは適切な動きベクトルデータを前記インデックス生成器に出力し、
前記命令デコーダの出力及び前記動きベクトルデータを参照して前記インデックス生成器は前記内部レジスタのアドレスを出力し、前記アドレスを参照して前記内部レジスタのデータを前記シフトレジスタに投入し、前記ＳＩＭＤ演算器が演算することを特徴とする画像フィルタリング装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は画像のフィルタリング処理を行う命令、回路を含むプロセッサに関する。
【背景技術】
【０００２】
動画像では、フレーム中の物体が動いたり、カメラがパンをしたりすることにより、フレーム間で動きがあり、前のフレームと現在のフレームとは全く同じわけではない。しかし、前後の画像での相関は大きい。
【０００３】
動き補償とは、フレーム間予測において、前後のフレームの画像と比較してどの方向へどの程度動いているかというベクトルデータを使用し、画像の解析を行う技術を言う。動き補償により、画像データの圧縮度を高めることに成功している。
【０００４】
多くの画像フレーム符号化方式では画像フレームを所定のブロックに分割し処理を行う。このブロックサイズを小さくすれば詳細な予測ができる。一方でブロック数が増加し、これにより、動きベクトル情報自体の数が増え符号量が増える傾向にある。結果大きな処理能力がハードウェアに要求される。
【０００５】
また、画像を低ビット・レートで符号化する場合、なんらのフィルタリング処理も行わないと復号画像にブロック歪みが生じたままフレームメモリに格納される。この歪みが生じた画像を参照し次のフレームを復号すると、更に画質の劣化が伝播するという問題がある。この、画質劣化の伝播防止のために、フィルタリング処理がなされブロック歪みの発生を防止することは必要不可欠である。しかし、フィルタリング処理の解決にも大きな処理能力がハードウェアに要求される。
【０００６】
従来、画像のフィルタリング処理を行う場合、フィルタを実施するタップ数のクロック周期（サイクル）が必要であり、クロック周期ごとにデータをメモリから供給する必要がある。さらに、動きベクトルによる探査位置により水平フィルタと垂直フィルタが変更され、その都度フィルタ処理の方向を判定し、フィルタ処理にあったプログラムへ分岐させる必要があった。この際、サイクルごとに画素データをメモリから読み出していては読み出しサイクル数を必要以上に消費してしまい、処理性能が低下する。
【０００７】
特開２００２−８０２５号公報（以下特許文献１）では、メモリからのデータリードを削減し、入力バッファ等でデータを蓄積し演算器に供給する方法を提示する。
【特許文献１】特開２００２−８０２５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかし、画像のフィルタリング処理時に画素データをメモリから読み出していたのでは読み出しサイクル数を必要以上に消費してしまい処理性能が低下する。
【０００９】
また、動きベクトルに応じて水平フィルタと垂直フィルタを変更する必要があるが、画像イメージの読み出し方も変更する必要がある。そのため分岐処理を要することとなる。
【００１０】
近年のプロセッサでは分岐予測により処理性能の低下を防いではいるが、画像処理の場合分岐予測は難しいため性能低下は著しい。
【００１１】
更に、回路実装上の問題から、これらのフィルタリング処理に対して、十分な内部レジスタを用意できないことも考えられる。
【００１２】
本発明は、上記問題を解決するためになされたもので、その目的はフィルタ処理を高速に行うことができる演算ユニット及び画像フィルタリング装置を提供することにある。
【００１３】
本発明の前記並びにその他の目的と新規な特徴は、本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１４】
本願において開示される発明のうち、代表的なものの概要を簡単に説明すれば、次の通りである。
【００１５】
本発明に関わる演算ユニットは、第１の周期で一の特定処理を行う第１の演算処理と、サイクルの異なる第２の周期で他の特定処理を行う第２の演算処理を実行可能な演算器を複数含むＳＩＭＤ演算器と、命令デコーダを含み、投入された命令コードに従い命令デコーダは複数の演算器のうち動作する数を規定できることを特徴とする。
【００１６】
この演算ユニットは更に前記ＳＩＭＤ演算器はシフトレジスタを含み、投入された命令コードに従い命令デコーダはシフトレジスタにデータを投入することを特徴としてもよい。
【００１７】
また、この演算ユニットは、更に内部レジスタとインデックス生成器を含み、命令デコーダからの入力により内部レジスタのアドレスを出力し、このアドレスを参照して内部レジスタのデータをシフトレジスタに投入しても良い。
【００１８】
また、この演算ユニットの第１の周期は所定数のクロック周期より構成され、第１の周期ごとに第１の演算結果を出力し、第１の周期中の各クロック周期の終了後に前記シフトレジスタ中のデータをシフトしても良い。この演算ユニットは、第１の演算結果を内部レジスタに格納してもよい。
【００１９】
さらにこの演算ユニットの第２の周期は所定数のクロック周期より構成され、第２の周期ごとに第２の演算結果を出力し、第２の周期中の各クロック周期の終了後にシフトレジスタ中のデータをシフトしても良い。この演算ユニットが第２の演算結果を内部レジスタに格納しても良い。
【００２０】
この演算ユニットは第２の演算処理に第１の演算結果を前記データとして投入してもよい。
【００２１】
本発明に関わる画像フィルタリング装置は、シフトレジスタと、第１の周期で一の特定処理を行う第１の演算処理と第１の周期と異なる第２の周期で他の特定処理を行う第２の演算処理を実行可能な演算器を複数含むＳＩＭＤ演算器と、命令デコーダと、内部レジスタと、インデックス生成器と、動きベクトルレジスタを含み、投入された命令コードに従い命令デコーダは複数の演算器のうち動作する数を規定し、投入された命令コードに従い命令デコーダは動きベクトルレジスタに動きベクトルデータを蓄積し、命令デコーダの出力及び動きベクトルデータを参照してインデックス生成器は内部レジスタのアドレスを出力し、アドレスを参照して内部レジスタのデータをシフトレジスタに投入し、ＳＩＭＤ演算器が演算する。
【００２２】
本発明に関わる画像フィルタリング装置は、シフトレジスタと、第１の周期で一の特定処理を行う第１の演算処理と第１の周期と異なる第２の周期で他の特定処理を行う第２の演算処理を実行可能な演算器を複数含むＳＩＭＤ演算器と、複数の動きベクトルデータが蓄積された動きベクトルレジスタと、命令デコーダと、内部レジスタと、インデックス生成器を含み、投入された命令コードに従い命令デコーダは複数の演算器のうち動作する数を規定し、命令デコーダからの出力に従い動きベクトルレジスタは適切な動きベクトルデータをインデックス生成器に出力し、命令デコーダの出力及び前記動きベクトルデータを参照してインデックス生成器は内部レジスタのアドレスを出力し、アドレスを参照して内部レジスタのデータをシフトレジスタに投入し、ＳＩＭＤ演算器が演算する。
【発明の効果】
【００２３】
本願において開示される発明のうち、代表的なものによって得られる効果を簡単に説明すれば以下の通りである。
【００２４】
本発明にかかわる演算ユニットおよび画像フィルタリング装置は、ハードウェアの構成に関わらず、内部レジスタに画像データを蓄積し、そのデータを演算器に投入することで効率よく処理を実行し、メモリへのデータアクセス削減を図ることができる。
【００２５】
また、動きベクトルを考慮したフィルタ処理を行うことで分岐処理をなくし、命令キャッシュへのアクセスを削減する演算ユニットおよび画像フィルタリング装置を提供することができる。
【００２６】
更には、メモリへのデータアクセスや命令キャッシュへの命令フェッチアクセスが削減されることで、消費電力を抑えることが可能になり、環境に配慮した演算ユニットおよび画像フィルタリング装置を提供することが可能となる。
【発明を実施するための最良の形態】
【００２７】
本発明の実施例について、図面を参照して説明する。
【００２８】
（想定する処理について）
まず本発明が想定する動き補償予測処理について説明する。
【００２９】
動き補償予測を行う際には参照ピクチャの画素値から整数画素以下の画素精度の信号を補間によって生成するのが一般的である。ＭＰＥＧ−２やＭＰＥＧ−４では１／２画素精度までの、Ｈ．２６４／ＡＶＣでは１／４画素精度までの動き補償が可能なように設計されている。
【００３０】
Ｈ．２６４／ＡＶＣにおいては１／２単位画素（ハーフペル）を導出する際と、１／４単位画素（クウォータペル）を導出する際とでは導出手順が２段階に分かれる。まず、最初に参照画像のデータから１／２単位画素のデータを計算式で求める（６タップＦＩＲフィルタ処理）。そして、参照画像及び６タップで導出した１／２単位画素から１／４単位画素及び３／４単位画素を導出する（２タップフィルタ処理）。
【００３１】
図１は整数画素から６タップＦＩＲフィルタ処理および２タップフィルタ処理の処理内容を表す概念図である。この図では○で表されたＡ１が導出の対象となる１／２画素であり、□で表されたＢ１、Ｂ２、Ｂ３、Ｂ４、Ｂ５、Ｂ６が参照画素（整数画素）である。
【００３２】
ここで、１／２単位画素Ａ１を導出する際には前後する整数画素Ｂ１、Ｂ２、Ｂ３、Ｂ４、Ｂ５、Ｂ６の画素から以下の数式を用いて計算する。
【００３３】
Ａ１＝（Ｂ１−５×Ｂ２＋２０×Ｂ３＋２０×Ｂ４−５×Ｂ５＋Ｂ６＋１６）／３２
…（式１）
また、２タップ処理では、△で表された1／４単位画素Ｃ１を以下のように導出する。
【００３４】
Ｃ１＝（Ａ１＋Ｂ３＋１）／２              …（式２）
以上により、横８画素×縦８画素のデータをクウォータペル単位で取り扱う際には、参照画像として横１４画素×縦１４画素のデータが処理に必要となる。本発明においてもこれは同様である。
【００３５】
ここで、１４画素分のデータを一括してメモリに記憶し、処理できれば問題は無いのだが、１４画素分（本発明では１画素１バイトを想定）の演算器を用意するのは現実には回路実装規模上の問題から困難な場合が多い。
【００３６】
図２は横方向の６タップＦＩＲフィルタ処理により、（−１／２、−１）から（７＋１／２、８）までの横９画素、縦１０画素の画像を求めるフィルタ処理を示している。
【００３７】
前述の通り、画面全体の動き補償に際しては、横１４画素×縦１４画素のデータを参照画像６００として用意する必要がある。しかし、実際には、これらの領域全てを一度のデータ読み出しで取り扱うようにすると、データバス幅等の兼ね合いで実装上問題を生じる場合もある。これに対し、この横方向の６タップＦＩＲフィルタ処理に際しては、（−３、−１）、（１０、−１）、（１０、８）、（−３、８）で囲まれる横１４画素×縦１０画素を参照する。従って、これらの画像を内部のレジスタ等にいったん読み込む。
【００３８】
８個の演算器を用いてこの横９画素、縦１０画素の横方向の１／２単位画素（ハーフペル）画像の計算を行う際に、（０、０）を基点として、（−１／２、−１）、（６＋１／２、−１）、（６＋１／２、６）、（−１／２、６）で囲まれる画像５００（点線で囲まれた範囲）を求める。画像５００の導出のためには、入力画像６００の（−３、−１）から（９、−１）、（９、６）、（−３、６）で囲まれた画像範囲の整数画素のデータを用いる。つまり、座標（−１／２、−１）は（−３、−１）から（３、−１）までの６画素を式１に代入して算出する。また、（１／２、−１）から（７＋１／２、−１）、（７＋１／２、６）、（１／２、６）で囲まれた画像範囲５０１（一点鎖線で囲われた範囲）を求めるためにも、横画素の合計８画素を１ラインとして算出する。
【００３９】
同様に、（−１／２、０）を基点とする横８画素×縦８画素の画像５０２（実線で囲われた範囲）、（１／２、０）を基点とする横８画素×縦８画素の画像５０３（２点鎖線で囲われた範囲）、（−１／２、１）を基点とする横８画素×縦８画素の画像５０４（細点線で囲われた範囲）、（１／２、１）を基点とする横８画素×縦８画素の画像５０５（細実線で囲われた範囲）でも同様の処理を行う。
【００４０】
これらの結果から、横９画素、縦１０画素の横方向の１／２単位画素（ハーフペル）のデータを求めることができる。
【００４１】
図３は縦方向の６タップＦＩＲフィルタ処理を説明するための図面である。（−１、−１／２）から横１０画素、縦９画素の画像を求めるフィルタ処理を示している。図２同様に（０、０）を基点とした場合、（−１、−１／２）からの横８画素、縦８画素の画像５１０（点線で囲われた範囲）を求めるためには、入力画像６００の（−１、−３）から（６、−３）、（６、９）、（−１、９）で囲われた画像範囲の整数画素のデータを用いる。すなわち、縦方向においても（−１、−１／２）導出時には（−１、−３）、（−１、−２）、（−１、−１）、（−１、０）、（−１、１）、（−１、２）の６画素分のデータを式１に対して代入する。この（−１、１／２）を基点とする横１０画素、縦９画素の画像５１１（実線で囲われた箇所）を導出するために、縦画素は合計で９画素を１ラインとして算出され、この１ラインのデータはプロセッサ内部のレジスタに格納される。
【００４２】
併せて、（０、−１／２）を基点とする画像５１２（一点鎖線で囲われた箇所）、（０、１／２）を基点とする画像５１３（二点鎖線で囲われた箇所）、（１、−１／２）を基点とする画像５１４（細線で囲われた範囲）、（１、１／２）を基点とする画像５１５（細破線で囲われた範囲）も同様の処理で求め、結果として横９画素、縦１０画素の縦方向の１／２単位画素のデータを内部のレジスタに保持する。
【００４３】
なお、本例では、後述する斜め方向の１／２単位画素（ハーフペル）をこの縦方向の１／２単位画素（ハーフペル）を用いて導出することから、（−３、−１／２）から（１０、−１／２）、（１０、７＋１／２）、（−３、７＋１／２）の画像６０１を導出している。
【００４４】
これらの導出結果を元に、斜め方向に対する画素を算出する。図４はこの斜め方向の６タップＦＩＲフィルタ処理を説明するための図である。この斜め方向の画素を求める場合も６タップＦＩＲフィルタ処理を行うが、図２の横方向のフィルタ処理結果もしくは図３の縦方向のフィルタ処理結果を用いて算出する。
【００４５】
斜め方向におけるフィルタ処理で求める画像は（−１／２、−１／２）を基点とする画像５２０（破線で囲われた箇所）、（１／２、−１／２）を基点とする画像５２１（細破線で囲われた箇所）、（−１／２、１／２）を基点とする画像５２２（一点鎖線で囲われた範囲）、（１／２、１／２）を基点とする画像５２３（実線で囲われた範囲）である。これを合成して斜め方向の横９画素、縦９画素の画像を作成する。この際、縦方向のフィルタ処理結果から求めるために必要な参照画素データは（−３、−１／２）から（１０、７＋１／２）の画像６０１である。この画像６０１に対して、横方向の６タップＦＩＲフィルタ処理を行うことで、斜め方向の横９画素、縦９画素のフィルタ画像を求めることができ、この結果をプロセッサ内部のレジスタに保管する。
【００４６】
算出した縦、横、斜め方向の画像データを用いて、１／４単位画素（クウォータペル）の画像を求める。１／４単位画素は式２を用いて算出する。そして動きベクトルによって使用する画像データが決定される。
【００４７】
図５は横４画素、縦４画素の結果を得る２回目のフィルタ処理を示す。１回目のフィルタ処理は６タップＦＩＲフィルタ処理であるのに対し、２回目のフィルタ処理は２タップフィルタ処理である。そのため、４×４画素の画像を求めるために９×９画素のデータを使用する。内部レジスタは９バイト幅のデータを１エントリに格納し、計９エントリの内部レジスタに参照画像６１０を格納する。図５に示す基準となる座標から（１／２、１／２）の位置の画像を得る方法は、参照画像６１０でエントリ２から５までの画像データ７００を使用し、横方向の６タップフィルタを行い、ハーフペル画像６１１を生成する。また、全てのエントリを使用して縦方向の６タップフィルタを行うが、ハーフペル画像６１２は左からのバイト位置で３バイト目から６バイト目のみを使用する。ハーフペル画像６１１、６１２を使用し、２回目のフィルタ処理である２タップフィルタを行い、クォータペル画像６１３を生成する。このように内部レジスタへ１ラインのデータを保存しているため、読み出しと演算を容易に実行することが可能となる。
【００４８】
本発明はこの一連の処理を限られたハードウェア資源を用いて効率よく行うことを考えているものである。
【００４９】
（第１の実施の形態）
図６は本発明に関わる演算ユニット１５０の基本的なデータフローを表す概略図であり、図７はこの演算ユニット１５０に送られる命令（コマンド）のデータ形式を表す構成図である。また、図８はこの演算ユニット１５０を搭載したプロセッサの概略図である。
【００５０】
この演算ユニット１５０は内部レジスタ１００、命令デコーダ１０１、ＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｔｒｅａｍ、  Ｍｕｌｔｉ  Ｄａｔａ  Ｓｔｒｅａｍ）演算器１０２、データアライナ１０３、動きベクトルレジスタ１０４、インデックス生成器１０５の各モジュールより構成される。また、この演算ユニット１５０を用いたプロセッサは、演算ユニット１５０の他に命令キャッシュ１５１、データキャッシュ１５２、メモリＩ／Ｆ１５３、Ｉ／Ｏ１５４、内部バス１５５より構成される。
【００５１】
内部レジスタ１００はデータアライナ１０３によって整列・区分された参照データを、データごとに一時的に保持するためのレジスタ群である。上述の（想定する処理について）で説明したプロセッサ内部のレジスタはここを想定している。従って、本発明においては横方向、縦方向、斜め方向の６タップＦＩＲフィルタ処理を行う際に用いる参照画像データや２タップフィルタ処理を行うための６タップＦＩＲフィルタ処理後の画素データを保管する、などが本レジスタの主な用途である。
【００５２】
命令デコーダ１０１は命令キャッシュより送信されるコマンドを解読し、ＳＩＭＤ演算器１０２、動きベクトルレジスタ１０４、インデックス生成器１０５に対し処理を指示するためのモジュールである。また、ここでコマンドを解析して、動きベクトルレジスタ１０４にデータを書き込む処理も行う。
【００５３】
ＳＩＭＤ演算器１０２はＳＩＭＤ処理を扱うための演算器である。ここでＳＩＭＤ処理とは、一つの命令（コマンドセット）で、複数のデータを扱う処理方式のことを言い、大量のデータに同種の処理を行う際に用いられる。ＳＩＭＤ演算器１０２はシフトレジスタ２００、演算器２０１、演算結果レジスタ２０２より構成される。本発明においては、ハーフペルやクウォータペルの導出に、複数の参照画素から、一度に複数の結果を導出する目的で、一つのコマンドで処理を指示することを狙ったものである。
【００５４】
本発明においては、ＳＩＭＤ演算器１０２は上述した式１及び式２を処理できれば良い。ただし、これ以外の機能を持たせ、より多用途を持たせても問題は無い。
【００５５】
データアライナ１０３はデータキャッシュ１５２又はバスＩ／Ｆから送信されるデータを有意のデータに切り分け、内部レジスタ１００に記憶させるためのモジュールである。
【００５６】
動きベクトルレジスタ１０４は、命令デコーダ１０１がコマンド中から動きベクトルの情報を読み出し、それを動きベクトルデータとして一時的に蓄えるためのレジスタである。
【００５７】
インデックス生成器１０５は、内部レジスタ１００に蓄えられた参照データのいずれを演算対象とするか、ＳＩＭＤ演算器１０２のシフトレジスタ２００のシフト量をどの程度にするかを指標するインデックスを生成するモジュールである。命令デコーダ１０１からの出力及び動きベクトルレジスタ１０４に蓄えられた動きベクトルデータを参酌して内部レジスタ１００のアドレスやレジスタ番号を特定して出力する。
【００５８】
命令キャッシュ１５１は内部バス１５５に接続されており、命令コードは内部バス１５５を経由して供給される。そして命令キャッシュ１５１に入力された命令コードは、演算ユニット１５０に送られる。
【００５９】
データキャッシュ１５２は演算ユニット１５０が必要とするデータを供給するモジュールである。データキャッシュ１５２に該当するデータが無い場合にはメモリＩ／Ｆ１５３を通して外部メモリ（図示せず）から必要とするデータを演算ユニット１５０が読み出す。
【００６０】
メモリＩ／Ｆ１５３は外部メモリ１６０から命令コードやデータ等の供給を受けるためのインターフェイス部のことである。
【００６１】
Ｉ／Ｏ１５４は図示しない外部プロセッサ等との接続を行う際のインターフェイス部のことである。
【００６２】
内部バス１５５はプロセッサ中の各モジュールとの接続を行う共用のデータ通信路のことを言う。
【００６３】
以下この構成下での動作について説明する。
【００６４】
命令キャッシュ１５１に格納されているコマンドを命令デコーダ１０１がフェッチし、そのデコード結果によって、内部レジスタ１００に入力するために、参照画像データ（整数画素データ）をデータキャッシュ１５２や外部メモリからデータアライナ１０３へ転送する。
【００６５】
通常、データキャッシュやバスＩ／Ｆからのデータは２の累乗のデータ幅である。しかし、内部レジスタ１００のデータ幅やＳＩＭＤ演算器１０２の演算器の数は必ずしも２の累乗に限られず、実装条件等によって定められる。命令デコーダ１０１の制御により、データアライナ１０３は参照画像データ（整数画素データ）を以下のように取り扱う。
【００６６】
内部レジスタ１００のデータ幅に満たない場合、データアライナ１０３は受け取ったデータを指示されたデータ幅となるまで一旦保持し、データキャッシュもしくはバスＩ／Ｆからのデータを待つ。命令デコーダ１０１に指示されたデータ幅となった場合には、データアライナ１０３は内部レジスタ１００へ参照画像データを書き込む。
【００６７】
命令デコーダ１０１によって、内部レジスタ１００にアクセスを行うための基準インデックス番号３００と、動きベクトルレジスタ１０４に格納した動きベクトルデータ３０５により、内部レジスタ１００のインデックス番号をインデックス生成器１０５によって生成する。
【００６８】
生成されたインデックス番号によって選択されたデータはＳＩＭＤ演算器１０２のシフトレジスタ２００が受け取る。さらに命令デコーダ１０１により演算制御信号３０１を出力し、ＳＩＭＤ演算器１０２の演算器２０１へ送られる。
【００６９】
このときのデータは、すでにデータアライナ１０３で調整された後のものであり、演算器２０１が演算命令を実行するのに必要なデータ幅に合わせて実装されている。すなわち、本実施の形態のように演算器２０１が８個あるのであれば、ＳＩＭＤ演算器１０２に送られるデータも演算器８個分のものが必要となる。
【００７０】
なお、この演算器を必要なだけ実装すると回路規模が増大する虞がある。従って、必要性能を考慮して実装数を削減することも考慮しなければならない。この削減によっても必要な性能を出すことが求められるのは言うまでもない。
【００７１】
演算器２０１により演算したライトバックデータ３０２が２の累乗でないバイト数であったとしても、内部レジスタ１００のデータ幅以下であれば、ライトバックデータ３０２１サイクルで書き込みを行うことが可能である。
【００７２】
これにより、演算処理が２の累乗でないデータ幅を必要とした場合でも、演算器２０１と内部レジスタ１００をそのデータ幅に合わせることで処理性能を向上させることが可能である。
【００７３】
図７は、図６の演算ユニット１５０を動作させるための命令コードをニーモニックで書いた場合を示している。命令コードは演算器２０１の処理方法を示すオペコード４００、演算幅４０１、演算器２０１に投入する演算データを格納する内部レジスタ１００のどこに存在するかを示す第１ソースレジスタ番号４０２，第２ソースレジスタ番号４０３、演算した結果を内部レジスタ１００のどこに保管するかを示すデスティネーションレジスタ番号４０４により構成される。
【００７４】
この命令コードの特徴的な箇所は、演算の幅を示す演算幅４０１のフィールドを持つ点である。この演算幅４０１は演算器２０１の動作させる個数や、内部レジスタ１００のデータ幅を表す属性値である。ただし、この属性値の上限は演算器２０１の個数や内部レジスタ１００のデータ幅に制約されない。この場合、２サイクル以上かけて演算を行い、結果を出力する。
【００７５】
本発明のニーモニックはデータ幅を記述する必要があり、それによって命令コードを生成する。ただし、演算幅４０１は必ずしも記述する必要は無い。オペコード４００によって一意に決まる場合には記述する必要は無い。たとえば、８ビットの加算命令を演算幅１６バイト、すなわち１６演算並列する場合には、ａｄｄ８．ｗ１６と記述することで表現することを想定している。
【００７６】
図８は図６の演算ユニット１５０を搭載したプロセッサの概略図である。基本的には演算ユニット１５０内部のデータアライナ１０３によってデータの並び順を変更することを想定しているため、演算ユニット１５０以外の構造は一般的なプロセッサの構造と変わらない。
【００７７】
演算した結果をストア命令等により出力する場合、データキャッシュ１５２にいったん送られるか、内部バス１５５、メモリＩ／Ｆ１５３を介して外部メモリで保持される。
【００７８】
また、ビデオやオーディオ等の低速デバイス等とのインターフェイスであるＩ／Ｏ１５４等とのやり取りを内部バス１５５経由で行うこともできる。
【００７９】
図９はデータアライナ１０３を実現する方法の一つである。外部メモリ１６０は６４ビット幅で、内部レジスタ１００は８０ビット幅とした場合を示す。
【００８０】
命令デコーダ１０１からのコマンドにより、バイトイネーブル制御部２０３はアドレス信号を生成する。このアドレス信号により外部メモリ１６０のアドレスを特定する。外部メモリ１６０から読み出すデータを内部レジスタ１００へ書き込む際、書き込みのタイミングであるイネーブル信号を生成する。アドレスの下位ビットにより一回目の外部メモリ１６０の読み出しで、内部レジスタ１００へ書き込むことのできる位置を判別可能である。
【００８１】
すなわち、アラインが取れている外部メモリ上のデータライン１０００は、バイトイネーブル制御部２０３により、内部レジスタデータ１１００へ全てのデータを書き込むことが可能である。
【００８２】
次のサイクルでは、内部レジスタデータ１１００の残りのデータを外部メモリ１６０のデータライン１００１から読み出し、バイトイネーブル制御部２０３によりバイトイネーブル信号３１０を生成し、内部レジスタデータ１１００へ書き込みを行う。
【００８３】
このとき、外部メモリから読み出したデータのうち、内部レジスタ１００へ書き込みを行わなかったデータに関しては一時保持するなどにより、次回のアクセスで使用することで読み出しサイクルを削減することも可能である（どのように一次保持するのか図９からは不明）。
【００８４】
図１０は画像処理として２回のフィルタ処理を行う場合のデータフローを示す。本図では、１４バイトのデータを用いて６タップフィルタ処理を行い、縦、横、斜めとも９バイトのハーフペルのデータを生成する。その後、さらにその９バイトのデータをも用いて２タップフィルタ処理を行い、結果８バイトのクウォータペルのデータを生成する。
【００８５】
まず、１４バイト幅データ５００のうち適切否データをＳＩＭＤ演算器１０２へ投入する。このとき９バイトの結果を必要とするため、ＳＩＭＤ演算器の８個の演算器２０１を動作させる。
【００８６】
６タップＦＩＲフィルタ処理を行うため、データの投入は６サイクルをかけて行い、サイクル毎に１バイトずつずらしてＳＩＭＤ演算器１０２へ投入する。このため、９バイト＋６タップ−１のバイト数が必要となり、投入する必要のあるバイト数は１４バイトとなる。
【００８７】
シフトレジスタ２００により１バイトずつ、ずらしたデータをＳＩＭＤ演算器１０２へ投入することが可能であり、６サイクル後に９バイトの演算結果を得る。この演算結果は内部レジスタ１００へ一旦書き戻され、次の２タップフィルタで再度使用される。このとき、内部レジスタ１００のデータ幅が９バイトではなかった場合、９バイト以外の部分はいかなる値でもよい。
【００８８】
内部レジスタ１００に保存された９バイトのデータを、次の２タップフィルタ処理のために演算器２０１へ投入する。このとき、演算器２０１を８個動作させる。２タップフィルタ処理を行うため、１サイクル目は先頭の８バイトを投入し、次のサイクルで１バイトシフトしたデータを投入する。２サイクルの処理が終了した時点で８バイトの結果を得ることができ、その演算結果２０２は内部レジスタ１００へ書き戻される。これにより、６タップフィルタの処理後、２タップフィルタ処理を実現することが可能となる。
【００８９】
図１１は、内部レジスタ１００を１０バイト幅で定義した場合の１４バイト幅のデータの格納方法を示している。通常は１４バイトのデータ幅にあわせて内部レジスタ１００のデータ幅を規定するが、最大幅が全処理に対して極端に使用回数が少ない場合は内部レジスタ１００の回路規模削減のために複数のレジスタにまたがって格納することで、回路規模を削減することが可能である。もちろん、この場合リードポート数は２となる。
【００９０】
レジスタ０とレジスタ１にはデータ１３００と１３０１が保存されており、画素データ１の１４バイトを構成する。同様に、レジスタ２とレジスタ３のデータ１３０２とデータ１３０３を用いて画素データ２の１４バイトを構成する。使用する場合、例えば、レジスタ４をソースとして指定し、データ幅１４とニーモニックコードを記述することで、レジスタ４とレジスタ５のデータをシフトレジスタ２００へ投入することが可能である。
【００９１】
図１２は１０バイト幅の内部レジスタ１００に１４バイト幅のデータを格納した場合に演算器でのフィルタ処理を示している。
【００９２】
画像圧縮技術で、６タップフィルタ処理を行った後、２タップフィルタ処理を行うような場合、１４画素から９画素の画像を生成し、さらに２タップフィルタ処理により８画素の画像を生成する。このような処理の場合、内部レジスタ１００に１４画素分のデータを保持する必要があり、１ライン目の１４画素の画像データ１のうち、上位１０バイトをレジスタ０にデータ１３００を保存し、下位４バイトはレジスタ１にデータ１３０１として保存する。これらのデータはＳＩＭＤ演算器１０２への投入し、シフトレジスタ２００にて整形される。横方向の６タップフィルタ処理は、１４画素データの最初の６画素から求められる。そのため、シフトレジスタ２００にて各サイクルで１バイトずつ演算器２０１へ投入することで求めることが可能である。６サイクル後に出力された演算結果２０２は、内部レジスタ１００へライトバックされ、次のフィルタ処理へ投入される。
【００９３】
以上のような構成により、演算処理が２の累乗でないデータ幅を必要とした場合であっても、演算器２０１と内部レジスタ１００をそのデータ幅に合わせることで処理性能を向上させることが可能である。
【００９４】
（第２の実施の形態）
図１３は動きベクトルに応じて投入するデータを変更し、フィルタ処理を１命令で行うことを可能とした演算ユニットのデータフローを示す。
【００９５】
第１の実施の形態の演算ユニットと相違する箇所は動きベクトルレジスタ１０４を動きベクトルレジスタ１７０に置き換え、想定される動きベクトルの処理をバスＩ／Ｆから書き込めるようにしたこと、及び、インデックス生成器１０５をインデックス生成器１７１に変更した点である。
【００９６】
実際にはＨ．２６４では１つのブロックに対する動きベクトルの処理パターンが４０−５０ぐらいの処理に限られる。
【００９７】
従って、この処理パターン（動きベクトル）をデータとして全て動きベクトルレジスタ１７０に書き込めるようにしておく。そして、この動きベクトルレジスタ１７０から動きベクトル判定器１０６が動きベクトルを抽出し、動きベクトル判定器１０６から適切な処理を行うべく内部レジスタ１００のアドレスを設定し、ＳＩＭＤ演算器１０２のシフトレジスタ２００に設定することを可能にする。
【００９８】
以下、動きベクトルレジスタ１７０書き込み後の動作について詳細に述べる。
【００９９】
命令デコーダ１０１によって内部レジスタ１００へアクセスを行う為、動きベクトル選択信号３０４により動きベクトルレジスタ１７０の中から適切なデータ（動きベクトル３０５）を選択し、動きベクトル判定器１０６が適切な動きベクトル３０５を参照する。
【０１００】
また、命令デコーダ１０１より出力される動きベクトル判定器制御信号３０８により、参照している動きベクトル３０５を用いた内部の演算方式を変更する。例えば２段階フィルタ処理の場合であれば、１段階目と２段階目での動きベクトル３０５の処理方式を変更する為に用いる。
【０１０１】
動きベクトル判定器１０６により決定されたオフセット値と、基本インデックス番号３００とを加算し、ＳＩＭＤ演算器１０２へ入力するレジスタデータ３０３を選択する。選択したデータはシフトレジスタ２００が受け取る。その後、さらに命令デコーダ１０１により演算制御信号３０１を出力し、ＳＩＭＤ演算器１０２の演算器２０１へ演算の種類を通知する。
【０１０２】
また、動きベクトル判定器１０６によりシフトレジスタ２００に出力される制御信号線３０９によって、シフトレジスタ２００からの出力データの重み付けがなされ、それを用いて演算器２０１が演算処理を行う。
【０１０３】
シフトレジスタ２００のデータは演算器２０１へと送られるが、このとき演算器２０１の実装数は演算命令が必要とするデータ幅に合わせて実装されている。すなわち、演算結果として９個の演算結果が必要であれば、演算器２０１の実装数も９個となる。この演算器の実装数は、最大数を実装すると回路規模が増大する恐れがあるため、必要性能を考慮し、実装数を削減することも可能である。
【０１０４】
このようにすることで、演算器２０１により演算したライトバックデータ３０２が２の累乗ではないバイト数であったとしても、内部レジスタ１００のデータ幅以下であるならばライトバックデータ３０２は１サイクルで書き込みを行うことが可能である。
【０１０５】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は前記の実施の形態に限定されるものでなく、その要旨を逸脱しない範囲で種々変更可能であることは言うまでもない。
【産業上の利用可能性】
【０１０６】
本発明は複数回のフィルタ処理を要するデータ処理を行う際に有効である。本書ではＨ．２６４ＡＶＣ等の画像の復号化、符号化を例として上げたが、必ずしもこれにはこだわらず、音声等の処理であっても適用可能である。
【図面の簡単な説明】
【０１０７】
【図１】６タップＦＩＲフィルタ処理及び２タップフィルタ処理を説明するための概念図である。
【図２】本発明による、横方向６タップＦＩＲフィルタ処理を説明するための概念図である。
【図３】本発明による、縦方向６タップＦＩＲフィルタ処理を説明するための概念図である。
【図４】本発明による、斜め方向６タップＦＩＲフィルタ処理を説明するための概念図である。
【図５】本発明による、２タップフィルタ処理を説明するための概念図である。
【図６】本発明の第１の実施の形態に関わる演算ユニットのデータフローを表す概念図である。
【図７】本発明の第１の実施の形態に関わる演算ユニットへの命令コードの構成を表す構成図である。
【図８】本発明の演算ユニットを用いたプロセッサの構成を表す構成図である。
【図９】本発明の演算ユニットに含まれるデータアライナによるデータの整列を表す図である。
【図１０】本発明の第１の実施の形態に関わる演算ユニットの６タップＦＩＲフィルタ処理及び２タップフィルタ処理の流れを示す図である。
【図１１】内部レジスタが１０バイト幅であるときに本発明の第１の実施の形態に関わる演算ユニットが１４バイトのデータを格納することを想定したデータの格納方法を表す概念図である。
【図１２】図１１のデータを本発明の第１の実施の形態に関わる演算ユニットに投入する方法を示した図である。
【図１３】本発明の第２の実施の形態に関わる演算ユニットのデータフローを表す概念図である。
【符号の説明】
【０１０８】
１００…内部レジスタ、１０１…命令デコーダ、１０２…ＳＩＭＤ演算器、
１０３…データアライナ、１０４…動きベクトルレジスタ、
１０５…インデックス生成器、
１５０…演算ユニット、１５１…命令キャッシュ、１５２…データキャッシュ、
１５３…メモリＩ／Ｆ、１５４…Ｉ／Ｏ、１５５…内部バス、
２００…シフトレジスタ、２０１…演算器、２０２…演算結果レジスタ
４００…オペコード、４０１…演算幅、４０２…第１ソースレジスタ番号、
４０３…第２ソースレジスタ番号、４０４…デスティネーションレジスタ番号
【図１】
2009015637.tif 000003
【図２】
2009015637.tif 000004
【図３】
2009015637.tif 000005
【図４】
2009015637.tif 000006
【図５】
2009015637.tif 000007
【図６】
2009015637.tif 000008
【図７】
2009015637.tif 000009
【図８】
2009015637.tif 000010
【図９】
2009015637.tif 000011
【図１０】
2009015637.tif 000012
【図１１】
2009015637.tif 000013
【図１２】
2009015637.tif 000014
【図１３】
2009015637.tif 000015