(57)【特許請求の範囲】
【請求項１】
複数のメモリバンクからなるメモリに入力データを書き込み、書き込まれたデータを書き込みと異なる順序で読み出すことにより、２次元配列型のデータ構造に対して行方向優先でデータを書き込み、各行ごとに規定される行内並び替えパターンに基づき行内並び替えを行い、行同士を並び替え、列方向優先でデータを読み出すインターリーブアルゴリズムを実現する並列インターリーバであって、
複数のメモリバンクからなり、各バンクが前記２次元配列の１または複数の行番号と対応付けられているメモリと、
それぞれ前記２次元配列のデータ構造における別の行において規定される複数の行内並び替えパターンを生成するパターン生成手段と、
前記パターン生成手段を内部に持ち、前記複数の行内並び替えパターンに基づき複数の読み出しアドレスを生成する読み出し制御手段と、
を具備し、前記メモリから複数のデータを同時に読み出す
並列インターリーバ。
【請求項２】
前記読み出し制御手段は、前記メモリバンク間で同時に読み出す２つ以上のデータについて、いずれの２つ以上についても、インターリーブ後のデータ順位の差を行数で除した余りが１以上となるように、前記複数のメモリバンクからデータを読み出す
請求項１に記載の並列インターリーバ。
【請求項３】
前記インターリーブアルゴリズムは、入力データのデータサイズが前記２次元配列より小さい場合、前記入力データにダミーデータを付加してインターリーブ処理を行った後、ダミーデータを取り除くインターリーブアルゴリズムであり、
前記並列インターリーバは、さらに、前記複数のアドレスのうち、前記ダミーデータに対応する０ないし複数個の無効アドレスを判別する無効アドレス判定部を具備する
請求項１に記載の並列インターリーバ。
【請求項４】
前記読み出し制御手段は、前記メモリバンク間で読み出す２つ以上のデータについて、いずれの２つ以上についても、ダミーデータ除去前の順位の差を行数で除した余りが１以上となるように、前記複数のメモリバンクからデータを読み出す
請求項３に記載の並列インターリーバ。
【請求項５】
前記２次元配列のデータ構造における各行の入力データを、同じ行のデータはその行番号に対応するメモリバンクに書き込むようにして、定められたメモリバンクに書き込むための書き込みアドレスを生成する書き込み制御手段を具備し、
当該書き込み制御手段は、２次元配列のデータ構造における各行と、書き込み先バンクとの対応が、一対一の対応となる書き込みアドレスを生成する
請求項１に記載の並列インターリーバ。
【請求項６】
前記２次元配列のデータ構造における各行の入力データを、同じ行のデータはその行番号に対応するメモリバンクに書き込むようにして、定められたメモリバンクに書き込むための書き込みアドレスを生成する書き込み制御手段を具備し、
当該書き込み制御手段は、２次元配列のデータ構造における行に対する書き込み先のメモリバンクの対応を一意に定め、かつ、インターリーブ後の順位の差と行数との最大公約数を越えない１ないし複数の行を１つのメモリバンクに対応付ける書き込みアドレスを生成する
請求項１に記載の並列インターリーバ。
【請求項７】
前記２次元配列のデータ構造における各行の入力データを、同じ行のデータはその行番
号に対応するメモリバンクに書き込むようにして、定められたメモリバンクに書き込むための書き込みアドレスを生成する書き込み制御手段を具備し、
当該書き込み制御手段は、
前記同時に読み出すデータと同数の第１の行番号の組を生成する行カウンタと、前記同時に読み出すデータと同数の第１の列番号の組を生成する列カウンタとを備え、前記第１の行番号の組により書き込み先バンクを決定すると共に、前記第１の列番号の組より書き込みアドレスを算出し、
前記読み出し制御手段は、
いずれの２つについても、差を行数で除した余りが１以上となるような複数のデータ順位に対するインターリーブアドレスを複数生成するインターリーブアドレス生成手段と、前記インターリーブアドレスに対し第２の行番号の組及び第２の列番号の組を一意に算出する行列番号決定手段と、前記第２の列番号の組を読み出しアドレスとし、前記第２の行番号の組により読み出し元バンクを決定すると共に前記読み出しアドレスを該当する読み出し元バンクに送出するアドレス転送手段と、を具備する
請求項１に記載の並列インターリーバ。
【請求項８】
前記読み出し制御手段は、
前記インターリーブ後の順位の差を行数で除した余りを行オフセットとして求め、当該行オフセットぶんずつオフセットした、前記メモリバンク分の行番号からなる行番号セットを、行間並び替えパターンに基づいて変換し、変換後の行番号セットを前記メモリの出力側に設けられた出力選択手段にバンク選択信号として送出するバンク選択信号生成手段と、
列番号セットと、前記バンク選択信号生成手段により求められた変換後の行番号セットとを用いて、行内並べ替えパターンを生成して、そのパターンを読み出しアドレスとして前記メモリの該当するメモリバンクに送出する読み出しアドレス生成手段と
を具備する請求項１に記載の並列インターリーバ。
【請求項９】
前記並列インターリーバは、前記２次元配列のデータ構造における各行の入力データを、所定のサブブロック単位で異なるメモリバンクに書き込むための書き込みアドレスを生成する書き込み制御手段を有するサブブロック分割型のインターリーバであり、
前記読み出し制御手段は、
前記インターリーブ後の順位の差を行数で除した余りを行オフセットとして求め、当該行オフセットぶんずつオフセットした、前記メモリバンク分の行番号からなる行番号セットを、行間並び替えパターンに基づいて変換し、変換後の行番号セットを前記メモリの出力側に設けられた出力選択手段にバンク選択信号として送出するバンク選択信号生成手段と、
列番号セットと、前記バンク選択信号生成手段により求められた変換後の行番号セットとを用いて、インターリーブ後の順位の差がサブブロックサイズとなる行内並べ替えパターンを生成し、そのパターンを読み出しアドレスとして前記メモリの該当するメモリバンクに送出する読み出しアドレス生成手段と
を具備する請求項１に記載の並列インターリーバ。
【請求項１０】
前記書き込み制御手段は、前記各メモリバンクに書き込む入力データのサブブロックサイズを前記２次元配列のデータ構造における列数以上とする、書き込みアドレスを生成する
請求項９に記載の並列インターリーバ。
【請求項１１】
前記書き込み制御手段は、前記各メモリバンクに書き込む入力データのサブブロックサイズを前記２次元配列のデータ構造の列数に等しくする、書き込みアドレスを生成する
請求項８に記載の並列インターリーバ。
【請求項１２】
請求項１に記載の並列インターリーバの書き込みアドレスと読み出しアドレスを入れ替え、さらに入力選択手段と出力選択手段を入れ替えることにより、インターリーブアルゴリズムの逆処理を実現する
並列デインターリーバ。
【請求項１３】
請求項１に記載の並列インターリーバを具備するターボデコーダ。
【請求項１４】
複数のメモリバンクからなるメモリに入力データを書き込み、書き込まれたデータを書き込みと異なる順序で読み出すことにより、２次元配列型のデータ構造に対して行方向優先でデータを書き込み、各行ごとに規定される行内並び替えパターンに基づき行内並び替えを行い、行同士を並び替え、列方向優先でデータを読み出すインターリーブアルゴリズムを実現する並列インターリーブ方法であって、
前記２次元配列のデータ構造における別の行において規定される複数の行内並び替えパターンを生成するパターン生成ステップと、
前記パターン生成ステップで生成した前記複数の行内並び替えパターンに基づき、複数のメモリバンクからなり各バンクが前記２次元配列の１または複数の行番号と対応付けられているメモリについての複数の読み出しアドレスを生成する読み出し制御ステップと、
を含み、前記メモリから複数のデータを同時に読み出す
インターリーブ方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、特に、２次元配列型のデータ構造に対して行方向優先でデータを書き込み、各行ごとに行内並び替えを行い、行同士を並び替え、列方向優先でデータを読み出すインターリーブアルゴリズムを実現する並列インターリーバ、並列デインターリーバ及びインターリーブ方法に関する。
【背景技術】
【０００２】
（インターリーブのアルゴリズム）
先ず、従来のインターリーバのアルゴリズムについて説明する。インターリーブ処理とは、長さＫのデータ列｛ｄ［０］，ｄ［１］，…，ｄ［Ｋ−１］｝を並び替えて、データ列｛ｄ’［０］，ｄ’［１］，…，ｄ’［Ｋ−１］｝を出力する処理である。個々のデータｄ［ｉ］は、単一のビットである場合や固定小数点数（いわゆる軟判定値）である場合などさまざまであるから、以後シンボルと呼ぶ。
【０００３】
従来のインターリーブアルゴリズムのうち、２次元配列型のデータ構造を用いるものがある。その基本的なアルゴリズムは以下の通りである。なお、例として非特許文献１に記載されているものを紹介する。そのインターリーブ方式は、素体インターリーバ(Prime Interleaver;ＰＩＬ)として知られているものである。以下、ＰＩＬの手順を説明する。例として、データ長Ｋ＝４５の場合について、図１、図２及び図３を用いて説明する。
【０００４】
［手順１］データ長Ｋに応じて、配列の行数Ｒおよび列数Ｃを所定の式により決定する。
【０００５】
［手順２］Ｒ行Ｃ列の配列に、行方向優先でシンボルを書き込む。このとき、データ長Ｋが配列のサイズＲＣに満たない場合、残りの領域にダミーシンボル（ｄ）を書き込む。この状態を、図１に示した。
【０００６】
［手順３］次に、配列の各行について、所定の規則に従い行内での並び替えを行う。ここで、並び替え規則は各行ごとに異なる場合がある。各行の並び替え規則は、数列Ｕｉ（ｊ）により表される。Ｕｉ（ｊ）は、第ｉ行第ｊ列に移動されるデータの行内の元の位置を示す。例えば、例においてはＵ２（３）＝７であるが、これは第２行第３列に移動されるデータの元の位置は第２行第７列であることを示す。すなわち、ｄ［２７］が行内並び替えにより第２行第７列から第２行第３列に移動される。この状態を、図２に示した。
【０００７】
［手順４］さらに、各行内の順序を保ったまま、所定の規則に従い行ごとを入れ替える。この行間並び替えは、数列Ｔ（ｉ）で表される。すなわち、第ｉ行に移動される行の元の位置は、第Ｔ（ｉ）行である。この状態を、図３に示した。
【０００８】
［手順５］最後に、配列内のデータを列方向優先に読み出す。このとき、ダミーデータは読み飛ばす（プルーニングという）。以上により、出力シンボル列は、｛ｄ［４０］，ｄ［３０］，ｄ［２０］，ｄ［１０］，…，ｄ［１８］，ｄ［４］，ｄ［３１］，…，ｄ［１６］，ｄ［７］｝となる。
【０００９】
上記手順中における、ＲとＣの決定方法、行内並び替え規則Ｕｉ（ｊ）、行間並び替え規則Ｔ（ｉ）については、非特許文献１に規定されている。また非特許文献１に示される方法以外にも、多数の方法が提案されている。
【００１０】
因みに、本発明で提案する並列インターリーバは、ＲとＣの決定方法、行内並び替え規則Ｕｉ（ｊ）、行間並び替え規則Ｔ（ｉ）にかかわらず、上記手順により行われる全てのインターリーバに対して有効なものである。
【００１１】
（インターリーバの実装方法）
実際にＬＳＩなどでインターリーバ回路を実現する場合には、上述したような２次元配列への書き込みや行内・行間並び替えを行うわけではない。一般的に知られているインターリーバ回路は、入力されたシンボル順でメモリに順序良く書き込んだ後、ランダム的に読み出すことで並び替えを実現する。このランダム的なメモリ読み出しを行う際のアドレス計算方法に、行内・行間並び替えや列方向優先読み出しの規則を反映させることにより、上述したようなインターリーブを実現する。
【００１２】
図４に、最も基本的なインターリーバ回路を示す。１サイクルに１シンボルずつ処理するため、逐次型インターリーバと呼ばれるものである。逐次型インターリーバは、シンボル列を格納するＲＡＭと、昇順アドレスを生成するカウンタ１と、擬似ランダムアドレスを生成するアドレステーブルとカウンタ２からなる。
【００１３】
インターリーブ処理を行うに先立ち、インターリーブパターンを定めた規格に従い、アドレステーブルを設定する。その手順は、直感的には、図３を列方向優先で読むことにより理解できる。
【００１４】
Ｋ＝４５のＰＩＬにおけるアドレステーブルを、図６に示す。このテーブルは、例えば並び替えの後、１番目に出力されるべきデータは並び替え前の４１番目のデータであることを示す（すなわちＡ（０）＝４０。インデックスが０から始まっていることに注意）。さらに、２番目に出力されるデータは並び替え前の３１番目のデータである。
【００１５】
次に、実際のインターリーブ処理について説明する。インターリーブ処理は、書き込みと読み出しの２つのフェーズにより完了される。
【００１６】
書き込みフェーズにおいては、カウンタ１は０から開始し１ずつ増加するアドレスを生成する。このアドレスを用いて入力シンボルをＲＡＭに書き込むことにより、データ列が入力された順序でＲＡＭに格納される。図５のタイミングチャートの時刻０〜３９は書き込みフェーズである。
【００１７】
全てのシンボルの書き込みが完了した後、読み出し動作を開始する。読み出しフェーズにおいては、先ずカウンタ２が昇順のカウント値を生成し、そのカウント値をアドレスとしてアドレステーブルが参照される。そして、アドレステーブルから出力されたデータ（Ａ（ｋ２））をアドレスとして、ＲＡＭから１シンボルを読み出す。このような動作をシンボル数繰り返すことにより、図５の信号r_dataが示すように、インターリーブされたデータ列を得ることができる。
【００１８】
このように、アドレステーブルに擬似ランダムアドレスパターンを予め設定することにより、任意のパターンでインターリーブを行うことができる。なお、メモリによるアドレステーブルを用いずに擬似ランダムアドレスパターンを生成することも可能である。ＰＩＬのためのアドレス生成回路の例として、特許文献１に記載されているものがある。
【００１９】
ところで、インターリーブされたデータ列を元の順序に戻す処理をデインターリーブという。デインターリーブは、図５に示したような逐次型インターリーバを用いても実現できる。すなわち、アドレステーブルにデインターリーブのパターンを設定すればよい。
【００２０】
デインターリーブを行うさらに簡単な方法は、逐次型インターリーバの書き込みアドレスと読み出しアドレスを入れ替えることである。例えば図７に示すような構成とすればよい。この方法により、新たなパターンを用意することなく、わずかな回路の追加（w_addrとr_addrを入れ替えるスイッチ）のみでインターリーブ及びデインターリーブを行う回路を実現できる。
【００２１】
（インターリーバの並列化）
図４のインターリーバは、逐次型、すなわち１サイクルに１つのシンボルのみを書き込み又は読み出しするものであった。従って、Ｋシンボルのデータ列をインターリーブするためには、初めのシンボルを入力してから最後のシンボルが出力されるまでに、２Ｋ＋１サイクルの遅延が発生する。また逐次インターリーバのスループット（単位時間当たりの処理能力）は、約０．５シンボル／サイクルと低かった。
【００２２】
高速かつ低遅延なインターリーブ処理を実現するためには、インターリーバ回路を並列化することが有効である。ここでは、インターリーバ回路の並列化方法として、３つの方法を挙げる。
【００２３】
＜サブブロック分割方式＞
インターリーバを並列化する一つの方法は、図９に示すように入力データ列を部分データ列（サブブロック）に分割することである。各サブブロックは、インターリーバに並列に入力される。
【００２４】
たとえば、図９では、Ｋ＝４５で、サブブロック数２の場合を示している。この例においては、初めのサイクルにおいてデータｄ［０］とｄ［２３］が並列インターリーバ１に同時に入力され、次のサイクルにおいてｄ［１］とｄ［２４］が同時に入力される。また、読み出しフェーズにおいては、ｄ［４０］とｄ［２］が同時に出力される。このようにして、図８に示す逐次インターリーバに比べ、２倍のスループット及び半分の遅延時間でインターリーブ処理を完了することができる。
【００２５】
並列インターリーバ１を用いて構成したターボデコーダを、図１３に示す。この並列ターボデコーダは、ＳＩＳＯ（Soft-In Soft-Out）デコーダを２つ備えることにより、図１２に示す逐次型のターボデコーダに比べ２倍のスループットを実現することができる。このような、サブブロック分割を利用した並列ターボデコーダについては、例えば非特許文献２に記載されている。
【００２６】
＜シリアル/パラレル変換方式＞
図１０に、別の並列インターリーバを示す。この方法は、シリアル−パラレル変換器（図中Ｓ／Ｐ）により、連続したデータ（たとえばｄ［０］とｄ［１］）を並列インターリーバ２に同時に入力する。読み出しフェーズにおいては、同時に出力されるデータの組はパラレル−シリアル変換器（図中Ｐ／Ｓ）により連続したデータ列に戻される。
【００２７】
並列インターリーバ２を用いて構成したターボデコーダは、図１４のようになる。このタイプの並列インターリーバにおいては、同時に入力されるデータはデータ列上で連続したデータであるから、別のＳＩＳＯデコーダで並列に処理することができない。従って、複数シンボルを同時に入力できる高速なＳＩＳＯデコーダが必要となる。このようなＳＩＳＯデコーダとして、例えば非特許文献３に記載されているようなｒａｄｉｘ−４と呼ばれる方式のものが知られている。
【００２８】
＜ハイブリッド方式＞
サブブロック分割方式とシリアル−パラレル変換方式（ｒａｄｉｘ−４）を併用することも可能である。
【００２９】
ｒａｄｉｘ−４によるターボデコーダは２並列のサブブロック分割方式に比べ、小さな回路規模で同等のスループットが得られる。しかし、さらにスループットを高める（例えばｒａｄｉｘ−８以上を採用）ことは、クリティカルパス及びターボ符号の拘束長の制約があり困難である。
【００３０】
そこで、任意の並列度でサブブロック分割した後に、それぞれのサブブロックをｒａｄｉｘ−４で処理する方法が考えられる。サブブロック数を２としてｒａｄｉｘ−４を適用するターボデコーダ（図１５）に合わせて設計された、図１１に示す並列インターリーバ３は、並列度が４（＝２×２）となる。
【００３１】
ところで、上述したインターリーバの並列化における課題は、複数のデータを同時にメモリに書き込む(読み出す)必要があることである。以下に、従来知られている解決策（実現例）を列挙する。
【００３２】
（並列化の実現例１）
最も単純な解決策は、マルチポートＲＡＭを用いることである。マルチポートＲＡＭは、同時に複数のアドレスを処理することができ、同時に複数のデータを書き込む（読み出す）ことのできるＲＡＭである。図１６に、デュアルポートＲＡＭ（同時に２つのアクセスが可能なＲＡＭ）を用いた並列インターリーバを示す。なお、図１６において、サブブロック分割型の場合にはｏｆｆｓｅｔ値をサブブロックサイズに、シリアル−パラレル変換型の場合にはｏｆｆｓｅｔ値を１に設定すればよい。
【００３３】
（並列化の実現例２）
別の解決策は、ＲＡＭを複数のバンク（モジュール）に分割することである。別のバンクであれば独立にアクセスすることができるので、最大でメモリバンク数と同数のアクセスを同時に行うことができる。
【００３４】
しかしながら、インターリーブパターンやサブブロックの分割方法によっては、ある１つのバンクに同時に２つ以上のアクセスが発生してしまうことがある（以下これをメモリアクセス競合と呼ぶ）。従って、メモリアクセス競合が発生した場合にはそのサイクルには１つだけの書き込みを行い、他のデータはバッファに保存し次のサイクル以降に改めて書き込みを行うような調停回路が必要となる。
【００３５】
メモリアクセス競合を調停回路により回避する方法について、例を用いて説明する。シンボル数Ｋ＝４５として、サブブロックをＫ０＝２３とＫ１＝２２のようにほぼ均等に分割した場合のデインターリーブ処理について考える。調停回路付きの並列デインターリーバの構成例を、図１７に示す。
【００３６】
サブブロック０として出力されるデータはＲＡＭ０に、サブブロック１として出力されるデータはＲＡＭ１に書き込まれる必要がある。従って、デインターリーブ後のインデックスが０〜２２のデータはＲＡＭ０に、インデックスが２３〜４４のデータはＲＡＭ１に書き込まれる。
【００３７】
書き込みフェーズの初めのサイクルにおいては、２つのサブブロックの先頭のデータであるｄ［０］とｄ［２３］が入力される。アドレステーブル０よりＡ（０）＝４０、アドレステーブル１よりＡ（２３）＝０のようにアドレスが求まるから、データｄ［０］をＲＡＭ１へ、データｄ［２３］をＲＡＭ０へ書き込めば良いことがわかる。従って、調停回
路は信号in_data0の値をw_data1へ、in_data1の値をw_data0へ入力するように接続する。またアドレステーブル１の出力をw_addr0へ、アドレステーブル０の出力から２３を減じた値をw_addr1へ入力する。
【００３８】
次のサイクルには、データｄ［１］とデータｄ［２４］が入力される。Ａ（１）＝３０、Ａ（２４）＝３９であるから、いずれのデータもＲＡＭ１へ書き込む必要がある。そこで、データｄ［１］をＲＡＭ１のアドレス７へ書き込む一方、データｄ［２４］はバッファ（例えばＦＩＦＯ）に保存し、次のサイクル以降に書き込む。
【００３９】
さらに次のサイクルには、データｄ［２］とデータｄ［２５］が入力される。このサイクルにおいては、データｄ［２］をＲＡＭ０のアドレス２０に書き込むと共に、バッファからデータｄ［２４］を取り出しＲＡＭ１のアドレス１６に書き込む。ＲＡＭ１への書き込みは同時に１つしか行えないため、今度はデータｄ［２５］をバッファに保存する。
【００４０】
以上のように、調停回路を用いることでマルチポートメモリを使うことなく並列インターリーバ回路が実現可能となる。この方法はまた、ＲＡＭの総容量を増やさなくてよいという利点がある。
【００４１】
しかしながら、インターリーブパターンのランダム性が高いほど、調停回路に必要なバッファの容量が増大してしまう。
【００４２】
このようなＲＡＭを複数のバンク（モジュール）に分割した場合の別の構成例を、図１８に示す。
【００４３】
図１８のインターリーバ（デインターリーバ）では、１つの出力サブブロックは１つのＲＡＭバンクと対応付けられる。例えば、出力サブブロック０に属するデータはＲＡＭ０に書き込まれる。例えばＫ＝４０のときのメモリへの書き込み方法は、図１９に示す通りである。このように書き込みを行った後、それぞれのＲＡＭの内容をアドレス順に読み出すことで、４つのサブブロックを並列に出力することができる。
【００４４】
ところで、入力データはサブブロック分割されているため、書き込みも並列に行う必要がある。たとえば、第０サイクルにはデータｄ［０］，ｄ［１０］，ｄ［２０］，ｄ［３０］を同時に書き込む必要がある。このとき、３つのデータｄ［１０］，ｄ［２０］，ｄ［３０］はいずれもＲＡＭ１に書き込まなければならない。しかし、ＲＡＭ１はシングルポートメモリであるから、いずれか１つしか書き込むことができない。そこで、第０サイクルにおいてはデータｄ［１０］のみをＲＡＭ１に書き込み、データｄ［１０］とデータｄ［２０］はバッファ（ＦＩＦＯ）に格納しておき、次のサイクル以降に１つずつＲＡＭ１に書き込む。このような調停及びバッファリングを行う回路が、図中のＦＩＦＯ／アービタ部である。
【００４５】
図１８の構成のように、メモリをサブブロック数と同数のメモリバンクＲＡＭ０〜４に分割することで並列インターリーバを実現することができる。このような構成は、例えば特許文献２に記載されている。
【００４６】
さらに、バンク割り当て（データの書き込み位置）を工夫してメモリアクセス競合を回避するようにした例として、図２０に示すような構成のものがある。図２０のインターリーバでは、データの書き込み位置はバンク選択部の関数Ｍで決定される。入力データｄ［ｉ］（ｉ＝０〜Ｋ−１）は、バンクＭ（ｉ）に書き込まれる。サブブロックサイズをＫｓとしたとき、データｄ［ｉ］，ｄ［ｉ＋Ｋｓ］，ｄ［ｉ＋２Ｋｓ］，…が同時に書き込まれるから、アクセス競合が発生しないためには、Ｍ（ｉ）≠Ｍ（ｉ＋Ｋｓ）≠Ｍ（ｉ＋２
Ｋｓ）≠・・・、である必要がある。また、インターリーブパターンをπとしたとき、出力データｄ［π（ｉ）］，ｄ［π（ｉ＋Ｋｓ）］，ｄ［π（ｉ＋２Ｋｓ）］，…は同時に読み出される。従って、読み出し時にもアクセス競合が発生しないためには、Ｍ（π（ｉ））≠Ｍ（π（ｉ＋Ｋｓ））≠Ｍ（π（ｉ＋２Ｋｓ））≠・・・、を満たす必要がある。このような関数Ｍを見つけることにより、図２０のような回路によって並列インターリーブを実現することができる。
【００４７】
非特許文献４では、任意のインターリーブパターンπに対する関数Ｍの設計方法が示されている。
【００４８】
また図２０と同様の回路構成にて、インターリーブを行う技術が、特許文献３に記載されている。特許文献３において、Ｍ関数は簡単な関数（たとえば、整数除算など）となる。特許文献３では、Ｍ（π（ｉ）），Ｍ（π（ｉ＋Ｋｓ）），Ｍ（π（ｉ＋２Ｋｓ）），…が固定的な関係となるようにＭ関数及びインターリーブパターンπを選ぶことが提案されている。例えば、Ｍ（π（ｉ＋Ｋｓ））−Ｍ（π（ｉ））＝Ｍ（π（ｉ＋２Ｋｓ））−Ｍ（π（ｉ＋Ｋｓ））＝・・・＝定数値、となるようなＭ関数の例とインターリーブパターンπが示されている。このとき、上記定数値とバンク数の関係によっては（例えば定数値とバンク数が互いに素）、メモリアクセス競合が発生しないことを保証できる。特許文献３には上記関係を常に満たすインターリーブパターンπの設計方法が開示されているので、図２０の回路でメモリアクセス競合を起こさず並列処理可能なインターリーブパターンπを設計することが可能となる。
【特許文献１】特許第３３９９９０４号
【特許文献２】特開２００４−１０４７７６号公報
【特許文献３】米国特許第６，７７５，８００号
【非特許文献１】3GPP TS25.212 v5.4.0 “Multiplexing and channel coding (FDD), Release5” 4.2.3.2.3節 Turbo code internal interleaver
【非特許文献２】Giulietti, A.; Bougard, B.; Derudder, V.; Dupont, S.; Weijers, J.-W.; Van der Perre, L.; “A 80 Mb/s low-power scalable turbo codec core”, Custom Integrated Circuits Conference, 2002. Proceedings of the IEEE 2002, pp. 389-392
【非特許文献３】Charles Thomas, Mark A. Bickerstaff, Linda M. Davis, Thomas Prokop, Ben Widdup, Gongyu Zhou, David Garrett, Chris Nicol; “Integrated Circuits for Channel Coding in 3G Cellular Mobile Wireless Systems”, IEEE Communications Magazine August 2003, pp.150-159
【非特許文献４】Tarable, A.; Benedetto, S.; “Mapping interleaving laws to parallel turbo decoder architectures”, Communications Letters, IEEE, Volume: 8, Issue: 3, March 2004, Pages:162 - 164
【発明の開示】
【発明が解決しようとする課題】
【００４９】
しかしながら、マルチポートＲＡＭは回路規模が大きく、使用されることが少ない。ＦＰＧＡ(Field Programmable Gate Array)においては、デュアルポートＲＡＭを備えているものも多いため、２並列のインターリーバを実現することは可能であるが、さらに高い並列度のインターリーバを実現することは困難である。
【００５０】
また特許文献２に記載されているような方法では、調停の機能が複雑である欠点がある。サブブロック数（並列度）が増えることにより、調停の機能はさらに複雑となり、回路規模の増大を招く。またＦＩＦＯ長が長くなる欠点がある。長いＦＩＦＯを必要とすることにより、回路規模が増大し、遅延時間が長くなってしまう。
【００５１】
さらに非特許文献４に示されたＭ関数の設計方法では、Ｍ関数は単純な式で表すことができないため、実装するにあたってはテーブル引きが必要となる。従って、比較的大きなメモリを追加する必要があり、インターリーバの回路規模を増大させてしまう。また、インターリーブパターンが変わるごとにＭ関数を変更する必要があるが、リアルタイムでＭ関数を導くことは実際上困難と考えられる。従って、３ＧＰＰ規格のｔｕｒｂｏ  ｃｏｄｉｎｇ  ｉｎｔｅｒｎａｌ  ｉｎｔｅｒｌｅａｖｅｒのようにデータ長が変わるごとにインターリーブパターンが変わる場合には対応することが困難である。
【００５２】
また特許文献３では、ある与えられたπに対して上記の式を満たすＭを見つけることは困難である。またその方法にいては上記特許文献３では配慮されていなかった。特許文献３に記載された技術はあくまで上記の式を満たすπの設計方法、および特別なπに対して並列インターリーブを行う方法であるといえる。したがって、特許文献３に記載された技術を適用しても３ＧＰＰ規格に示されるｉｎｔｅｒｎａｌ  ｉｎｔｅｒｌｅａｖｅｒをメモリアクセス競合なしに並列化することは困難であるといった問題がある。
【００５３】
本発明の目的は、比較的簡易な構成で、インターリーブパターンの変更にも柔軟に対応でき、かつメモリアクセス競合も回避し得る並列インターリーバ、並列デインターリーバ及びインターリーブ方法を提供することである。
【課題を解決するための手段】
【００５４】
本発明の並列インターリーバは、複数のメモリバンクからなるメモリに入力データを書き込み、書き込まれたデータを書き込みと異なる順序で読み出すことにより、２次元配列型のデータ構造に対して行方向優先でデータを書き込み、各行ごとに規定される行内並び替えパターンに基づき行内並び替えを行い、行同士を並び替え、列方向優先でデータを読み出すインターリーブアルゴリズムを実現する並列インターリーバであって、複数のメモリバンクからなり、各バンクが前記２次元配列の１または複数の行番号と対応付けられているメモリと、それぞれ前記２次元配列のデータ構造における別の行において規定される複数の行内並び替えパターンを生成するパターン生成手段と、前記パターン生成手段を内部に持ち、前記複数の行内並び替えパターンに基づき複数の読み出しアドレスを生成する読み出し制御手段と、を具備し、前記メモリから複数のデータを同時に読み出す構成を採る。
【発明の効果】
【００５５】
本発明によれば、どのような行内および行間並び替えパターンを採用したとしても、同一のメモリバンクに２つ以上の読み出しアドレスが生成されることがなくなる。つまり、どのようなインターリーブパターンを採用したとしても、メモリバンクへのメモリアクセス競合を回避できるようになる。この結果、比較的簡易な構成で、インターリーブパターンの変更にも柔軟に対応でき、かつメモリアクセス競合も回避し得る並列インターリーバ、並列デインターリーバ及びインターリーブ方法を実現できる。
【発明を実施するための最良の形態】
【００５６】
以下、本発明の実施の形態について図面を参照して詳細に説明する。
【００５７】
（実施の形態１）
図２１に、本発明の実施の形態１に係るインターリーバの構成を示す。インターリーバ１００は、メモリアクセス競合を起こすことなくＰＩＬ（プライムインターリーブ）を並列に実行可能とするものである。本実施の形態では、説明を簡単化するために、インターリーバの行数Ｒ＝５のみに対応する回路を示し、基本構成について説明する。
【００５８】
インターリーバ１００は、サブブロック分割により５並列でインターリーブを行う回路である。先ず、簡単のためプルーニングが発生しない（データ長Ｋ＝ＲＣ）場合について説明する。
【００５９】
インターリーバ１００は、大きく分けて、入力側スイッチ１０１と、独立に書き込み及び読み出しが可能な複数のバンク（ＲＡＭ０〜ＲＡＭ４）からなるメモリ１０２と、出力側スイッチ１０３と、行カウンタ１０５及び列カウンタ１０６からなる書き込みアドレス生成部１０４と、行数算出部１０７と、列数算出部１０８と、出力サブブロックサイズ算出部１０９と、出力サブブロックカウンタ１１０と、ルックアップテーブルＬＵＴ０〜ＬＵＴ４からなるアドレステーブル１１１と、ルックアップテーブル（ＬＵＴ）設定部１１
２と、行／列番号分離回路１１３と、アドレススイッチ１１４と、有効検出部１１５とを有する。
【００６０】
行数算出部１０７、列数算出部１０８は３ＧＰＰ規格に従い、シンボル数Ｋに基づき行数Ｒ及び列数Ｃを決定する。
【００６１】
入力データdata_in0〜data_in４は、前段の処理ブロック(例えばデレートマッチング処理、ＳＩＳＯ(Soft-In Soft-Out)デコード処理など)により、サブブロックに分割されて入力されるものとする。ここでは、入力サブブロック０(data_in0に対応)から入力サブブロック３のサイズは全て等しいとする。これをＫsinと表記する。本発明のインターリーバ回路で書き込み時に競合が起きないためには、入力サブブロックサイズＫsinは列数Ｃ以上である必要がある。
【００６２】
入力サブブロックサイズＫsinは、外部より与えられる。インターリーバ１００は、与えられた入力サブブロックサイズＫsinに基づき、書き込みアドレス生成部１０４の列カウンタ１０６及び行カウンタ１０５の初期値を設定する。初期値の設定方法は、書き込み動作とあわせて説明する。
【００６３】
出力サブブロックサイズ算出部１０９は、シンボル数Ｋと行数Ｒから出力サブブロックサイズＫsout’を決定する。図２１の基本回路のように、ＲＡＭ数Ｍｒと行数Ｒと出力サブブロック数Ｍoutが等しい場合には、出力サブブロックサイズＫsoutは行数Ｒと互いに素（最大公約数が１）となるように定める。もちろん、出力サブブロックサイズＫsoutは、Ｍｓをサブブロック数とすると、Ｋsout×Ｍｓ≧ＲＣである必要がある（ここで、Ｋ＝ＲＣ。右辺をＫと書かない理由は、プルーニングありの場合にも対応するためである）。
【００６４】
出力サブブロックサイズＫsoutを定めるひとつの方法は、Ｋsout＝Ｃ，Ｃ＋１，Ｃ＋２，………のように順にＲと互いに素である値を探すことである。
【００６５】
別の方法は、次式で定めることである。
【００６６】
Ｋsout＝ｃｅｉｌｉｎｇ（（Ｃ−ｆｌｏｏｒ（Ｒｏ×Ｍｓ／Ｒ））／Ｍｓ）×Ｒ＋Ｒｏ
………（１）ただし、ｃｅｉｌｉｎｇ（）：  無限大方向への丸め（切り上げ処理）
ｆｌｏｏｒ（）：  ゼロ方向への丸め（切り捨て）処理
Ｒｏ：  Ｒと互いに素な定数（例えば１）
Ｍｓ：  サブブロック数
を示す。
【００６７】
出力サブブロックサイズＫsout’が決定した後、ルックアップテーブル（ＬＵＴ）設定部１１２はアドレステーブル１１１の５つのルックアップテーブルＬＵＴ０〜ＬＵＴ４の設定を行う。５つのＬＵＴ０〜ＬＵＴ４はそれぞれ５つのサブブロックに対応する。このＬＵＴ０〜ＬＵＴ４は、カウンタ値cnt_rをアドレスとして入力すると、バンク番号ｂとアドレス（メモリバンク内の物理アドレス）ａを出力するよう設定される。ここで、バンク番号ｂはインターリーブ手順における行間並び替え後の行番号に、アドレスａは同じく列番号に対応する。バンク番号ｂ及びアドレスａとインターリーブアドレスＡ（ｋ２）との関係は、次式のようになる。
【００６８】
ｂ［ｍ］＝ｆｌｏｏｒ｛Ａ（ｃｎｔ＿ｒ＋ｍ×Ｃ）／Ｃ｝
ａ［ｍ］＝Ａ（ｃｎｔ＿ｒ＋ｍ×Ｃ） ｍｏｄ Ｃ                    ………（２）
ただし、ｍ＝０，１，…，Ｍout−１、
ｆｌｏｏｒ：  ０方向への丸め（切捨て）処理
ｍｏｄ：  剰余演算
を示す。
【００６９】
作成されたアドレステーブル１１１（ルックアップテーブルＬＵＴ０〜ＬＵＴ４）の例を、図２２に示す。ここでは、参考のためｋ２及びＡ（ｋ２）を併記しているが、実際にＬＵＴ０〜ＬＵＴ４に保存される値はバンク番号ｂとアドレスａのみである。またこの例はデータ長Ｋ＝４０、出力サブブロックサイズＫsout＝８の場合を表している。例えば、インターリーブ後のインデックスが１８であるデータ（インターリーブ前のインデックスは１４）は、ＬＵＴ２のcnt_r＝２のエントリを参照すると、ＲＡＭ１のアドレス６に書き込まれることが分かる。
【００７０】
以上の初期設定が完了した後、書き込みフェーズ及び読み出しフェーズにより並列インターリーブが実行される。
【００７１】
本実施の形態においては、入力データdata_in0〜data_in４はＣずつ区切られ別のバンク（ＲＡＭ０〜ＲＡＭ４）に書き込まれる。例えば図２１の基本回路においては、ｎ番目の入力シンボルは、ｆｌｏｏｒ（ｎ／Ｃ）番のバンクに書き込まれる。またそのときの物理アドレス（該当するバンクに入力される読み出しアドレス）は、ｎ  ｍｏｄ  Ｃ  （ｍｏｄは剰余演算）である。
【００７２】
上記のような書き込み処理を実現するために、本実施の形態のインターリーバ１００では、行カウンタ１０５と列カウンタ１０６を用いる。行カウンタ１０５と列カウンタ１０６は、それぞれ内部に複数のカウンタを持つ。ここで、カウンタの値をｉ［ｋ］，ｊ［ｂ］とする。なおｋ＝０〜Ｍｓ−１（Ｍｓはサブブロック数）であり、ｂ＝０〜Ｍｒ−１（ＭｒはＲＡＭバンク数）である。
【００７３】
カウンタの初期値ｉ０［ｋ］，ｊ０［ｂ］は入力サブブロックサイズＫｓを用いて、次式のように決定する。
【００７４】
ｉ０［ｋ］＝ｆｌｏｏｒ（Ｋsin×ｋ／Ｃ）
ｊ０［ｉ０［ｋ］］＝（Ｋsin×ｋ）  ｍｏｄ  Ｃ
ｊ０［ｂ］＝Ｃ（ｂ＝ｉ０［ｋ］なるｋが存在しないとき）          ………（３）
【００７５】
書き込みフェーズにおいては、列カウンタｊ［ｋ］は初期値から毎サイクル１ずつ増加し、列数Ｃまでカウントする。列数Ｃに達すると、列カウンタｊ［ｋ］は停止するが、対応する行カウンタｉ［ｋ］をインクリメントすると共に、カウンタｊ［ｉ［ｋ］］をリセットする。
【００７６】
以上の処理を、例を用いて説明する。ここでサブブロックサイズＫｓがＣより大きいとする。書き込み開始時において、ｉ［０］＝０，ｊ［０］＝０であるから、サブブロック０の入力（data_in0）はＲＡＭ０のアドレス０に書き込まれる。以後、Ｃ−１サイクルにわたり、ＲＡＭ０のアドレス０〜Ｃ−１にサブブロック０のデータが書き込まれる。
【００７７】
このとき、ｊ［０］＝Ｃ−１となるので、次のサイクルにおいて、ｉ［０］がインクリメントされｉ［０］＝１になり、カウンタｊ［ｉ［０］］はリセットされ、動作を開始する。すなわち、ｊ［１］＝０となる。従って、この時点においてサブブロック０のＣ番目のデータはＲＡＭ１のアドレス０に書き込まれる。図２３に、全てのデータを書き込んだ後のＲＡＭ０〜ＲＡＭ４内のデータ配置を示す。
【００７８】
読み出しフェーズにおいては、出力サブブロックカウンタ１１０が０から出力サブブロックサイズＫsout−１までカウントアップを行い、カウンタ値cnt_rをＬＵＴ０〜ＬＵＴ４へアドレスとして入力する。ＬＵＴ０〜ＬＵＴ４はその時点で読み出すべきデータのバンク番号とアドレスを出力する。例えば、図２２の例ではカウンタ値cnt_r＝０のときにＬＵＴ０はｂ０＝４，ａ０＝７を出力する。これは、サブブロック０の先頭のデータ（ｄ［３９］）を出力するためにはバンク４のアドレス７を読み出せば良いということを示している。
【００７９】
ＬＵＴ０〜ＬＵＴ４からの５つの出力は、それぞれ行／列番号分離回路１１３に入力され、行番号ｂと列番号ａに分離される。
【００８０】
列番号ａ０〜ａ４はアドレススイッチ１１４に入力され、行番号ｂ０〜ｂ４の指定するメモリバンク（ＲＡＭ０〜ＲＡＭ４）へ分配される。例えば、前記の例では、ＬＵＴ０の出力ａ０＝７というアドレスは、ｂ０＝４より、ＲＡＭ４に転送される。ＬＵＴ１の出力ａ１＝３は、ｂ１＝１よりＲＡＭ１に転送される。このように、行番号ｂ０〜ｂ４がアドレススイッチ１１４を操作し、列番号ａ０〜ａ４を適切なＲＡＭモジュールへ転送する。
【００８１】
行番号ｂ０〜ｂ４はさらに、出力側スイッチ１０３を操作し、ＲＡＭ０〜ＲＡＭ４の出力を適切なサブブロック出力信号data_out0〜data_out4へ分配する。例えば、前記の例では、ＬＵＴ０の出力ｂ０＝４であることから、data_out0に出力されるべきデータはＲＡＭ４から出力されることが分かる。従って、出力側スイッチ１０３は信号r_data4を信号data_out0と接続する。
【００８２】
以上のようにして、５サブブロック分割による並列インターリーブが実現できる。以上の動作を、図２４、図２５にタイミングチャートとして改めて示す。図２４は書き込みタイミングであり、図２５は読み出しタイミングである。
【００８３】
ところで、本実施の形態のインターリーバ１００でメモリ競合が発生しないための主たるポイントは、次の２つである。
【００８４】
（ｉ）インターリーブパターンを生成する２次元マトリックス上で、異なる行に対応するシンボルは異なるメモリバンクＲＡＭ０〜ＲＡＭ４に書き込むこと。
（ｉｉ）出力サブブロックサイズＫｓを行数Ｒと互いに素となるよう選択すること。
【００８５】
ここで、（ｉｉ）の条件は次のように換言することもできる。つまり、「同時に読み出す２つ以上のシンボルに関して、いずれの２つについても位置の間隔Ｓが行数Ｒと互いに素となるように同時に読み出すシンボルを選択する」ということができる。
【００８６】
この条件を使えば、シリアル-パラレル変換型の並列インターリーバにおいても、並列数がＲ以下であればメモリアクセス競合を発生させることなく並列読み出しが可能なインターリーバを設計できることが分かる。
【００８７】
次に、本実施の形態のインターリーバ１００によるプルーニング処理について説明する。
【００８８】
インターリーバ１００は、プルーニングが発生する場合（Ｋ＜ＲＣの場合）でもメモリアクセス競合を発生させずにインターリーブ処理を並列に実行可能となっている。
【００８９】
プルーニングに対応するための主なポイントは、以下の２つである。
（ｉ）プルーニング対象シンボル（無効アドレス）を含めてＬＵＴ０〜ＬＵＴ４を作成す
る。
（ｉｉ）無効アドレスに対応する部分では、そのサブブロックのみシンボルを出力しない。
【００９０】
以下、Ｋ＝４５の場合を例に説明する。
【００９１】
行数算出部１０８及び列数算出部１０７は３ＧＰＰ規格に従い、行数Ｒ＝５、列数Ｃ＝１０を求める。
【００９２】
入力サブブロックサイズに対する要件は、プルーニングが発生しない場合と同様である。ただし、本例のように、バンク数Ｍｒとサブブロック数Ｍｓが等しい場合、Ｋsin≧Ｃの条件より、最終サブブロックは常にＣより短くなる（Ｋsinは最終以外のサブブロックサイズである）。逆に、全てのサブブロックが等しいサイズとなるようにサブブロック分割すると、必ず書き込み時に競合が起こってしまう。
【００９３】
出力サブブロックサイズ算出部１０９は、出力サブブロックのサイズＫsoutを、行数Ｒと互いに素になるように定める。また全てのサブブロックサイズの合計が、インターリーブパターンを生成する配列のサイズより大きくなるようにする。すなわち、サブブロック数をＭｓとしたとき、Ｋsout×Ｍｓ≧ＲＣとなるように出力サブブロックサイズＫsoutを定める。Ｋ＝４５の場合、これらの条件を満たす最小の出力サブブロックサイズＫsoutとして、１１を選択する。
【００９４】
ルックアップテーブル（ＬＵＴ）設定部１１２は、データ長Ｋ及び出力サブブロックサイズＫsoutの値から、全てのＬＵＴ０〜ＬＵＴ４を設定する。ここでは、プルーニングされるシンボルのアドレス（無効アドレス）を含めてアドレスパターンを設定する。図２６にＫ＝４５の場合のＬＵＴ０〜ＬＵＴ４の内容を示す。例えばＬＵＴ２のカウンタ値cnt_r＝３は、Ａ（ｋ２）＝４９に対応するため、無効アドレスの１つである。
【００９５】
無効アドレスの場合、ＲＡＭ０〜ＲＡＭへアドレスを送らないようにアドレススイッチ１１４を制御することでプルーニングを実現できる。ここで、図２７に示すように無効アドレスに対応する場所はバンク番号ｂの値を特別な値に書き替えておくことによって、アドレススイッチ１１４の制御を簡単にすることができる。またＬＵＴの空いた部分にも無効を示す値を設定しておく。
【００９６】
以上の初期設定が完了した後、書き込みフェーズ及び読み出しフェーズにより並列インターリーブが実行される。
【００９７】
書き込みフェーズの動作はプルーニングが発生しない場合と同様である。タイミングチャートを図２８に示す。
【００９８】
読み出しフェーズにおいては、ＬＵＴ０〜ＬＵＴ４から無効アドレスを示すデータ（ｂ＝６，ａ＝０）が出力されたときのみ異なる動作を行う。このことをタイミングチャート図２９を用いて説明する。時刻９において、ＬＵＴ０〜ＬＵＴ４の出力ｂ０〜ｂ３はバンク番号を示す３，２，１，０という値を取るが、ｂ４は無効アドレスを示す６という値を取る。これに対し、アドレススイッチ１１４はＲＡＭ０〜３に対しては有効なアドレスａ０〜３を送り、ＲＡＭ４に対しては任意のアドレス（例えば０）を送るか、ＲＡＭ４の読み出しを無効にする。そして、有効検出部１１５はサブブロック４の出力が無効であることを信号valid[4:0]を通じて外部（たとえばＳＩＳＯデコーダ）に通知する。
【００９９】
以上の繰り返しにより、図２９のdata_out0〜4が示すとおりインターリーブ処理を完了することができる。ここで、各出力サブブロックのサイズを、図３０に示す。プルーニン
グが発生しない場合、出力サブブロックサイズは最終ブロックを除きすべてＫsoutと一致したが、プルーニングが発生する場合にはＫsoutより短くなる場合がある。
【０１００】
（実施の形態２）
実施の形態１では、競合を起こさず並列インターリーブを可能とする基本原理を示した。本実施の形態では、さらに、（１）書き込み処理の簡略化、（２）読み出し処理の簡略化、（３）サブブロックサイズ決定方法の変更、（４）少ないサブブロックへの対応を可能とする構成及び方法を提案する。
【０１０１】
図３１に、本実施の形態のインターリーバの構成を示す。図３１のインターリーバ２００は、上記（１）〜（３）を可能とする回路構成となっている。またインターリーバ２００は、実施の形態１のインターリーバ１００と比較して、回路構成が簡単化されている。
【０１０２】
インターリーバ２００は、大きく分けて、独立に書き込み及び読み出しが可能な複数のメモリバンク（ＲＡＭ０〜ＲＡＭ４）からなるメモリ２０１と、出力側スイッチ２０２と、列カウンタ２０４からなる書き込みアドレス生成部２０３と、列数算出部２０５と、行数算出部２０６と、サブブロックサイズ決定部２０７と、読み出しアドレス生成部２１０と、バンク選択信号生成部２２０と、無効判定部２３とを有する。
【０１０３】
（１）書き込み処理の簡略化
入力サブブロックサイズをＣと定めることで、入力側スイッチ及び行カウンタを不要とし、書き込みアドレス生成部２０３の列カウンタ２０４を簡略化できる。すなわち、入力サブブロックサイズＫsin＝Ｃである場合、サブブロック［ｋ］のデータは全てメモリ２０１のＲＡＭ［ｋ］に書き込まれる。従って、data_in[k]をw_data[k]に直接接続することで、入力側スイッチと、スイッチを制御する行カウンタが不要となる。また各時点で全てのデータを同じアドレスに書き込むため、列カウンタ２０４は１つでよい（常にｉ［ｋ］＝ｋ、ｊ［０］＝ｊ［１］＝…＝ｊ［ｋ−１］であると見ることもできる）。
【０１０４】
（２）読み出し処理の簡略化
実施の形態１で示した図２１の読み出し制御では、各サブブロックが読み出すべきデータのバンク番号とアドレスをＬＵＴ０〜ＬＵＴ４で求め、アドレススイッチ１１４を用い該当するバンクにそのアドレスを送ることで読み出しを実現した。ここで、ＬＵＴ０〜ＬＵＴ４内のデータを予め並べ替えておくことで、アドレススイッチを不要とすることができる。具体的には、ＬＵＴ０にはＲＡＭ０に送るべきアドレスを、ＬＵＴ［ｂ］にはＲＡＭ［ｂ］に送るべきアドレスを格納しておく。このテーブルは、行内並び替えパターンＵ［ｉ］（ｊ）を並び替えたものである。たとえば、ＬＵＴ０は、エントリ０から順に、Ｕ［０］（０）、Ｕ［０］（ｖ）、Ｕ［０］（２ｖ）、・・・、Ｕ［０］（ｔｖ  ｍｏｄ  Ｋsout）、のように格納されている。ここで、ｖ＝Ｍｓ×Ｒ／Ｍｒである。ＬＵＴ［ｋ］のｔ番目のエントリは、ＬＵＴ［ｋ］（ｔ）＝Ｕ［ｋ］（（ｔｖ＋ｊ０［ｋ］）  ｍｏｄ
Ｋsout）である。ここで、ｊ０［ｋ］＝ｆｌｏｏｒ（Ｋsout×ｋ／ｖ）である。
【０１０５】
以上のようにして、アドレススイッチを不要とし、バンク選択番号をＬＵＴ内に格納する必要が無くなるため、ＬＵＴの容量を削減することができる。３ＧＰＰのｔｕｒｂｏ  ｉｎｔｅｒｎａｌ  ｉｎｔｅｒｌｅａｖｅｒの場合、ＬＵＴは１ワードあたり１３ビットから８ビットに削減することができる。Ｋ＝４５の場合のＬＵＴ０〜ＬＵＴ４の内容を、図３３に示す。
【０１０６】
しかしながら、バンク番号は出力側スイッチ２０２の操作のために別途必要となる。また、無効アドレスを示す特別なバンク番号をＬＵＴ０〜ＬＵＴ４に格納しないために別の方法で有効判定を行う必要がある。
【０１０７】
まず、バンク番号を求める回路構成、すなわちバンク選択信号生成部２２０について説明する。時刻ｔにおけるバンク選択信号ｂ［ｋ］（ｔ）は、ｂ［ｋ］（ｔ）＝Ｔ［（ｔ＋ｋ×Ｋsout）  ｍｏｄ  Ｒ］である。ここで、ｉ＝ｔ  ｍｏｄ  Ｒ、Ｒｏ＝Ｋsout  ｍｏｄ  Ｒと書くと、ｂ［ｋ］（ｔ）＝Ｔ［（ｉ＋ｋ×Ｒｏ）  ｍｏｄ  Ｒ］となる。
【０１０８】
以上から、ｉ＝０〜Ｒ−１までカウントする行カウンタ２２３と、行オフセットＲｏ＝Ｋsout  ｍｏｄ  Ｒを求める行オフセット算出部２２２と、ＲエントリのＬＵＴ２２１（Ｔ−ＬＵＴ）と、Ｒを法とする加算器（加算の後、Ｒの剰余を求める）２２４とを設けることで、バンク番号を生成する回路（すなわちバンク選択信号生成部２２０）を構成することができる。
【０１０９】
次に、有効判定を行う回路（無効判定部２３０）の例を示す。ここでは、ＲＡＭ４へのアクセスが有効かどうかを調べ、無効である場合、無効となるサブブロックの番号を出力する回路を示す。インターリーブ方式によるが、プルーニングは一般に後半のバンクで発生する。従って、プルーニングが発生するバンクごとに無効判定回路を用意すればよい。例えば、ＰＩＬでは行１７以降でプルーニングが発生しうる。従って、ＲＡＭ１７，１８，１９それぞれについて判定を行う３つの無効判定回路が必要となる。
【０１１０】
具体的な無効判定部２３０の回路構成について、図３２を用いて説明する。無効判定部２３０は、比較部２３１と、エンコーダ２３２と、大小比較器２３３とを有する。比較部２３１を構成する５つの比較器０〜比較器４は、Ｔ−ＬＵＴの出力と、調べるバンク番号（ここでは４）とを比較する。これは、ＲＡＭ４の出力がどのサブブロックに出力されるかを調べることに相当する。各比較器０〜４は、Ｔ−ＬＵＴの出力と、調べるバンク番号とが一致すると、１を出力する。この出力１がエンコーダ２３２に入力されると、エンコーダ２３２はバンク番号に変換する。
【０１１１】
同時に、大小比較器２３３はr_addr4とＫ  ｍｏｄ  Ｃを比較する。r_addr4のほうが大きいか、一致する場合にはＲＡＭ４の出力は無効である。従って、大小比較器２３３はこのような場合、セレクタを操作し、エンコーダの出力を信号invalid_blkに接続し、該当するサブブロックが無効であることを示す。大小比較の結果、r_addr4の出力が有効であるときは、invalid_blkにはいずれのバンク番号も出力しない。例えば、−１などの値を出力するようにしておく。
【０１１２】
以上のように、サブブロックの出力が有効かどうかを判定する方法として２つ示した。一つは実施の形態１の図２１で示したように、ＬＵＴに無効アドレスを示すデータを予めセットしておく方法で、もう一つは本実施の形態の図３１で示したように、バンク選択信号と読み出しアドレスから判定する回路（無効判定部２３０）を用いることである。
【０１１３】
実際上、上述したような無効判定は非常に重要となる。例えば従来の並列インターリーバでは、一般に、無効アドレスは取り除いてアドレステーブルを作成するようにしていた。しかし、実施の形態では、あえて無効アドレスを残しておくことでメモリアクセス競合が発生しないことを保証できるようにした。そのため、実施の形態では無効判定回路を設けるようになっている。このように、本実施の形態の一つの特徴は、並列インターリーバで無効判定を行うようにしたことである。これにより、並列インターリーバにおいて無効なサブブロックまで特定することができる。
【０１１４】
（３）サブブロックサイズ決定方法の変更
図３１のサブブロックサイズ決定部２０７では、Ｋsout＝ｃｅｉｌｉｎｇ（（Ｃ−ｆｌｏｏｒ（Ｒｏ×Ｍｓ／Ｒ））／Ｍｓ）×Ｒ＋Ｒｏ、に基づいてサブブロックサイズを決定
する。ここで、行オフセットを例えばＲｏ＝１と固定しておくことで、回路構成を簡単化できる。
【０１１５】
次に、図３４及び図３５を用いて、インターリーバ２００の動作タイミングを説明する。なお図３４は書き込みタイミングを示し、図３５は読み出しタイミングを示す。ここでは、Ｋ＝４５、Ｍｓ＝５、Ｍｒ＝５、Ｒ＝５、Ｃ＝１０の場合を示した。
【０１１６】
タイミングチャートにおける特徴は、次の点である。
（ａ）書き込みにおいて、w_data[k]は全て等しい値であること、in_data[k]はw_data[k]と等しいことを確認できる。
（ｂ）読み出しにおいて、r_addr[k]は直接テーブルより求めることができる。r_addr4において、網掛け部分は、無効アドレス（プルーニング）に対応する部分である。そのため、data_outの一部に有効なデータが出力されない部分がある。このとき、信号invalid_blkが無効なサブブロックを示していることが分かる。
【０１１７】
なおバンク番号生成部の構成は、図３１に示したものに限らない。すなわち、行オフセット値は該当するサブブロックのＴ−ＬＵＴの読み出し開始位置のずれをあらわすので、Ｔ−ＬＵＴの内容を行オフセットにあわせてあらかじめずらしておけば、オフセットを加算する回路が不要となる。
【０１１８】
また、バンク選択信号はＲを周期として変化することから、Ｒ個のレジスタをリング状に接続した回路によっても生成することができる。Ｒｏによりレジスタ間の接続が変わるため、この構成はＲｏが固定である場合に用いるとよい。
【０１１９】
（４）少ないサブブロックへの対応
実施の形態１及び本実施の形態で説明したインターリーバは、サブブロック数Ｍｓとバンク数Ｍｒが等しいとき、回路の利用効率が最も高いといえる。しかしながら、これらの構成のインターリーバをターボデコーダに組み込んで用いるとき、次の理由からＭｓを小さくする必要が生じる場合がある。
【０１２０】
（ｉ）ＳＩＳＯ（Soft-Input Soft-Output）デコーダ、すなわち演算回路がＭｓより小さい並列処理能力しか持たないとき
（ｉｉ）サブブロックサイズが小さすぎると、デコード性能が劣化してしまうとき
本発明では、Ｍｓ＜Ｍｒである場合でも、メモリアクセス競合無く並列インターリーブを実行可能である。ここでは、バンク数Ｍｒ＝５、サブブロック数Ｍｓ＝３である例を、図３６に示す。なお図３６では、図３１と対応する部分には同一符号を付した。また図３６のインターリーバ３００の読み出しアドレス生成部のＬＵＴ０〜４の内容を図３７に、Ｋ＝４０、Ｋsin＝１４、Ｋsout＝１４、Ｒｏ＝４のときの書き込みタイミングを図３８に、読み出しタイミングを図３９に示した。
【０１２１】
書き込み処理に関して、Ｋsin×Ｍｓ≧ＲＣである必要があるので、Ｋsin＝Ｃとできない。従って、簡易な構成をとることができず、図３６のインターリーバ３００では、書き込みアドレス生成部３０１を行カウンタ３０２及び列カウンタ３０３を有する構成とする。それぞれのブロックは、３つのカウンタを内部に持つ。
【０１２２】
読み出し制御に関しては、図３１のインターリーバ２００との違いが２点ある。まず、アドレスを決定するＬＵＴ０〜ＬＵＴ４の内部には空きが多いことである。サブブロック数が３であるのに対し、ＲＡＭ数は５つであるから、各時点において、５つのうち２つのＲＡＭへのアクセスは無駄なアクセスとなってしまう。このことに対応するため、インターリーバ３００では、ＬＵＴ０〜ＬＵＴ４の該当する部分に無効なアドレス（Ｃ以上の任
意の値、たとえば８）をセットする。各ＲＡＭ０〜ＲＡＭ４においては、Ｃ以上のアドレスが入力されたときに実際のアクセスを停止することで、無駄なアクセスを避けることができる（この制御を行う部分は図示していない）。この制御により、図３９の読み出しタイミングに示すとおりr_data端子には無駄なデータが出力されない。ただし、もし出力されても出力側スイッチ２０２でそのデータは無視されるため、data_outには影響がない。
【０１２３】
２つ目の違いは、バンク選択信号生成部３１０であるが、単にルックアップテーブル３１１（Ｔ−ＬＵＴ）をサブブロック数に合わせて３つに削減するだけでよい。
【０１２４】
インターリーバ３００においては、図３７〜図３９からも分かるように、r_addr端子に無効なアドレスである８を入力したとき、r_data端子からの有効な出力はない。しかし、出力側スイッチ２０２で並び替えを行うと、３つのサブブロックから適切にインターリーブされたデータ列が得られることが分かる。
【０１２５】
なお、インターリーバ３００では、ＬＵＴの無効部分を８という値で埋めたため、ＬＵＴの容量及びビット数が増えてしまうという欠点がある。これが問題となる場合は、次のいずれかの方法をとることができる。第１に、図２１の構成を用いることである。第２に、ＬＵＴに無効アドレスを挿入する代わりに、有効アドレスをＬＵＴの前方に詰めることである。ただし、カウンタ値cnt_rをＬＵＴの読み出しアドレスとして直接使用できず、ＬＵＴの読み出し制御が多少複雑になる。
【０１２６】
（実施の形態３）
実施の形態１、２で説明した並列インターリーバは、特にターボデコーダに適用すると効果的である。本実施の形態では、実施の形態１、２の並列インターリーバをターボデコーダに組み込んだ場合の構成について説明する。
【０１２７】
図４０に、現在知られているターボデコーダの概略を示す。破線で囲んだ部分に示すように、外部値（あるいは、外部情報、事前情報など）と呼ばれる情報を２つのＳＩＳＯデコーダ（Ｓｏｆｔ−Ｉｎ  Ｓｏｆｔ−Ｏｕｔデコーダ）間で受け渡し、繰り返し処理を行うことが大きな特徴である。詳しくは、文献「Berrou, C.; Glavieux, A.; Thitimajshima, P.; “Near Shannon limit error-correcting coding and decoding: Turbo-codes”,
IEEE International Conference on Communications, 1993, Pages:1064 - 1070 vol.2」等に記載されている。
【０１２８】
近年においては、高速な通信を実現するために、ターボデコーダに対しても高速処理が求められている。ＳＩＳＯデコーダを高速化する方法として、複数のＳＩＳＯデコーダを並列動作させる方法と、ｒａｄｉｘ−４アルゴリズム（例えば文献「Charles Thomas, Mark A. Bickerstaff, Linda M. Davis, Thomas Prokop, Ben Widdup, Gongyu Zhou, David
Garrett, Chris Nicol; “Integrated Circuits for Channel Coding in 3G Cellular Mobile Wireless Systems”, IEEE Communications Magazine August 2003, pp.150-159」等に記載されている）が知られている。しかし、ターボデコーダとして高速に動作させるためにはインターリーバも高速動作させることが必要である。ＳＩＳＯデコーダの高速化手法に対応した並列インターリーバが必要となる。
【０１２９】
ＳＩＳＯデコーダを並列動作させる場合には、データ（外部値）はサブブロック分割される。サブブロック分割を用いた並列ターボデコーダ回路を、図４１に示す。なお、この図では外部値の流れを中心に示すため、通信路値の処理や硬判定に関する回路を省略した。図４１の並列ターボデコーダは、大きく分けて、並列インターリーバ５１０と、並列デインターリーバ５２０と、ＳＩＳＯデコーダ５３０と、遅延回路５４０と、ＳＩＳＯデコーダ５５０とを有する。並列インターリーバ５１０は、メモリ５１１と、アドレス生成部
５１２と、インターリーブアドレス生成部５１３と、スイッチ５１４と、バンク選択信号生成部５１５と、無効判定部５１６とを有する。並列デインターリーバ５２０は、スイッチ５２１と、メモリ５２２と、アドレス生成部５２３とを有する。
【０１３０】
なお、図４１では、ＳＩＳＯデコーダ００乃至０４、及び１０乃至１４の計１０個のＳＩＳＯデコーダを用いているが、ＳＩＳＯデコーダ００乃至０４と１０乃至１４を時分割共有することで５個のＳＩＳＯデコーダのみで実現することも可能である。
【０１３１】
また、ｒａｄｉｘ−４アルゴリズムを用いたＳＩＳＯデコーダに対応しては、シリアル−パラレル型のインターリーバが利用できる。これらを組み込んだターボデコーダ回路を図４２に示す。図４２のターボデコーダは、大きく分けて、並列インターリーバ６１０と、並列デインターリーバ６２０と、Ｒａｄｉｘ−４  ＳＩＳＯデコーダ６３０と、遅延回路６４０と、Ｒａｄｉｘ−４  ＳＩＳＯデコーダ６５０とを有する。並列インターリーバ６１０は、スイッチ６１１と、バンク選択信号生成部６１２と、メモリ６１３と、アドレス生成部６１４と、インターリーブアドレス生成部６１５と、スイッチ６１６と、バンク選択信号生成部６１７と、無効判定部６１８とを有する。
【０１３２】
以上のように、本発明によれば高速なインターリーバ回路をアービタ回路の付加などによる回路規模の増大を招くことなく、簡易な構成で実現できるため、小型で高速なターボデコーダ回路を実現することができる。
【０１３３】
なお上述した実施の形態１、２では、本発明をプライムインターリーブに用いた場合について述べたが、本発明はこれに限らず、２次元配列型のデータ構造に対して行方向優先でデータを書き込み、各行ごとに行内並び替えを行い、行同士を並び替え、列方向優先でデータを読み出すインターリーブアルゴリズムを実現する場合に広く適用できる。
【０１３４】
（実施の形態４）
図４３に、本実施の形態のインターリーバの構成を示す。インターリーバ７００は、入力側スイッチ７０１と、独立に書き込み及び読み出しが可能な複数のバンク（ＲＡＭ０〜ＲＡＭ４）からなるメモリ７０２と、出力側スイッチ７０３と、入力側カウンタ７０４及びconfiguration選択部７０５からなる書き込みアドレス生成部と、行カウンタ７０６と、列カウンタ７０７と、列番号スイッチ７０８と、加算器７０９と、ルックアップテーブルＬＵＴ０〜ＬＵＴ４からなるアドレステーブル７１０と、遅延部７１１と、加算器７１２と、プルーニング（pruning）判定部（図１の有効検出部１１５に相当）７１３とを有する。
【０１３５】
（１）設計方法・原理
先ず、インターリーバ７００の詳細を説明する前に、本実施の形態の原理について説明する。
【０１３６】
本実施の形態では、一例として、行数２０のインターリーブを、ＲＡＭ数５、５並列入出力（５サブブロック分割）により並列インターリーブする回路を示す。また本実施の形態では、ブロックサイズが２０３のデータを例に説明する。３ＧＰＰ規格のＰＩＬでは、インターリーバの配列は行数Ｒ＝２０、列数Ｃ＝１１である。
【０１３７】
入力サブブロックサイズは、Ｃの倍数とするとよい。ここではＣの４倍、すなわち４４とする。その理由は、行数が２０で、並列度（サブブロック数）が５なので、１サブブロックあたり４とした。
【０１３８】
出力サブブロックサイズＫsoutは、次の２つの条件を同時に満たすように定める。
（ｉ）ＫsoutをＲで割った余りは１以上
（ｉｉ）１バンクに割り当てられる行数は、ＫsoutとＲの最大公約数を超えない
このようなＫsoutを求める簡単な方法は、（１）式においてＲｏ＝４とすることである。ＫsoutをＲで割った余りは４である。また、ＫsoutとＲの最大公約数は４となるので、１バンクに４行を割り当てることができる。以上から、Ｋsoutは４４とする。
【０１３９】
次に、データとメモリバンクの対応を決める。
入力サブブロックはＣの倍数とした。したがって、書込み動作の始めのＣサイクルは、サブブロック０は０行目のデータを、サブブロック１は４行目のデータを、・・・、メモリに書き込む。そして、次のＣサイクルは、サブブロック０は１行目のデータを、サブブロック１は５行目のデータを、・・・、書き込む。
以上から、同時に書き込まれるデータの組み合わせを行番号で表すと、図４４の（０）〜（３）に示される４通りとなる。
【０１４０】
読出し時には、毎サイクル組み合わせが変わる。出力サブブロックＫsoutを４４としたことにより、組み合わせの数は２０通りで、同じ行への同時アクセスがない(競合が発生しない)。本実施の形態ではさらに、Ｋsoutを行数Ｒで除した余りであるＲｏを４としたことにより、組み合わせに重複が生じ、図４４に示す４通りにまで削減される。
【０１４１】
以上から、同時にアクセスされる行の組み合わせ(８通り)が全て明らかになった。したがって、これらの行が別のバンクになるよう、バンク割り当てを決定する。割り当ての一例を、図４５及び図４６に示す。
【０１４２】
以上が、本実施の形態のインターリーバの設計の原理である。重要な点を列挙する。
・出力サブブロックサイズＫsoutを、「ダミーデータ(プルーニングされるデータ)を含めて４４」としたので、書込み時に同じ行への同時アクセスが発生しない。
・ＫsoutをＲで除した余りであるＲoを４としたので、同時読出しがなされる行の組み合わせの数が４通りまでに削減された。
・同時にアクセスされる行は別のバンクとなるよう、データＲＡＭの分割方法（バンクへの割り当て方法）を決定した。同時にアクセスされる行の組み合わせが少ないほど、少ないバンク数で済み、回路が簡略化される。
【０１４３】
（２）構成及び動作
次に、本実施の形態のインターリーバ７００の構成及び動作について説明する。
＜構成＞
（書込み関連）
入力端子(data_in0〜4)：１つの端子は１つのサブブロックに対応する。
入力側スイッチ７０１：入力端子をメモリ７０２の適切なＲＡＭのバンクに接続する。スイッチは、図４７（Ａ）〜（Ｂ）に示す４通りの接続を実現する。各時点でどの接続に切り替えるかはconfiguration選択部７０５が決定する。
入力側カウンタ７０４：データ書き込み用のアドレスを生成する。なお、configuration選択部７０５はこのカウンタの出力に基づき動作する。
ＲＡＭ０〜４：入力データが書き込まれる。５つのバンクに分割されている。
【０１４４】
（読出し関連）
行カウンタ７０６：サブブロック０〜４がそれぞれ読み出すべきデータのインターリーブ後の行番号を保持・更新する。
列カウンタ７０７：サブブロック０〜４がそれぞれ読み出すべきデータのインターリーブ後の列番号を保持・更新する。
列番号スイッチ７０８：列カウンタ７０７の値を適切なＬＵＴに転送する。接続の形態
としては、図４８（Ａ）、（Ｂ）に示した２つの他、計２０通りを実現する。同時に、各カウンタ値に加算すべき上位アドレス値を算出する。
アドレステーブル（ＬＵＴ０〜４）７１０：アドレスのテーブル。特に、本実施の形態では行内並び替えパターン(intra-row permutation pattern)を保持する。データのＲＡＭと同様に５つのバンクに分割されている。
プルーニング（Pruning）判定部７１３：アドレステーブル７１０の出力に無効アドレスが含まれていないか検査する。含まれている場合、それがどのサブブロックに対応するかを調べ、結果を端子validに出力する。
出力側スイッチ７０３：メモリ７０２の各バンクからのデータ出力を適切な出力端子に接続する。
出力端子(data_out0〜4)：１つの端子は１つのサブブロックに対応する。
【０１４５】
＜書込み動作＞
ブロックサイズ（データ長）２０３シンボルの場合を例に説明する。
３ＧＰＰ規格（ＰＩＬ）では、インターリーバの配列はＲ＝２０、Ｃ＝１１である。インターリーバ７００は、入力データを５サブブロックに分割する。その様子を、図４９（Ａ）に示す。なお、後半のサブブロックはＫsinより短くなる場合がある。図４９（Ａ）の例においても、最後のサブブロック(サブブロック４)は他より短く、２７シンボルしかない。
【０１４６】
入力データは、図４６のようにメモリ７０２に配置する。ここで、各図面には行番号Ｉに基づく表現で補足を加えた。たとえば、サブブロック３の先頭のデータはＩ＝１２のデータであり、ＲＡＭ３の先頭部分に書き込まれる。
【０１４７】
このような書き込みを行うため、図２１の回路は次のように動作する。
入力側カウンタ７０４は０から４Ｃ−１まで１ずつカウントする。このカウント値は書き込みアドレスとして各ＲＡＭに入力される。このカウント値に従い、入力側スイッチ７０１の制御も行われる。すなわち、入力側スイッチ７０１は、カウント値が０〜Ｃ−１の期間には図４７（Ａ）、カウント値がＣ〜２Ｃ−１の期間には図４７（Ｂ）のような接続状態となる。
【０１４８】
＜読み出し動作＞
この例では、出力サブブロックサイズをＫsout＝４４とする。この値に基づき、カウンタ７０６、７０７の初期設定を行う。
出力サブブロック０の先頭データのデータ順位は０である。そこで、行カウンタ０の初期値を０、列カウンタ０の値を０と定める。
出力サブブロック１の先頭データのデータ順位は４４である。そこで、行カウンタ１の値を４、列カウンタ１の値を２と定める。
【０１４９】
ここで、行カウンタをＩ、列カウンタをＪ、データ順位をｎと表すと、これらの間に次式の関係が成り立つ。
ｎ＝Ｉ＋ＪＲ      ………（４）
（４）式に表される関係と、Ｉが０〜１９の範囲であるという条件から、行カウンタ１と列カウンタ１の初期値が算出される。同様に、サブブロック２〜４についてもカウンタの初期値が算出される。それらの値とデータ順位を、図５０に示す。
【０１５０】
ここで、データ順位はプルーニング処理により除去されるダミーデータを含む、インターリーブ後のデータ順位である。したがって、ブロックサイズＫが２０３であるのに対し、サブブロック４の最後のデータ順位は２１９と、ブロックサイズより大きくなる。（２１９−２０３＝１６であるから、１６個のダミーデータが挿入されている）
なお、ダミーデータを含むデータ順位に基づきカウンタ値を定めないと、メモリアクセス競合が起こらないことが保証されない。
【０１５１】
初期設定が完了すると、読み出し動作を開始する。行カウンタ７０６は毎サイクル１ずつ増加し、行の最大値１９を超えると０にリセットされるとともに対応する列カウンタ７０７を１増加させる。すなわち、列カウンタ７０７は２０サイクルに一度インクリメントされる。
【０１５２】
列カウンタ７０７の値は、列番号スイッチ７０８により適切なＬＵＴに転送される。ここで、列番号スイッチ７０８は３つの役割を担う。
・intra-row permutation（行間並び替え）
・行番号とバンク番号の関連付け
・行番号とバンク内位置の関連付け（上位アドレスの生成）
図５１に、これらの関係を示す。
【０１５３】
列番号スイッチ７０８の動作を具体的に説明する。初めのサイクル（初期設定時）において、行カウンタ３、列カウンタ３の値は、それぞれ１２、６である。この行番号に対応する並び替え（inter-row permutation）前行番号は１３である。並び替え前に１３行目に属するデータはバンク１（ＲＡＭ１）にあるので、列番号スイッチ７０８は図４８のように接続される。
【０１５４】
また、１３行目のデータはバンク１の前から２番目の領域に保存されている。したがって、そのことを示す上位アドレスであるＡ＝１という値が列番号スイッチ７０８により生成される。Ａ＝１という値は、実際のアドレス（Ａ＝１の領域が始まるアドレス）１１に変換され、列カウンタ値に加算される。
この結果、１７(＝６＋１１)という値がＬＵＴ１に入力される。ＬＵＴ１は１２行６列に対応する行内並び替えパターン(intra-row permutation pattern)である４という値を出力する。
【０１５５】
この出力に対し、再び上位アドレスを加算し、ＲＡＭへのアドレスとして入力する。すなわち、ＲＡＭ１へ、１５（＝４＋１１）というアドレス値が入力され、ＲＡＭからはｄ［１４７］が出力される。
出力側スイッチ７０３は、列番号スイッチ７０８と逆方向の接続を行う。すなわち、ＲＡＭ１の出力をサブブロック３(data_out3)に接続する。
【０１５６】
以上のようにして、読出し動作の初めのサイクルには、サブブロック３のデータとしてｄ［１４７］が出力される。すべての出力の様子を、図４９（Ｂ）Ｂに示す。
【０１５７】
本発明の並列インターリーバでは、一部のサブブロックにおいて無効データが出力される場合がある。プルーニング判定部７１３は、各サブブロックのデータが有効であるかどうかを検査する。無効であった場合、無効を知らせる信号を出力する。
【０１５８】
図５２に、プルーニング判定部７１３の回路構成を示す。プルーニング判定部７１３は、閾値設定部７１３−１と、閾値判定部７１３−２と、valid信号スイッチ７１３−３とを有する。閾値判定部７１３−２は、各ＲＡＭの無効なデータが保存されている領域のアドレスを指定する。たとえば、ブロックサイズ２０３の場合、１９行目は全て無効であるから、ＲＡＭ２のアドレス３３〜４３は無効である。また、１８行目は初めの５シンボルのみ有効であるから、ＲＡＭ３のアドレス２７〜３２は無効である。図５３に、閾値の例を示す。thlは無効データが始まるアドレス、thhは無効データが終了するアドレスを示す。なお、ＲＡＭ４ではプルーニングは発生しない。
閾値判定部７１３−２は、アドレステーブル７１０から出力されたアドレスが無効の領域であるかどうかを判定し、有効の時trueを、無効の時falseを返す。これで、各ＲＡＭの出力が有効であるかどうかが分かる。
valid信号スイッチ７１３−３は、出力側スイッチ７０３と同様の動作をする。この結果、どのサブブロックが有効であるかを示す５ビットの信号valid[4:0]が出力される。
【０１５９】
（実施の形態５）
図５４に、本実施の形態のインターリーバの構成を示す。インターリーバ８００は、入力側スイッチ８０１と、独立に書き込み及び読み出しが可能な複数のバンク（ＲＡＭ０〜ＲＡＭ９）からなるメモリ８０２と、出力側スイッチ７０３と、昇順カウンタ８０４−１、降順カウンタ８０４−２、スイッチ８０５及びconfiguration選択部８０６からなる書き込みアドレス生成部と、行カウンタ８０７と、列カウンタ８０８と、列番号スイッチ８０９と、加算器８１０と、ルックアップテーブルＬＵＴ０〜ＬＵＴ９からなるアドレステーブル８１１と、遅延部８１２と、加算器８１３と、プルーニング判定部８１４とを有する。
【０１６０】
（１）設計方法・原理
先ず、インターリーバ８００の詳細を説明する前に、本実施の形態の原理について説明する。
ターボデコーダにおいては、データの入力順を逆方向にすることがしばしば有効である。そこで、本実施の形態では奇数サブブロックのみについて、入出力順序を逆にする。その様子を、図５６に示す。
この場合においても、実施の形態４と同様に競合の発生しない並列インターリーバを実現できる。ブロックサイズ２０３の例で説明する。また、本実施の形態では並列度を１０とした。
【０１６１】
入力サブブロックサイズを２２、出力サブブロックサイズを２２とした。ここで、サブブロックサイズは、並列度が１０であるから、Ｒoを２とし（Ｒ÷１０＝２）、（１）式を用いて決定した。サブブロック分割の様子を、図５６に示す。
【０１６２】
ここで注意すべきことは、昇順と降順のサブブロックが混在している場合、（１）式に従っていれば必ず競合が発生しないわけではないことである。あくまで、「同時に読み出す２つ以上のデータについて、いずれの２つ以上についても、インターリーブ後のデータ順位の差を行数で除した余りが１以上となる」ように注意深く設計しなければならない。
【０１６３】
ただし、簡易な方法として、次のいずれかを満たせば（１）式を使ってもよい。
（ｉ）出力サブブロックサイズを偶数とする。
（ｉｉ）偶数サブブロックはすべて昇順、奇数サブブロックはすべて降順とする。あるいは、その逆とする。
【０１６４】
同時にアクセスされる行の組み合わせは、図５７の通りである。
バンクの割り当て方法の一例を、図５８に示す。なお、列番号スイッチ８０９における上位アドレスの加算を簡単にするため、図５９に示すように、バンク内の境界を２５６ずつに区切った。
【０１６５】
（２）動作
次に、本実施の形態のインターリーバ８００の動作について、実施の形態４のインターリーバ７００（図４３）と異なる部分を中心に説明する。
【０１６６】
＜書込み動作＞
偶数サブブロック（サブブロック０、２、・・）は順方向にデータが入力されるので、昇順カウンタ８０４−１を使ってメモリ８０２に書き込む。奇数サブブロックは逆方向にデータが入力されるので、降順カウンタ８０４−２を使ってメモリ８０２に書き込む。
図５５に、入力側スイッチ８０１のコンフィギュレーションを示す。
【０１６７】
＜読出し動作＞
行カウンタ８０７、列カウンタ８０８の初期値を、図６０に示す。
ところで、サブブロック番号が奇数のカウンタは降順カウンタである。すなわち、行カウンタ８０７は毎サイクル１ずつ減少していく。０に達すると、次のサイクルには１９にリセットされるとともに、列カウンタ８０８の値をデクリメントする。
実施の形態４と同様に、列カウンタ８０８の値は、列番号スイッチ８０９により適切なＬＵＴに転送される。ここで、列番号スイッチ８０９は、intra-row permutation（行間並び替え）、行番号とバンク番号の関連付け、行番号とバンク内位置の関連付け（上位アドレスの生成）の役割を担う。図６１に、これらの関係を示す。
入力側スイッチ８０１の動作も同様である。図６２に、列番号スイッチ７０８の２０通りのコンフィギュレーションのうち初めの２つを示す。
他の動作は実施の形態４のインターリーバ７００（図４３）と同様である。
【０１６８】
（実施の形態６）
図６３に、本実施の形態のインターリーバの構成を示す。インターリーバ９００は、入力側スイッチ９０１と、独立に書き込み及び読み出しが可能な複数のバンク（ＲＡＭ０〜ＲＡＭ９）からなるメモリ９０２と、出力側スイッチ９０３と、昇順カウンタ９０４及びconfiguration選択部９０５からなる書き込みアドレス生成部と、行カウンタ９０６と、列カウンタ９０７と、列番号スイッチ９０８と、加算器９０９と、ルックアップテーブルＬＵＴ０〜ＬＵＴ９からなるアドレステーブル９１０と、遅延部９１１と、加算器９１２と、プルーニング判定部９１３とを有する。
【０１６９】
（１）設計方法・原理
先ず、インターリーバ９００の詳細を説明する前に、本実施の形態の原理について説明する。
本実施の形態は、サブブロック分割方式と、シリアル/パラレル変換型を組み合わせたハイブリッド型の並列インターリーバを提示するものである。ここでは、並列度を５×２とした。
前述の実施の形態と同様に、読出しを競合なく並列に行うことができる。
【０１７０】
前述の実施の形態と同様の手法では、書き込みは１０並列でできない。そこで、本実施の形態では書き込みは５並列であるとした。ただし、全てのＲＡＭを偶数アドレスと奇数アドレスで２分割すれば１０並列書込みが可能である。ＲＡＭ０をＲＡＭ０-even，ＲＡＭ０−oddのように分ける。このようなメモリ分割により、逐次書込み処理を並列化することは、すでに知られていることであるから、あえて説明しない。
【０１７１】
ハイブリッド型においても、（１）式を使用できる。ただし、サブブロックサイズが偶数になるようにする。そこで、並列度が５×２の本例では、Ｒo＝４を選び、出力サブブロックサイズを４４とする。
サブブロック分割の様子は、図６４の通りである。１つのサブブロックにつき、１サイクルに２シンボルが出力される。
同時にアクセスされる行の組み合わせは、図６５の通りである。なお、書込みが５並列、読出しが１０並列であることに注意されたい。
上記の条件から、バンク割り当てを、図６６のように定める。
【０１７２】
（２）動作
次に、本実施の形態のインターリーバ９００の動作について、実施の形態４のインターリーバ７００（図４３）と異なる部分を中心に説明する。
【０１７３】
＜書込み動作＞
入力側スイッチ９０１は、configuration選択部９０５に制御され、図６８に示すようなコンフィギュレーションとされる。
【０１７４】
＜読出し動作＞
行カウンタ９０６、列カウンタ９０７の初期値は、サブブロックサイズが等しいので、実施の形態４のときと同様である。つまり、図５０の通りである。
本実施の形態では、行カウンタ９０６は毎サイクル２ずつ増加する。１９を超えたらリセットされる（つまり２０が減算される）点、及びリセット時に列カウンタ９０６を１増加させることは実施の形態４の例と同様である。
列番号スイッチ９０８は、図６７に示すように、１つの列カウンタ値を２つのＬＵＴに送るよう、接続する。
【０１７５】
このようにして、１組の行カウンタ・列カウンタから２つのアドレスが生成され、２つのデータが同時に読み出される。カウンタは５組あるので計１０個のデータが読み出される。これらは、出力側スイッチ９０３により適切な端子に送られる（サブブロック１つあたり２つの端子がある）。
そして、本発明によればこれら１０個のデータ読み出しはすべて別のバンクへのアクセスであることが保証され、アクセス競合は起こらない。
なお、プルーニング判定部９１３でのプルーニング判定は、サブブロックごとではなくデータごとに行われる。たとえば、サブブロック０のはじめのデータは、２つのうち１つだけが無効である。
【０１７６】
（他の実施の形態）
（１）行カウンタ、列カウンタ、列番号スイッチの他の構成例
行カウンタ、列カウンタ、列番号スイッチは、上述した実施の形態と異なる回路構成でも実現できる。ただし、ＬＵＴに列番号を供給し、出力スイッチを操作するための信号を生成するという目的に変わりはない。
【０１７７】
図６９に、図５４に示した実施の形態５の回路構成に対するバリエーションを示す。なお、図６９は、図５４のインターリーバ８００の行カウンタ８０７、列カウンタ８０８、列番号スイッチ８０９、アドレス生成部８１１に対応する部分のみを示したものであり、インターリーバ１０００の他の部分は省略している。
【０１７８】
インターリーバ１０００は、行カウンタ８０７、列カウンタ８０８、列番号スイッチ８０９に換えて、転送回路１００１と、制御部１００２と、レジスタ部１００３と、上位アドレス生成部１００４と、加算器１００５とを有する。
１０個のレジスタ０〜９は、列カウンタ８０８の値に相当する値を保持する。図５４では、列カウンタ８０８はサブブロックとの対応が固定であったが、図６９のレジスタ０〜９はＬＵＴ０〜９との対応を固定とした。
転送回路１００１は、レジスタの内容を並びかえる。一部のレジスタに対しては値の更新を行う。
【０１７９】
図７０に、転送回路１００１の構成例を示す。転送回路１００１は４つの状態を持ち、図７０（Ｂ）のように状態遷移する。
状態０では、白抜き四角形を記した部分が接続される。すなわち、レジスタ０の内容は
レジスタ０に転送され、レジスタ９の内容はレジスタ５に転送される。
図６２と比較すると転送回路１００１の動作が理解できる。すなわち、図６２ではＬＵＴ９に入力されていた値は列カウンタ０の値である。そして、次の時刻では、図６２（Ｂ）のように、列カウンタ０の値はＬＵＴ５に転送されるようスイッチの接続が変更される。
これに対して、図７０では、はじめの状態ではレジスタ９にはＬＵＴ９に入力すべき値として列カウンタ０に相当する値を保持していた。この値は、次の時刻にＬＵＴ５で使われるので、転送回路はレジスタ５に転送するよう接続がなされる。
状態３（三角印）においては、レジスタ９に入力される値に１を加算するとともに、レジスタ５に入力される値から１を減ずる。これは、図６２において列カウンタ７０７がインクリメント/デクリメントする動作に相当する。
図６９の制御部１００２は、転送回路１００１の４状態を制御する。それと同時に、上位アドレス生成部１００４及び出力側スイッチの制御を行う。
【０１８０】
（２）ターボデコーダへの適用例１
実施の形態３においては、実施の形態１、２の並列インターリーバに対応する並列ターボデコーダの構成例（図４１、図４２）を示した。図７１に、実施の形態４のインターリーバ７００（図４３）に対応する並列ターボデコーダの構成例を示す。
【０１８１】
図７１の並列ターボデコーダは、大きく分けて、並列インターリーバ１１００と、並列デインターリーバ１２００と、ＳＩＳＯデコーダ１３００と、遅延回路１４００と、ＳＩＳＯデコーダ１５００とを有する。
並列インターリーバ１１００は、メモリ１１０１と、natural orderアドレス生成部１１０２と、スイッチ１１０３と、interleave order アドレス生成部１１０４と、プルーニング判定部１１０３とを有する。また並列デインターリーバ１２００は、スイッチ１２０１と、メモリ１２０２と、natural orderアドレス生成部１２０３とを有する。
【０１８２】
図７１の並列ターボデコーダの特徴的な動作は、次の点である。
（ｉ）プルーニング判定部１１０５により、無効アドレスが検出された場合には、該当するＳＩＳＯデコーダのみをウェイト(一時停止)する。
（ｉｉ）並列インターリーバ１１００のインターリーブオーダーアドレスは、遅延回路１４００でタイミング調整すればそのまま並列デインターリーバ１２００で使うことができるので、インターリーブオーダーアドレス生成部１１０４は１つでよい。同時に、スイッチの制御信号も受け渡す。これにより、同じアドレスを(単に遅延させただけの)同じタイミングで渡すので、アクセス競合がないことが保証される。因みに、ＳＩＳＯデコーダ１３００の入力と出力でデータの並び順が同じ場合は、遅延回路１４００としてＦＩＦＯ(先入れ先出し)バッファを用いる。入力と出力でデータの並び順が逆になる場合はＬＩＦＯ(後入れ先出し)バッファを用いる。
【０１８３】
なお、（ｉ）については、プルーニング判定に基づきＳＩＳＯデコーダをウェイトするという構成は従来も行われていた。本発明はこれを並列構成で行うことに特徴がある。
【０１８４】
因みに、従来の構成例として次の２つのものがあった。
[従来構成１]逐次（並列でない）ターボデコーダが前提。（アドレステーブルは大きいので）テーブル引きではなく、１つずつアドレスを計算する。このとき、無効アドレスまで生成されてしまうのでその場合はＳＩＳＯデコーダをウェイトする。ウェイトが発生しないように、アドレスを２個ずつ生成して１個だけ使うなどの方法も考案されている。この場合、連続した２個がいずれも無効であることはない。
[従来構成２]並列インターリーバでは、テーブル引きでアドレス生成する。なお、テーブル引き以外でもできるかもしれないが、たいていテーブル引きでやっている。どうせテー
ブルを作るのであれば、無効アドレスは除去しておこうというのが常識になっている。
【０１８５】
これに対して、本発明では、並列ターボデコーダで、わざわざプルーニングによるウェイトを発生させている。換言すれば、無効アドレスを残してテーブルを作っている。これにより、競合が発生しない状態を維持することができる。
【０１８６】
（３）ターボデコーダへの適用例２
図７２に、実施の形態６のハイブリッド型のインターリーバ９００に対応するターボデコーダの構成例を示す。
【０１８７】
図７２のターボデコーダは、大きく分けて、並列インターリーバ２１００と、並列デインターリーバ２２００と、Ｒａｄｉｘ−４  ＳＩＳＯデコーダ２３００と、遅延回路２４００と、Ｒａｄｉｘ−４  ＳＩＳＯデコーダ２５００とを有する。
並列インターリーバ２１００は、スイッチ２１０１と、メモリ２１０２と、natural orderアドレス生成部２１０３と、スイッチ２１０４と、interleave order アドレス生成部２１０５、プルーニング判定部２１０６とを有する。
【０１８８】
ここで、natural order(並列インターリーバの書込み時)においても１０シンボル/サイクルの書き込みができるように、メモリバンクをさらに偶数アドレスと奇数アドレスの２つに分割する。末尾にeが付くＲＡＭには偶数アドレスのデータ、oが付くＲＡＭには奇数アドレスのデータを保存する。
natural orderにおいては、ＲＡＭ１０ｅに書き込むときには同時にＲＡＭ１０ｏにもデータを書き込む。Interleave orderにおいては、ＲＡＭ１０ｅとＲＡＭ１０ｏのいずれか一方に対してのみ読出しを行う。
【０１８９】
以上説明したように、本発明の並列インターリーバの一つの態様は、例えば図２１、図３１、図３６、図４３、図５４、図６３を用いて説明したように、複数のメモリバンクからなるメモリに入力データを書き込み、書き込まれたデータを書き込みと異なる順序で読み出すことにより、２次元配列型のデータ構造に対して行方向優先でデータを書き込み、各行ごとに規定される行内並び替えパターンに基づき行内並び替えを行い、行同士を並び替え、列方向優先でデータを読み出すインターリーブアルゴリズムを実現する並列インターリーバであって、複数のメモリバンクからなり、各バンクが前記２次元配列の１または複数の行番号と対応付けられているメモリと、それぞれ前記２次元配列のデータ構造における別の行において規定される複数の行内並び替えパターンを生成するパターン生成部手段と、前記パターン生成部手段を内部に持ち、前記複数の行内並び替えパターンに基づき複数の読み出しアドレスを生成する読み出し制御手段アドレス生成部と、を具備し、前記メモリから複数のデータを同時に読み出す構成を採る。
【０１９０】
この構成によれば、複数のアドレスを用いて、アクセス競合なく並列に処理することができ、インターリーバの高速化を図ることができる。
【０１９１】
本発明の並列インターリーバの一つの態様は、前記読み出し制御手段は、前記メモリバンク間で同時に読み出す２つ以上のデータについて、いずれの２つ以上についても、インターリーブ後のデータ順位の差を行数で除した余りが１以上となるように、前記複数のメモリバンクからデータを読み出す構成を採る。
【０１９２】
この構成によれば、読み出し時に、メモリバンク間で同時に読み出すデータのインターリーブ後の順位の差を行数で除した余りが１以上となるように、各メモリバンクのデータを読み出すようにしたので、どのような行内および行間並び替えパターンを採用したとしても、同一のメモリバンクに２つ以上の読み出しアドレスが生成されることがなくなる。
つまり、どのようなインターリーブパターンを採用したとしても、メモリバンクへのメモリアクセス競合を回避できるようになる。この結果、調停回路等の付加的な回路を設けなくても、良好に高速なインターリーブ処理を行うことができる並列インターリーバを実現できる。
【０１９３】
本発明の並列インターリーバの一つの態様は、前記インターリーブアルゴリズムは、入力データのデータサイズが前記２次元配列より小さい場合、前記入力データにダミーデータを付加してインターリーブ処理を行った後、ダミーデータを取り除くインターリーブアルゴリズムであり、さらに、前記複数のアドレスのうち、前記ダミーデータに対応する０ないし複数個の無効アドレスを判別する無効アドレス判定部を具備する構成を採る。
【０１９４】
本発明の並列インターリーバの一つの態様は、前記読み出し制御手段は、前記メモリバンク間で読み出す２つ以上のデータについて、いずれの２つ以上についても、ダミーデータ除去前の順位の差を行数で除した余りが１以上となるように、前記複数のメモリからデータを読み出す、構成を採る。
【０１９５】
この構成によれば、ダミーデータの除去処理（プルーニング処理）を行っても同一のメモリバンクに２つ以上の読み出しアドレスが生成されることがなくなるため、任意のデータサイズのインターリーブを行う場合でもメモリバンクへのメモリアクセス競合を回避できるようになる。
【０１９６】
本発明の並列インターリーバの一つの態様は、前記２次元配列のデータ構造における各行の入力データを、同じ行のデータはその行番号に対応するメモリバンクに書き込むようにして、定められたメモリバンクに書き込むための書き込みアドレスを生成する書き込み制御手段を具備し、書き込み制御手段は、２次元配列のデータ構造における各行と、書き込み先バンクとの対応が、一対一の対応となる書き込みアドレスを生成する、構成を採る。
【０１９７】
この構成によれば、メモリバンクへのアクセス競合を回避しつつ、並列度をメモリバンク数と等しくできるので、メモリバンクを最大限に利用して高速なインターリーブ処理を行うことができるようになる。
【０１９８】
本発明の並列インターリーバの一つの態様は、前記２次元配列のデータ構造における各行の入力データを、同じ行のデータはその行番号に対応するメモリバンクに書き込むようにして、定められたメモリバンクに書き込むための書き込みアドレスを生成する書き込み制御手段を具備し、２次元配列のデータ構造における行に対する書き込み先のメモリバンクの対応を一意に定め、かつ、インターリーブ後の順位の差と行数との最大公約数を越えない１ないし複数の行を１つのメモリバンクに対応付ける書き込みアドレスを生成する、構成を採る。
【０１９９】
この構成によれば、同時に読み出すデータ数が行数より少ない場合に、バンクメモリ数を少なくできるので、並列インターリーバを、より小規模な回路で実現することができるようになる。
【０２００】
本発明の並列インターリーバの一つの態様は、前記書き込み制御手段は、前記同時に読み出すデータと同数の第１の行番号の組を生成する行カウンタと、前記同時に読み出すデータと同数の第１の列番号の組を生成する列カウンタとを備え、前記第１の行番号の組により書き込み先バンクを決定すると共に、前記第１の列番号の組より書き込みアドレスを算出し、前記読み出し制御手段は、いずれの２つについても、差を行数で除した余りが１以上となるような複数のデータ順位に対するインターリーブアドレスを複数生成するイン
ターリーブアドレス生成手段と、前記インターリーブアドレスに対し第２の行番号の組及び第２の列番号の組を一意に算出する行列番号決定手段と、前記第２の列番号の組を読み出しアドレスとし、前記第２の行番号の組により読み出し元バンクを決定すると共に前記読み出しアドレスを該当する読み出し元バンクに送出するアドレス転送手段と、を具備する構成を採る。
【０２０１】
本発明の並列インターリーバの一つの態様は、前記読み出し制御手段は、前記インターリーブ後の順位の差を行数で除した余りを行オフセットとして求め、当該行オフセットぶんずつオフセットした、前記メモリバンク分の行番号からなる行番号セットを、行間並び替えパターンに基づいて変換し、変換後の行番号セットを前記メモリの出力側に設けられた出力選択手段にバンク選択信号として送出するバンク選択信号生成手段と、列番号セットと、前記バンク選択信号生成手段により求められた変換後の行番号セットとを用いて、行内並べ替えパターンを生成して、そのパターンを読み出しアドレスとして前記メモリの該当するメモリバンクに送出する読み出しアドレス生成手段と、を具備する構成を採る。
【０２０２】
この構成によれば、読み出しアドレス生成手段とバンク選択信号生成手段とによって、メモリバンク間で同時に読み出す２つ以上のデータについて、いずれの２つ以上についても、インターリーブ後のデータ順位の差を行数で除した余りが１以上となるようにデータを読み出すといった処理を実現できるようになる。
【０２０３】
本発明の並列インターリーバの一つの態様は、前記並列インターリーバは、前記２次元配列のデータ構造における各行の入力データを、所定のサブブロック単位で異なるメモリバンクに書き込むための書き込みアドレスを生成する書き込み制御手段を有するサブブロック分割型のインターリーバであり、前記読み出し制御手段は、前記インターリーブ後の順位の差を行数で除した余りを行オフセットとして求め、当該行オフセットぶんずつオフセットした、前記メモリバンク分の行番号からなる行番号セットを、行間並び替えパターンに基づいて変換し、変換後の行番号セットを前記メモリの出力側に設けられた出力選択手段にバンク選択信号として送出するバンク選択信号生成手段と、列番号セットと、前記バンク選択信号生成手段により求められた変換後の行番号セットとを用いて、インターリーブ後の順位の差がサブブロックサイズとなる行内並べ替えパターンを生成し、そのパターンを読み出しアドレスとして前記メモリの該当するメモリバンクに送出する読み出しアドレス生成手段と、を具備する構成を採る。
【０２０４】
この構成によれば、サブブロック分割型のインターリーバにおいて、読み出しアドレス生成手段とバンク選択信号生成手段とによって、メモリバンク間で同時に読み出す２つ以上のデータについて、いずれの２つ以上についても、インターリーブ後のデータ順位の差を行数で除した余りが１以上となるようにデータを読み出す、といった処理を実現できるようになる。
【０２０５】
本発明の並列インターリーバの一つの態様は、前記書き込み制御手段は、前記各メモリバンクに書き込む入力データのサブブロックサイズを前記２次元配列のデータ構造における列数以上とする、書き込みアドレスを生成する、構成を採る。
【０２０６】
この構成によれば、サブブロック型のインターリーバにおいて、２次元配列のデータ構造における各行の入力データを、同じ行のデータはその行番号に対応するメモリバンクに書き込むといった処理を、メモリアクセス競合を起こすことなく行うことができるようになる。
【０２０７】
本発明の並列インターリーバの一つの態様は、前記書き込み制御手段は、前記各メモリバンクに書き込む入力データのサブブロックサイズを前記２次元配列のデータ構造の列数
に等しくする、書き込みアドレスを生成する、構成を採る。
【０２０８】
この構成によれば、書き込み、読み出しともに、同一のサブブロック単位で処理を行うことができるようになる。
【０２０９】
本発明の並列デインターリーバの一つの態様は、上記いずれかの並列インターリーバの書き込みアドレスと読み出しアドレスを入れ替え、さらに入力選択手段と出力選択手段を入れ替えることにより、インターリーブアルゴリズムの逆処理を実現する構成を採る。
【０２１０】
この構成によれば、上記いずれかの並列インターリーバによってインターリーブされたデータを、メモリアクセス競合無しに、元の配列に戻すことができるようになる。
【０２１１】
本発明のターボデコーダの一つの態様は、上記いずれかの並列インターリーバを具備する構成を採る。
【０２１２】
本発明のインターリーブ方法の一つの態様は、複数のメモリバンクからなるメモリに入力データを書き込み、書き込まれたデータを書き込みと異なる順序で読み出すことにより、２次元配列型のデータ構造に対して行方向優先でデータを書き込み、各行ごとに規定される行内並び替えパターンに基づき行内並び替えを行い、行同士を並び替え、列方向優先でデータを読み出すインターリーブアルゴリズムを実現する並列インターリーブ方法であって、それぞれ前記２次元配列のデータ構造における別の行において規定される複数の行内並び替えパターンを生成するパターン生成ステップと、前記パターン生成ステップで生成した前記複数の行内並び替えパターンに基づき、複数のメモリバンクからなり各バンクが前記２次元配列の１または複数の行番号と対応付けられているメモリについての複数のアドレスを生成するアドレス生成ステップと、を含み、前記メモリから複数のデータを同時に読み出すようにする。
【０２１３】
本明細書は、２００５年２月３日出願の特願２００５−２８３１４に基づく。その内容は、全てここに含めておく。
【産業上の利用可能性】
【０２１４】
本発明の並列インターリーバ、並列デインターリーバ及びインターリーブ方法は、例えば無線通信機器のターボデコーダに適用して好適である。
【図面の簡単な説明】
【０２１５】
【図１】プライムインターリーバの２次元マトリックスへの書き込み状態を示す図
【図２】プライムインターリーバの行内並び替えを示す図
【図３】プライムインターリーバの行間並び替えを示す図
【図４】逐次型インターリーバの構成を示すブロック図
【図５】図１の逐次型インターリーバの動作を示すタイミングチャート
【図６】図１のアドレステーブルの内容を示す図
【図７】逐次型インターリーバに対するデインターリーバの構成例を示すブロック図
【図８】逐次インターリーブ方式の動作の説明に供する模式図
【図９】サブブロック分割インターリーブ方式（並列インターリーバ）の動作の説明に供する模式図
【図１０】別の並列インターリーバの説明に供する模式図
【図１１】別の並列インターリーバの説明に供する模式図
【図１２】逐次型インターリーバを用いたターボデコーダの構成例を示すブロック図
【図１３】図９の並列インターリーバを用いたターボデコーダの構成例を示すブロック図
【図１４】図１０の並列インターリーバを用いたターボデコーダの構成例を示すブロック図
【図１５】図１１の並列インターリーバを用いたターボデコーダの構成例を示すブロック図
【図１６】デュアルポートＲＡＭを用いた従来の並列インターリーバの構成を示すブロック図
【図１７】従来の調停回路付きの並列デインターリーバの構成例を示すブロック図
【図１８】従来の、ＲＡＭを複数のバンク（モジュール）に分割した場合の並列インターリーバ（デインターリーバ）の別の構成例を示すブロック図
【図１９】図１８の各ＲＡＭ０〜４に書き込まれるデータを示す図
【図２０】従来の、ＲＡＭを複数のバンク（モジュール）に分割した場合の並列インターリーバ（デインターリーバ）の別の構成例を示すブロック図
【図２１】本発明の実施の形態１に係るインターリーバの構成を示すブロック図
【図２２】各ルックアップテーブルＬＵＴ０〜４の内容を示す図
【図２３】すべてのデータを書き込んだ後のＲＡＭ内のデータ配置を示す図
【図２４】実施の形態１の書き込みタイミングを示すタイミングチャート
【図２５】実施の形態１の読み出しタイミングを示すタイミングチャート
【図２６】無効アドレスを含めた場合の各ルックアップテーブルＬＵＴ０〜４の内容を示す図
【図２７】無効アドレスを含めた場合の改良した各ルックアップテーブルＬＵＴ０〜４の内容を示す図
【図２８】プルーニングが発生した場合の書き込みタイミングを示すタイミングチャート
【図２９】プルーニングが発生した場合の読み出しタイミングを示すタイミングチャート
【図３０】プルーニングが発生した場合の出力ブロックサイズを示す図
【図３１】実施の形態２のインターリーバの構成を示すブロック図
【図３２】無効判定部の構成を示すブロック図
【図３３】実施の形態２における各ルックアップテーブルＬＵＴ０〜４の内容を示す図
【図３４】実施の形態２の書き込みタイミングを示すタイミングチャート
【図３５】実施の形態２の読み出しタイミングを示すタイミングチャート
【図３６】実施の形態２のインターリーバの他の構成例を示すブロック図
【図３７】図３６のインターリーバにおける各ルックアップテーブルＬＵＴ０〜４の内容を示す図
【図３８】図３６のインターリーバにおける書き込みタイミングを示すタイミングチャート
【図３９】図３６のインターリーバにおける読み出しタイミングを示すタイミングチャート
【図４０】実施の形態３のターボデコーダの構成例を示すブロック図
【図４１】実施の形態３のターボデコーダの構成例を示すブロック図
【図４２】実施の形態３のターボデコーダの構成例を示すブロック図
【図４３】実施の形態４のインターリーバの構成を示すブロック図
【図４４】書込時の組み合わせと、読出時の組み合わせを示す図
【図４５】バンク割り当ての説明に供する図
【図４６】バンク割り当ての説明に供する図
【図４７】入力側スイッチのコンフィギュレーションを示す図
【図４８】列番号スイッチのコンフィギュレーションを示す図
【図４９】（Ａ）は入力データのサブブロック分割を示す図であり、（Ｂ）は出力データのサブブロック分割の様子を示す図
【図５０】各サブブロックについての行カウンタ初期値、列カウンタ初期値及び先頭データ順位を示す図
【図５１】列番号スイッチの機能の説明に供する図
【図５２】プルーニング（pruning）判定部の構成を示すブロック図
【図５３】閾値の例を示す図
【図５４】実施の形態５のインターリーバの構成を示すブロック図
【図５５】入力側スイッチのコンフィギュレーションを示す図
【図５６】（Ａ）は入力データのサブブロック分割を示す図であり、（Ｂ）は出力データのサブブロック分割の様子を示す図
【図５７】書込時の組み合わせと、読出時の組み合わせを示す図
【図５８】バンク割り当ての説明に供する図
【図５９】バンク割り当ての説明に供する図
【図６０】各サブブロックについての入出力順序、行カウンタ初期値、列カウンタ初期値及び先頭データ順位を示す図
【図６１】列番号スイッチの機能の説明に供する図
【図６２】列番号スイッチのコンフィギュレーションを示す図
【図６３】実施の形態６のインターリーバの構成を示すブロック図
【図６４】出力データのサブブロック分割の様子を示す図
【図６５】書込時の組み合わせと、読出時の組み合わせを示す図
【図６６】バンク割り当ての説明に供する図
【図６７】列番号スイッチのコンフィギュレーションを示す図
【図６８】入力側スイッチのコンフィギュレーションを示す図
【図６９】行カウンタ、列カウンタ、列番号スイッチの他の構成例を示す図
【図７０】転送回路の構成例の説明に供する図
【図７１】実施の形態４のインターリーバに対応する並列ターボデコーダの構成例を示すブロック図
【図７２】実施の形態６のインターリーバに対応する並列ターボデコーダの構成例を示すブロック図
【図１】
0004848359.tif 000002
【図２】
0004848359.tif 000003
【図３】
0004848359.tif 000004
【図４】
0004848359.tif 000005
【図５】
0004848359.tif 000006
【図６】
0004848359.tif 000007
【図７】
0004848359.tif 000008
【図８】
0004848359.tif 000009
【図９】
0004848359.tif 000010
【図１０】
0004848359.tif 000011
【図１１】
0004848359.tif 000012
【図１２】
0004848359.tif 000013
【図１３】
0004848359.tif 000014
【図１４】
0004848359.tif 000015
【図１５】
0004848359.tif 000016
【図１６】
0004848359.tif 000017
【図１７】
0004848359.tif 000018
【図１８】
0004848359.tif 000019
【図１９】
0004848359.tif 000020
【図２０】
0004848359.tif 000021
【図２１】
0004848359.tif 000022
【図２２】
0004848359.tif 000023
【図２３】
0004848359.tif 000024
【図２４】
0004848359.tif 000025
【図２５】
0004848359.tif 000026
【図２６】
0004848359.tif 000027
【図２７】
0004848359.tif 000028
【図２８】
0004848359.tif 000029
【図２９】
0004848359.tif 000030
【図３０】
0004848359.tif 000031
【図３１】
0004848359.tif 000032
【図３２】
0004848359.tif 000033
【図３３】
0004848359.tif 000034
【図３４】
0004848359.tif 000035
【図３５】
0004848359.tif 000036
【図３６】
0004848359.tif 000037
【図３７】
0004848359.tif 000038
【図３８】
0004848359.tif 000039
【図３９】
0004848359.tif 000040
【図４０】
0004848359.tif 000041
【図４１】
0004848359.tif 000042
【図４２】
0004848359.tif 000043
【図４３】
0004848359.tif 000044
【図４４】
0004848359.tif 000045
【図４５】
0004848359.tif 000046
【図４６】
0004848359.tif 000047
【図４７】
0004848359.tif 000048
【図４８】
0004848359.tif 000049
【図４９】
0004848359.tif 000050
【図５０】
0004848359.tif 000051
【図５１】
0004848359.tif 000052
【図５２】
0004848359.tif 000053
【図５３】
0004848359.tif 000054
【図５４】
0004848359.tif 000055
【図５５】
0004848359.tif 000056
【図５６】
0004848359.tif 000057
【図５７】
0004848359.tif 000058
【図５８】
0004848359.tif 000059
【図５９】
0004848359.tif 000060
【図６０】
0004848359.tif 000061
【図６１】
0004848359.tif 000062
【図６２】
0004848359.tif 000063
【図６３】
0004848359.tif 000064
【図６４】
0004848359.tif 000065
【図６５】
0004848359.tif 000066
【図６６】
0004848359.tif 000067
【図６７】
0004848359.tif 000068
【図６８】
0004848359.tif 000069
【図６９】
0004848359.tif 000070
【図７０】
0004848359.tif 000071
【図７１】
0004848359.tif 000072
【図７２】
0004848359.tif 000073