[実施の形態1]
ディジタル信号処理において、長さNのディジタル信号列xnとそのスペクトル列Xnは、次式(1)で示されるN点離散フーリエ変換(DFT)により結合される。
高速フーリエ変換(FFT)は、上式(1)の離散フーリエ変換において演算時間を要する乗算の重複をなくす計算手順を実行することにより、効率的に変換を行なう。上述の長さNの信号列xnから、偶数番目のサンプルおよび奇数番目のサンプルを取出して、それぞれ、長さN/2の配列を形成し、それぞれbnおよびcnとする。
上式(2)の信号系列bnおよびcnのN/2点DFT(離散フーリエ変換)を、それぞれBn,Cnとすると、これらは、それぞれ、次式(3)で表わされる。
したがって、信号系列xnのフーリエ変換Xkは、これらのBkおよびCkを用いて、次式で表わされる。
したがって、N点離散フーリエ変換Xkは、2つのN/2点離散フーリエ変換BkおよびCkから、上式(4)により導き出される。
図1は、上述のDFTの計算手法のN=8の場合のデータフローを示す図である。偶数信号(サンプル)列x[0]、[4]、x[2]、およびn[6]は、上式(3)に示す信号列Bkに対応し、奇数の信号列x[1]、x[5]、x[3]およびx[7]は、上式(3)における信号列Ckに対応する。
図1に示すデータフローにおいては、信号系列BkおよびCkにおいてN点DFTを、2つのN/2点DFTに分割される。これらのN/2点DFTに対しさらに上述の関係式を適用し、N/4点DFTを求め、最終的に、2点DFTにまで分解する。この2点DFTは、基本バタフライ演算BBOであり、DFTを、このような2点DFTに分関して順次計算する手法が、FFT(高速フーリエ変換)と呼ばれる。この基本バタフライ演算BBOにおいては、白丸記号で示す演算部において係数Wkと下側に与えられる入力との乗算が行なわれ、かつ演算ノードの上側のノードに与えられる信号と乗算結果の加算または減算が実行される。基本バタフライ演算BBOは、信号成分が、実数成分および虚数成分を有しており、次式(5A)および(5B)で示される。
上式(5A)および(5B)に対する式の定義において、符号Reは、対応の信号の実数部を示し、Imは対応の信号の虚数部を示す。jは、虚数である。
すなわち、図1において、信号x[0]およびx[4]を、それぞれ信号x[i]およびx[i+n]とすると、係数W0およびW4を用いて、2点DFT演算、すなわち基本バタフライ演算結果x′[0]およびx′[4]が生成される。
基本バタフライ演算処理において、専用のDSPを用いて積和演算または積差演算を1マシンサイクルで実行するとともに各演算を直列に実行した場合、式(5A)および(5B)において、それぞれ係数Wの値が異なるため、それぞれ6クロックサイクル必要とされ、合計12クロックサイクルが必要とされる。1回の計算において、基本バタフライ演算は、4回実行され、このFFTを完了するまでに、計算段数は、合計3段であり、したがって合計144(=12×4×3)クロックサイクルが必要とされる。N=2048の場合には、1回の計算に、基本バタフライ演算は、1024回行なわれ、計算段数は、11段であり、合計135168クロックサイクルが必要となる。一般に、Nが、2のr乗の場合には、N点DFTのr回の分解で2点DFT(基本バタフライ演算ブロック)に分解され、この基本バタフライ演算を順次、各演算段ごとに入力信号の距離を1/2倍ずつ半減して実行することによりN点DFTが得られる。このN点DFT(N=2のr乗の場合)は、式(1)に従う定義に基づいて演算を実行すると、乗算回数は、Nの2乗となる。一方、FFTにおいては、式(5A)および(5B)における乗算のみを考慮する必要があり、乗算回数は、r・N=N・log2Nとなる。したがって、乗算回数が大幅にFFTの場合に低減され、高速のフーリエ変換処理が実現される。
一般に、DFT処理においては、上述のようなバタフライ演算を利用するFFT処理が実行される。FFTにおいても、各基本バタフライ演算を、直列に実行すると、処理時間がサンプリング点数に応じて増大し、高速化が困難である。本発明においては、このFFT処理を、以下の構成を利用して高速で演算対象データの数にかかわらず処理する。
図1は、この発明の実施の形態1に従う半導体信号処理装置に要する処理システムの全体の構成を概略的に示す図である。図2において、処理システムは、並列演算を実行する半導体演算装置1と、この半導体演算装置1における処理の制御、システム全体の制御およびデータ処理を行なうホストCPU2と、システムの主記憶として利用されて必要な種々のデータを格納するメモリ3と、メモリ3に対し直接ホストCPU2を介することなくアクセスするDMA(ダイレクト・メモリ・アクセス)回路4とを含む。DMA回路4の制御により、メモリ3と半導体演算装置1との間でデータ転送を行なうことができ、また、半導体演算装置1へ直接アクセスすることができる。
ホストCPU2、メモリ3、DMA回路4、および半導体演算装置1は、システムバス5を介して相互接続される。半導体演算装置1は、複数の並列に設けられる基本演算ブロックFB1−FBnと、システムバス5との間でデータ/命令を転送する入出力回路10と、この半導体演算装置1内部での動作処理を制御する集中制御ユニット15を含む。
基本演算ブロックFB1−FBnおよび入出力回路10は、内部データバス12に結合され、また、集中制御ユニット15、入出力回路10および基本演算ブロックFB1−FBnは、内部バス14に結合される。基本演算ブロックFB(FB1−FBnを総称的に示す)の間には、隣接ブロック間データバス16が設けられる。図2においては、基本演算ブロックFB1およびFB2の間に配置される隣接ブロック間データバス16を代表的に示す。
基本演算ブロックFB1−FBnを並列に設け、半導体演算装置1の内部で並列に同一または異なる演算処理を実行する。これらの基本演算ブロックFB1−FBnは、同一構成を有するため、図2においては、基本演算ブロックFB1の構成を代表的に示す。
基本演算ブロックFB1は、メモリセルアレイ(メモリセルマット)および演算器を含む主演算回路20と、マイクロコード化された実行プログラムを格納するマイクロプログラム格納メモリ23と、基本演算ブロックFB1の内部動作を制御するコントローラ21と、アドレスポインタ等として用いられる複数のレジスタを含むレジスタ群22と、主演算回路20における不良の救済を行なうためのヒューズプログラムを実行するためのヒューズ回路24を含む。
コントローラ21は、ホストCPU2からシステムバス5および入出力回路10を介して与えられる制御命令により制御が手渡され、対応の基本演算ブロックFB(FB1−FBn)の動作を制御する。これらの基本演算ブロックFB1−FBnそれぞれに、マイクロプログラム格納メモリ23を設け、コントローラ21がメモリ23内に実行プログラムを格納することにより、基本演算ブロックFB1−FBnそれぞれにおいて実行する処理内容を個々に変更することができ、基本演算ブロックFB1−FBnにおいてそれぞれ演算実行される処理内容を変更することができる。
隣接ブロック間データバス16は、内部データバス12を占用することなく基本演算ブロック間の高速データ転送を可能とする。たとえば、ある基本演算ブロックに内部データバス12を介してデータ転送中に、別の基本演算ブロック間で、隣接ブロック間データバス16を利用してデータ転送を行なうことができる。
集中制御ユニット15は、制御用CPU25と、制御用CPU25が実行する命令を格納する命令メモリ26と、制御用CPU25のワーキングレジスタまたはポインタ格納用のレジスタを含むレジスタ群27と、マイクロプログラムのライブラリを格納するマイクロプログラムライブラリ格納メモリ28を含む。集中制御ユニット15は、内部バス14を介してホストCPU2から制御キーを手渡されて内部バス14を介して基本演算ブロックFB1−FBnの処理動作を制御する。
マイクロプログラムライブラリ格納メモリ28に、各種シーケンス処理がコード化されたマイクロプログラムをライブラリとして格納することにより、集中制御ユニット15から必要なマイクロプログラムを選択して基本演算ブロックFB1−FBnのマイクロプログラム格納メモリ23に格納されるマイクロプログラムを変更することができ、処理内容の変更に柔軟に対応することができる。
また、ヒューズ回路24を利用することにより、基本演算ブロックFB1−FBnそれぞれにおいて不良が発生した場合、冗長置換を用いて不良救済を行なうことにより歩留りを改善する。
図3は、図2に示す基本演算ブロックFB1−FBn各々に含まれる主演算回路20の要部の構成を概略的に示す図である。図3において、主演算回路20は、メモリセルMCが行列状に配列されるメモリマット30と、このメモリマット30の一方端に配置される演算処理ユニット(ALU)群32を含む。
メモリマット30においては、行列状に配列されるメモリセルMCが、m個のエントリERYに分割される。各エントリERYは、nビットのビット幅を有し、本実施の形態1においては、1つのエントリERYは、1列のメモリセルで構成される。
演算処理ユニット群32は、エントリERYそれぞれに対して設けられる演算処理ユニット(ALU)34を含む。演算処理ユニット34は、加算、論理積、一致検出(EXOR)、および反転(NOT)などの演算を実行することができる。
エントリERYと対応の演算処理ユニット34の間でデータのロードおよびストアを行なって演算処理を実行する。エントリERYは、メモリマット30の列方向に整列して配置されるメモリセルMCで構成され、演算処理ユニット(ALU)34は、ビットシリアル態様、すなわち、データワードをビット単位で処理する態様で演算処理を実行する。各エントリERYには、演算対象のデータワードがそれぞれ格納され、演算処理ユニット群32において、ビットシリアルかつ複数のエントリが並行して処理されるエントリパラレルな態様でデータの演算処理が実行される。
演算処理ユニット(ALU)34において、ビットシリアル態様で演算処理を実行することにより、演算対象のデータのビット幅が異なる場合においても、単に演算サイクル数がデータワードのビット幅に応じて変更されるだけであり、その処理内容は変更されず、語構成の異なるデータを容易に処理することができる。
また、複数のエントリERYのデータを、演算処理ユニット群32において並行して処理することができ、エントリ数mを大きくすることにより、大量のデータを一括して演算処理することができる。本実施の形態1においては、このエントリにFFT処理対象のデータを格納し、演算処理ユニット群32のALU34を利用して、複数のバタフライ演算を並列に実行し、大量のデータのFFT演算処理を高速で実行する。ここで、一例として、エントリ数mは、1024であり、1エントリのビット幅nは、512ビットである。
図4は、図3に示すメモリセルMCの構成の一例を示す図である。図4において、メモリセルMCは、電源ノードとストレージノードSN1の間に接続されかつそのゲートがストレージノードSN2に接続されるPチャネルMOSトランジスタ(絶縁ゲート型電界効果トランジスタ)PQ1と、電源ノードとストレージノードSN2の間に接続されかつそのゲートがストレージノードSN1に接続されるPチャネルMOSトランジスタPQ2と、ストレージノードSN1と接地ノードの間に接続されかつそのゲートがストレージノードSN2に接続されるNチャネルMOSトランジスタNQ1と、ストレージノードSN2と接地ノードの間に接続されかつそのゲートがストレージノードSN1に接続されるNチャネルMOSトランジスタNQ2と、ワード線WL上の電位に応答してストレージノードSN1およびSN2をそれぞれ、ビット線BLおよび/BLに接続するNチャネルMOSトランジスタNQ3およびNQ4を含む。
この図4に示すメモリセルMCは、フルCMOS(相補MOS)構成のSRAM(スタティック・ランダム・アクセス・メモリ)セルであり、高速でデータの書込/読出を行なう。このメモリセルMCとしては、データの書込経路およびデータの読出経路が異なるデュアルポートSRAMセルが用いられてもよく、また、2つのDRAMセルがビット線BLおよび/BLの間に直列に接続されかつ共通のワード線WLの電位により選択状態とされる「ツインセル構造」のDRAM(ダイナミック・ランダム・アクセス・メモリ)セルユニットが用いられてもよい。
図3に示す主演算回路20において演算を行なう場合には、基本的には、以下の手順が用いられる。また、各エントリERYに演算対象データの格納が行なわれる。次いで格納されたデータのある桁のビットが、すべてのエントリERYについて並列に読出され、対応の演算処理ユニット(ALU)34へ転送(ロード)される。2項演算の場合には、各エントリERYにおいて別のデータワードのビットに対しても同様の転送動作を行なった後、各演算処理ユニット(ALU)34で2入力演算を行なう。この演算処理結果は、演算処理ユニット(ALU)34から対応のエントリ内の所定領域に再書込(ストア)されるか、または、転送回路(後に説明する)を利用して別のエントリに対応して配置される演算処理ユニット(ALU)へ転送して、所定領域に格納する。
図5は、この図3に示す主演算回路20における演算操作を例示的に示す図である。図5においては、2ビット幅のデータワードaおよびbの加算を行なって、データワードcを生成する。各エントリERYには、演算対象の組をなすデータワードaおよびbがともに格納される。
図5においては、第1行目のエントリERYに対する演算処理ユニット(ALU)34において、10B+01Bの加算が行なわれ、2行目エントリに対する演算処理ユニット(ALU)34においては、00B+11Bの演算が行なわれる。ここで、“B”は、2進数を示す。3行目のエントリに対する演算処理ユニット(ALU)34におていは、11B+10Bの演算が行なわれる。以下、各エントリERYに格納されたデータワードaおよびbの加算演算が実行される。
演算は、下位側ビットから順にビットシリアル態様で行なわれる。まず、エントリERYにおいて、データワードaの下位ビットa[0]を対応の演算処理ユニット(以下単に、ALUと称する)34へ転送する。次に、データワードbの下位ビットb[0]を対応のALU34へ転送する。ALU34においては、これらの与えられた2ビットデータを用いて加算演算を行なう。この加算演算結果a[0]+b[0]は、データワードcの下位ビットc[0]の位置に書込まれる(ストアされる)。すなわち、1行目のエントリERYにおいては、ビット“1”がc[0]の位置に書込まれる。
この加算処理を、次いで、上位ビットa[1]およびb[1]に対しても行い、その演算結果a[1]+b[1]が、ビットc[1]の位置に書込まれる。
加算演算においては、桁上がりが生じる可能性があり、この桁上がり(キャリー)の値が、ビットc[2]の位置に書込まれる。これにより、データワードaおよびbの加算がすべてのエントリERYにおいて完了し、その結果がデータcとして各エントリERYにおいて格納される。エントリ数mとして、上述のように、たとえば1024を準備した場合、1024個のデータの加算を並列に実行することができる。
図6は、この加算演算処理時の内部タイミングを模式的に示す図である。以下、図6を参照して、加算演算処理時の内部タイミングについて簡単に説明する。ALU34においては、2ビット加算器(ADD)が利用される。このALU34の内部構成については後に詳細に説明する。
図6において、“Read”は、メモリマット30から演算対象のデータビットを読出して対応のALU34に転送する動作(ロード)を示し、“Write”は、ALU34の演算結果データを対応のエントリの対応のビット位置に書込む動作(ストア)または動作命令を示す。
マシンサイクルkにおいて、データビットa[i]がメモリマット30から読出され、次のマシンサイクル(k+1)で、別の演算対象のデータビットb[i]が読出され(Read)、これらの読出ビットが、対応のALU34の加算器(ADD)にそれぞれ各サイクルにおいて与えられる。
マシンサイクル(k+2)においては、ALU34の加算器(ADD)において、与えられたデータビットa[i]およびb[i]の加算処理が行なわれる。マシンサイクル(k+3)において、加算結果c[i]が、対応のエントリの対応の位置に書込まれる。
次のマシンサイクル(k+4)および(k+5)において、次の演算対象のデータビットa[i+1]およびb[i+1]が読出され、ALU34の加算器(ADD)へ転送されて保持される。マシンサイクル(k+6)において、ALU34により加算処理が行なわれる。マシンサイクル(k+7)において、この加算結果が対応のエントリのビット位置c[i+1]へ格納される。
メモリマット30とALU34の間でのデータビット転送に、それぞれ1サイクルが必要とされ、ALU34において1マシンサイクルの演算サイクルが必要とされる。したがって、2ビットデータの加算および加算結果の格納を行なうために、4マシンサイクルが必要とされる。メモリマットを複数のエントリERYに分割し、各エントリに演算対象データの組をそれぞれ格納して、対応のALU34においてビットシリアル態様で演算処理を行なう方式の特徴は、1つ1つのデータの演算には、比較的多くのマシンサイクルが必要とされるものの、処理すべきデータ量が非常に多い場合には、演算の並列度を高くすることにより高速データ処理を実現することができることである。また、ビットシリアル態様で演算処理を行なっており、処理されるデータのビット幅は固定されないため、種々のデータ構成を有するさまざまなアプリケーションに適用することができる。
たとえば、演算対象のデータワードのビット幅がNの場合、各エントリERYの演算には、4・Nマシンサイクルが必要とする。演算対象のデータワードのビット幅は、8ビットから64ビット程度であり、エントリ数mをたとえば1024と大きくすることにより、並列演算処理時間に関して、たとえば8ビットデータの場合、32マシンサイクルで1024個の演算結果を得ることができ、1024組のデータをシーケンシャルに処理する場合に比べて大幅に処理時間を短縮することができる。
図7は、主演算回路20の構成の一例をより具体的に示す図である。メモリマット30において、メモリセルMCが行列状に配列され、各メモリセル行に対応してワード線WLが配設され、メモリセル列それぞれに対応してビット線対BLPが配置される。メモリセルMCは、これらのビット線対BLPとワード線WLの交差部に対応して配置される。ワード線WLには、対応の行のメモリセルが接続され、またビット線対BLPには、対応の列のメモリセルが接続される。
エントリERYは、各ビット線対BLPに対応して設けられ、メモリマット30においては、ビット線対BLP0からBLP(m−1)それぞれに対応してエントリERY0−ERY(m−1)が配置される。ビット線対BLPが、対応のエントリERYとALU群32に含まれる対応のALUとの間のデータ転送線として利用される。エントリERYを1列のメモリセルで構成することにより、1エントリに格納されるデータのビット幅が用途に応じてまたは処理内容に応じて変更される場合においても、ビットシリアル態様で対応のALUで演算処理を行なうことができ、データビット幅の変更に容易に対応することができる。
メモリマット30のワード線WLに対して、コントローラ(図2参照)からのアドレス信号に従って演算対象のデータビットが接続されるワード線WLを選択状態へ駆動するロウデコーダ46が設けられる。ワード線WLには、エントリERY0−ERY(m−1)の同一位置のメモリセルが接続されており、このロウデコーダ46によりワード線を選択することにより、各エントリERY各々において同一位置のデータビットを選択する。
演算処理ユニット群(ALU群)32においては、各ALUがビット線対BLP0−BLP(m−1)に対応して配置されるが、図7においては明確に示していない。このALU群32とメモリマット30との間に、データのロード/ストア(転送)を行なうための転送回路を構成するセンスアンプ群40およびライトドライバ群42が設けられる。
センスアンプ群40は、ビット線対BLP各々に対して設けられるセンスアンプを含み、対応のビット線対BLP(BLP0−BLP(m−1))に読出されたデータを増幅して、演算処理ユニット群32の対応のALU(34)に伝達する。
ライトドライバ群42も同様、ビット線対BLP(BLP0−BLP(m−1))それぞれに対応して配置されるライトドライバを含み、演算処理ユニット群32の対応のALUからのデータを増幅して対応のビット線対BLPへ増幅データを転送する。
これらのセンスアンプ群40およびライトドライバ群42がビット線(データ転送線)とALU群32との間の転送回路を構成し、メモリマット30とALU群32との間、すなわちエントリと対応のALUとの間で双方向にデータを転送することができる。
これらのセンスアンプ群40およびライトドライバ群42に対し、入出力回路48が設けられ、図2に示す内部データバス12との間でのデータの転送が行なわれる。この入出力回路48のデータの入出力の態様は、エントリ数およびデータビット幅に応じて適当に定められる。
演算処理ユニット群(ALU群)32に対し、さらに、ALU間相互接続用スイッチ回路44が設けられる。このスイッチ回路44は、ALU群32におけるALU間の相互接続経路を、図2に示すコントローラ21からの制御信号に基づいて設定する。これにより、バレルシフタなどと同様に、隣接ALU間でのデータ転送のみならず、遠く物理的に離れたALU間でのデータ転送を行なうことができる。このALU間相互接続用スイッチ回路44は、たとえば、FPGA(フィールド・プログラマブル・ゲート・アレイ)などを用いたクロスバースイッチで実現される。また、このスイッチ回路44として、バレルシフタなどのように、1マシンサイクル内で複数ビット間のシフト動作を行なう構成が用いられてもよい。
このALU間相互接続用スイッチ回路44を用いてALU間でのデータ転送を行なうことにより、FFT処理におけるバタフライ演算時において、N点FFT処理を行なう場合、N/2離れたサンプリング点を対として、演算処理を行なうことができ、双対ノードのデータを生成する際のアドレス変換などの処理が不要となり、高速でデータを転送してバタフライ演算を実行することができる。
なお、この図7において、図2に示す隣接ブロック間データバス16は明確に示していない。隣接ブロック間データバス16は、ALU間相互接続用スイッチ回路44に接続されてもよく、また、入出力回路48とセンスアンプ群40およびライトドライバ群42との間の内部データ転送バスに接続されてもよい。
また、演算処理ユニット群32のALUは、コントローラ21(図2参照)からの制御信号に従ってその演算処理動作タイミングおよび演算操作内容が決定される。すなわち、ALUにおいて複数の演算器(加算器(ORゲート)、反転器、ANDゲート、EXORゲート等)を配置し、これらの演算器を選択的に活性化する。
図8は、1つのALUの構成の一例を示す図である。図7において、ALU34(以下、算術演算論理回路との違いを明確にするために、単位ALU回路ブロックとも称す)は、指定された演算処理を行なう算術演算論理回路50と、対応のエントリから読出されるデータを一時的に格納するAレジスタ52と、対応のエントリから読出されたデータビットまたは算術演算論理回路50の演算処理結果データまたはライトドライバへ転送するデータを一時的に格納するXレジスタ54と、加減算処理時のキャリーまたはボローを格納するCレジスタ56と、この算術演算論理回路50の演算処理の禁止を指定するマスクデータを格納するVレジスタ(マスクレジスタ)58を含む。
図7に示すセンスアンプ群40およびライトドライバ群42は、単位構成の基本回路として、対応のビット線BLPに対して設けられるセンスアンプ62およびライトドライバ60を含む。センスアンプ62は、対応のエントリのメモリセルから読出されたデータを増幅してAレジスタ52またはXレジスタ54またはVレジスタ58へ転送する。FFT処理実行時において、演算の実行/禁止を示す制御データは、各エントリ内に格納され、各バタフライ演算段の計算実行前に、Vレジスタ58に格納される。
ライトドライバ60は、Xレジスタ54に格納されたデータをバッファ処理して対応のエントリのメモリセルへ対応のビット線対BLPを介して書込む。
算術演算論理回路50は、加算(ADD)、論理積(AND)、論理和(OR)、排他的論理和(EXOR)、反転(NOT)等の演算を実行することができ、その演算内容が図2に示すコントローラ21からの制御信号(図8には示さず)により設定される(並列に配置されるこれらの演算ゲートを選択的に制御信号に従ってイネーブルする)。
Vレジスタ58に格納されるマスクデータは、“0”のときに、このALU34の演算処理動作を停止させ、“1”のときに、このALU34の演算処理動作をイネーブルする。演算マスク機能を利用することにより、仮に全エントリが利用されない場合においても、有効にエントリに対してのみ演算を実行することができ、正確な処理を行なうことができる。また、不必要な演算を停止させることにより、消費電流を低減することができる。さらに、FFT処理実行時において、このVレジスタ58のマスクデータを利用して、ALU34において選択的に演算を実行することにより、正確なデータの組合せ(双対ノードのデータ)を利用してバタフライ演算を実行する。
Xレジスタ54は、また、スイッチ回路44に含まれるALU間接続回路65を介して他のALU(単位ALU回路ブロック)に接続される。このALU間接続回路65は、前述のように、FPGAセルなどのスイッチ回路で構成され、演算処理ユニット群32に含まれる任意のALU34に対してデータを転送する際に用いられる。また、このALU間接続回路65の転送機能により、メモリマット内のさまざまな物理位置に格納されているデータとの演算を実現することが可能となり、演算の自由度を高くする。特に、このALU間接続回路65を利用することにより、距離N/2離れたデータ対を利用してバタフライ演算を実行することができ、複雑なアドレス計算を行なってメモリマット内においてデータの再配列を行なうことなくFFT処理を実行することができる。
図9は、ALU間相互接続用スイッチ回路44の接続の態様の一例を概略的に示す図である。図9においては、1つの主演算回路において8個の単位ALU回路ブロック(ALU34)ALU0−ALU7が設けられる。この単位ALU回路ブロックは、図8に示すALU34に対応し、算術演算論理回路50および各レジスタを含む。
ALU間相互接続用スイッチ回路44においては、ALU34間を1ビットシフト(move)するスイッチ回路および配線を配置する1ビットシフト領域AR0と、2ビットシフトするスイッチ回路および配線を配置する2ビットシフト領域AR1と、4ビットシフトするスイッチ回路および配線を配置する4ビットシフト領域AR2とが設けられる。これらのシフト領域AR0、AR1およびAR2においては、1つの基本演算ブロック内において2のn乗離れたALU内のXレジスタのデータをシフトして2のn乗離れたALU間のデータ転送(シフト:move)をスイッチ回路44において実現することにより、任意のALU間のデータ転送を1クロックサイクルで行ない、最大2サイクルでデータの転送およびメモリセルへの格納を完了することができる。
ただし、2のn乗離れたALU間のデータのシフトを行なう場合、1ビットシフト領域から2のn乗ビットシフト領域まで、合計(n+1)の配線領域が必要となる。
図10は、ALU間相互接続用スイッチ回路44における接続の他の形態を示す図である。図10においても、8個の単位ALU回路ブロック(ALU34)ALU0−ALU7に対する接続経路を示す。図10において、1ビットシフト領域AWR0において、1ビット離れたALU間のXレジスタの格納データの交換(スワップ)を行なうために、ALU0およびALU1が相互接続され、また、ALU2およびALU3が相互接続される。ALU4およびALU5が相互接続され、ALU6およびALU7が相互接続される。
2ビットシフト領域AWR1において2ビット離れたALU間のXレジスタの格納データのスワップを行なうために、ALU0およびALU2が相互接続され、ALU1およびALU3が相互接続される。また、ALU4がALU6と相互接続され、ALU5がALU7と相互接続される。
4ビットシフト領域AWR2においては、4ビット離れた位置のALU間のXレジスタのスワップを行なうために、ALU、ALU1、ALU2、およびALU3が、それぞれ、ALU4、ALU5、ALU6およびALU7とそれぞれ相互接続される。
この図10に示す接続形態において、2のn乗ビット離れた位置のALU間においてXレジスタの格納データのスワップが行なわれる。これにより、FFT処理において、バタフライ演算の対象の組として、N/2離れた位置のサンプリング点(N点FFTの場合)の演算結果を組合せることを可能にする。
図11は、このALU間相互接続用スイッチ回路44の構成の一例を示す図である。図11においては、kビット離れた位置のALU(単位ALU回路ブロック)34に対するALU間接続回路65の構成を代表的に示す。ALU回路の分離距離を示すために、ALUとして、ALUi、ALUi+kおよびALUi+2・kを示す。
スイッチ回路44においては、kビットのデータ転送線として、2本のデータ転送線TL0およびTL1が設けられる。ALU間接続回路65は、対応の単位ALU回路ブロック34のXレジスタの出力および入力部にそれぞれ結合される送信レジスタTXおよび受信レジスタRXと、経路設定用スイッチST1およびSR1またはST2およびSR2を含む。
ALUiに対するALU間接続回路65において、送信レジスタTXがスイッチST1を介して選択的にデータ転送線TL0に結合され、受信レジスタRXがスイッチSR1を介してデータ転送線TL1に結合される。
ALUi+kにおいては、受信レジスタTXが、スイッチST2を介してデータ転送線TL1に結合され、受信レジスタRXがスイッチSR2を介してデータ転送線TL0に結合される。
ALUi+2・kにおていは、送信レジスタTXおよび受信レジスタRXが、それぞれスイッチST1およびSR1を介してデータ転送線TL0およびTL1にそれぞれ結合される。すなわち、このALU間接続回路65において、スイッチが接続するデータ転送線が、送信レジスタおよび受信レジスタそれぞれに対して交互に配置される。
この図11に示すスイッチST1、SR1、ST2およびSR2は、kビット離れた位置の双方向データ転送を実現するALU間接続経路設定のために用いられる。
図12は、図11に示す送信または転送経路を設定するスイッチST1またはST2の構成の一例を示す図である。これらのスイッチST1およびST2は同一構成を有するため、スイッチST2の参照符号を括弧内に示す。
図12において、スイッチST1(ST2)は、転送制御信号U1(またはU2)に従って対応の送信レジスタTXをデータ転送線TL0(またはTL1)に結合する転送ゲートTG1と、転送制御信号D1(またはD2)に従って送信レジスタTXをデータ転送線TL0(またはTL1)に結合する転送ゲートTG2を含む。この転送ゲートTG1およびTG2は、一方の導通時、他方は非導通状態に設定される。これらの転送ゲートは、CMOSトランスミッションゲートで構成されても良く、トライステートバッファで構成されても良い。
図13は、図11に示すスイッチSR1およびSR2の構成の一例を示す図である。これらのスイッチSR1およびSR2は同一構成を有するため、図12と同様、スイッチSR2の参照符号は括弧内に示す。スイッチSR1(SR2)は、制御信号D1(D2)に従って対応の受信レジスタRXとデータデータ線TL1(TL0)に結合する転送ゲートTG3と、制御信号U1(U2)に従って対応の受信レジスタRXをデータ転送線TL1(TL0)に結合する転送ゲートTG4を含む。
制御信号U1およびD1、およびU2およびD2は、図12に示す制御信号と同様である。データの転送方向に従って制御信号U1、U2、D1、およびD2が選択的に活性化される。
図14は、kビットシフト動作時の接続経路を模式的に示す図である。図14においては、制御信号U1およびU2を活性状態とし、転送ゲートTG1およびTG3をスイッチ回路ST1、ST2およびSR1、SR2において導通状態とし、図12および図13に示す転送ゲートTG2およびTG4は、オフ状態に設定する。
この場合、図14に示すように、ALUiにおいては、送信レジスタTXがスイッチST1を介して上部方向にデータをデータ転送線TL0を介して転送し、受信レジスタRXが、データ転送線TL1を介して下方向から転送されるデータを受ける。
ALUi+kにおいては、送信レジスタTXがスイッチST2を介してデータ転送線TL1を介して受信ALUiの受信レジスタRXスイッチSR1を介してデータを送信する。ALUi+kの受信レジスタRXは、スイッチSR2を介してデータ転送線TL0を介して下方向に配置されたALUi+2kの送信レジスタTXからスイッチST1を介して転送されるデータを受信する。ALUi+2・kの受信レジスタRXが対応のスイッチSR2を介してデータ転送線TL1を介して転送されたデータを受信する。
したがって、この経路接続の場合、データ転送線TL0およびTL1においては、スイッチST1およびST2は、下方向へのデータの転送経路が遮断され、またスイッチSR1およびSR2は、上方向のデータ転送経路が遮断されており、kビット離れたALU間においてデータビットを上方向に沿って転送することができる。
図15は、kビット離れたALUに対するデータビットの下方向への転送時のスイッチ回路44の接続経路を概略的に示す図である。kビットシフトダウン動作時においては、制御信号D1およびD2が活性状態とされ、スイッチST1およびST2において、下方向にデータを転送する転送ゲートTG2がオン状態となり、転送ゲートTG1はオフ状態となる。スイッチSR1およびSR2においては、上方向からのデータを受ける転送ゲートTG3がオン状態となり、下方向からのデータを転送する転送ゲートTG4はオフ状態となる。
したがって、図15に示すように、ALUiにおいては、送信レジスタTXがスイッチST1を介してデータ転送線TL0上にデータを下方向に転送する。また、受信レジスタRXがデータ転送線TL1を介して転送されたデータを受信する。
ALUi+kは、スイッチSR2を介してALUiの送信レジスタTXからデータ転送線TL0に転送されるデータを受けて受信レジスタRXに格納する。送信レジスタTXは、スイッチST2を介して下方向にデータ転送線TL1を介してデータを転送する。
ALUi+2・kにおいては、受信レジスタRXが、このALUi+kの送信レジスタTXからスイッチST2を介して伝達されたデータをスイッチSR2を介して受信し、送信レジスタTXが、スイッチST1を介して下方向にデータ転送線TL0を介してデータを転送する。
したがって、図15において示すように、データ転送線TL0およびTL1各々においては、スイッチST1、ST2、SR1およびSR2において不要なデータ転送経路が遮断されており、確実に、kビット離れたALUへシフトダウン動作によりデータを転送することができる。
図16は、kビット離れたALU間のスワップ動作時のALU間相互接続用スイッチ回路44の接続経路を概略的に示す図である。図16において、ALUiにおいては、接続回路65においてスイッチST1が下方向を送信レジスタTXからのデータを転送する状態に制御信号D1により選択され、またスイッチSR1が、受信レジスタRXからデータ転送線TU1を介して転送されるデータを受信する状態に、制御信号D1により設定される。
ALUi+kに対するALU間接続回路65においては、送信レジスタTXに対するスイッチST2が制御信号U2により、上方向にデータを転送する状態に設定され、スイッチSR2が、受信レジスタRXに対し上部の位置の送信レジスタTXからのデータを転送する状態に制御信号D2により設定される。ALUi+2kのスイッチST1およびSR2は、ALUiのスイッチST1およびSR1と同様の状態に設定される。
この接続状態においては、ALUiの送信レジスタTXが、スイッチST1およびSR2を介してALUi+kの受信レジスタRXにデータを転送し、一方ALUi+kの送信レジスタTXが、スイッチST2およびSR1を介してALUiの受信レジスタRXにデータを転送する。同様、ALUi+2・kの送信レジスタTXがスイッチST1を介して下方向にデータを転送し、受信レジスタRXがスイッチSR1を介して下部の位置の対応のALUからのデータの受信する。
すなわち、データ転送線TL0に接続されるスイッチは、データを下方向に転送する状態に設定し、一方、データ転送線TL1に接続されるスイッチSR1およびST2においては、制御信号G1およびG2に従って、上方向にデータビットが転送される状態に設定する。これにより、kビット離れたALU(Xレジスタ)間においてデータビットの送受信を行なって、データビットのスワップを1クロックサイクルで行なうことができる。
なお、図14から図16に示す構成において、送信レジスタTXおよび受信レジスタRXは設けられず、Xレジスタの出力部および入力部が、それぞれ、直接データ転送線TL0およびTL1またはその逆に接続されてもよい。
また、このALU間接続用スイッチ回路44においては、クロスバースイッチなどとして知られるスイッチマトリクスが用いられ、このスイッチマトリクスにおいてスイッチを選択的にオン状態とすることにより、データ転送経路が設定されてもよい。
図17は、図8に示すALU(単位ALU回路ブロック)の動作シーケンスを示す図である。図17に示す動作シーケンスにおいては、1ビット加算器を利用して、2項加算演算a+bを実行する。この2項加算演算時において、FFT処理を実行するため、バタフライ演算の組の2項を生成するために、ALU間接続回路65(ALU間相互接続用スイッチ回路44)を利用して、nビット離れたALU間のXレジスタの値のシフト動作またはスワップ動作が行なわれる。
以下、図17を参照して、図8に示すALU(単位ALU回路ブロック)34における加算動作について、図8を合わせて参照して説明する。
まず、マシンサイクル(k−1)において、Vレジスタ58に、ビット“1”をセットして、演算処理実行を指定する。また、Cレジスタ56を“0”にクリアして、初期化する。
マシンサイクルkにおいて、メモリマット30からデータビットa[i]が読出され、センスアンプ62を介してXレジスタ54に転送されて格納される。このXレジスタ54の格納値は、次のマシンサイクル(k+1)において確定する。
マシンサイクル(k+1)において、メモリセルマット30からデータビットb[i]が読出され、Aレジスタ12に転送されて格納される。ビットb[i]の読出および格納と並行して、バタフライ演算の組、すなわち、nビット離れたALU回路のXレジスタの値がシフトされて格納されるかまたはスワップにより交換される。これにより、Xレジスタの値が、ビットa[i]からビットa′[i]に更新される。
マシンサイクル(k+2)において、データビットa′[i]およびb[i]が確定状態にあるため、ALU内の算術演算論理回路50において演算が実行され、その演算結果(加算結果)a′[i]+b[i]が、ビット位置c[i]に書込まれる。この演算時にキャリーが発生した場合にはCレジスタ56にキャリーの値が格納される。この加算結果の書込は、図8に示すライトドライバ60を介して実行される。
ALU(単位ALU回路ブロック)34においては、マシンサイクル(k+2)において加算結果a′[i]+b[i]が確定しており、またキャリーC[i]の有無も確定している。したがって、マシンサイクル(k+3)において、ALU(単位ALU回路ブロック)34のXレジスタ54からライトドライバ60を介してメモリマット30のビット位置c[i]に加算結果を書込むことができる。キャリーC[i]は、Cレジスタ56に格納され、その書込はまだ行なわれない。
マシンサイクル(k+4)においては、次の上位データビットa[i+1]が読出され、ALU(単位ALU回路ブロック)34に転送され、次のマシンサイクル(k+5)において、Xレジスタ54の格納データビットが、ビットa[i+1]に確定する。このマシンサイクル(k+5)において、メモリセルマット30においてビットb[i+1]が読出されて単位ALU回路ブロック34のAレジスタ52に対してデータビットb[i+1]の転送が行なわれる。このビットb[i+1]の読出および転送と平行して、Xレジスタの格納値a[i+1]が、バタフライ演算の組となるALUのXレジスタとの間でのシフトまたはスワップにより更新される。
マシンサイクル(k+6)においては、Aレジスタ52およびXレジスタ54の格納データビットが確定状態にあり、これらのビットに対して演算(加算演算)が実行され、次のマシンサイクル(k+7)において、加算結果a′[i+1]+b[i+1]が、メモリセルマットのビット位置c[i+1]の位置に書込まれる。またキャリーC[i+1]が、Cレジスタに格納される。
これらの一連の動作を、対応のエントリのデータワードaおよびbの全ビットに対して繰返しビットシリアル態様で実行することにより、データワードa′およびbの加算演算が実現される。最終ビットの加算演算結果の書込の後、Cレジスタ56が格納するキャリーCの書込が、データワードcの格納領域の最上位ビット位置に対して実行される。
メモリマット30のワード線WLの選択時、図7に示すロウデコーダ46が、これらのデータワードa、bおよびcの各ビットの記憶領域の開始時点をレジスタ群のポインタ値として格納し、各マシンサイクルごとにそのポインタ値を増分することにより、下位ビットから上位ビットの順で、加算および加算結果の格納を実現することができる。
また、2のn乗の距離離れたエントリ間のデータの移動が、ALU間接続回路65により実現され、バタフライ演算の組のデータに対して高速で演算処理を実行することができる。
演算処理操作はソフトウェアにより決定する。この場合、基本演算ブロックFB内に設けられるマイクロプログラム格納メモリ23に、FFT演算処理実行用のプログラムを格納し、コントローラ21の制御の下に、ビットシリアル態様で、演算処理を実行する。このプログラムは、特にマイクロコード化されていなくても良い。
図18は、この発明の実施の形態1に用いられる基本演算ブロックFBiの要部の構成を概略的に示す図であり、ソフトウェアにより動作設定可能な構成を示す。
図18において、メモリセルマット30は、エントリERYとして、番号0からMAX_ENTRYが付されたエントリを含む。エントリERYの各々は、ビット位置として、0からMAX_BITを有し、ビット幅は、BIT_MAX+1である。
演算処理ユニット群(ALU群)32においては、各エントリERYに対して単位ALU回路ブロック(適宜ALUと称す)34が配置される。この演算処理ユニット群(ALU群)32に対し、ALU間相互接続用スイッチ回路44が配置されている。
主演算回路20の動作は、プログラム格納メモリ23に格納されるプログラムにより設定される。コントローラ21が、このプログラム格納メモリ23に格納されたプログラムに従って処理を実行する。
このプログラム格納メモリ23に格納されるプログラムは、マイクロプログラムの形態で格納されるものの、このプログラム格納メモリ23に格納されるプログラム命令は、マイクロ命令でなくてもよく、マクロ命令であってもよい。コントローラ21が、プログラム命令をデコードし、この命令により指定された動作に必要な処理を実行することができればよい。
レジスタ群22においては、ポインタレジスタr0−r3が設けられ、演算対象のデータのメモリマット30内のアドレスが、これらのポインタレジスタr0−r3に格納される。コントローラ21は、これらのポインタレジスタr0−r3に格納されるポインタに従って主演算回路20におけるエントリまたはエントリ内位置を指定するアドレスを生成して、メモリマット30と演算処理ユニット群32との間のデータの転送(ロード/ストア)を制御し、また加えて、ALU34間の接続経路を、ALU間相互接続用スイッチ回路44のALU間接続回路(60)の接続経路を接続制御信号に従って設定して、バタフライ演算時のシフト/スワップ動作の転送経路を設定する。
図19は、図18に示すポインタレジスタr0−r3に対する操作命令(レジスタ命令)を一覧にして示す図である。レジスタ命令として、5種類の命令が準備される。
命令“reg. set n,rx”は、レジスタrxに、定数nをセットする命令である。定数nは、1つのエントリにおけるビット位置を示すものであり、1エントリのビット0からMAX_BITのいずれかの値を規定する。レジスタrxは、ポインタレジスタr0−r3のいずれかである。
命令“reg.cpy rx,ry”は、ポインタレジスタrxの内容を、ポインタレジスタryにコピーする命令である。
命令“reg.inc rx”は、ポインタレジスタrxの格納値を1増分する命令である。
命令“reg.dec rx”は、ポインタレジスタrxの格納値を1減分する命令である。
命令“reg.sft rx”は、ポインタレジスタrxの格納値を1ビット左シフトする命令である。
これらの5種類のレジスタ命令により、ポインタレジスタr0−r3の格納値(ポインタ)を操作して、メモリマットの演算対象データのビットのアドレスを指定する。
図20は、図18に示すALU(単位ALU回路ブロック)34に対する操作命令を一覧にして示す図である。以下、図20を参照して、各ALU命令の操作内容について簡単に説明する。
命令“alu.set.♯”は、レジスタ♯(X、CまたはV)に“1”を設定する命令である。このALUセット命令は、エントリ単位でレジスタのセットを指定する。
命令“ALU.clr.♯”は、レジスタ♯(Xレジスタ、Cレジスタ、またはVレジスタ)の格納値を、“0”にクリアする命令である。
命令“alu.cpy.♯1♯2”は、レジスタ♯1の格納値をレジスタ♯2へコピーする命令である。このaluコピー命令が実行されると、各エントリにおいて設けられたALU(単位LAU回路ブロック34)内においてレジスタ間でデータの転送(Move/Copy)が実行される。
図21は、メモリセルマットと単位ALU回路ブロック(ALU)との間のデータ転送を規定するALU命令のうちのロード/ストア命令を一覧にして示す図である。
命令“mem.lb@rx”は、ポインタレジスタrxの示すメモリセル位置Aj(rx)から、対応のALU内のXレジスタXjへデータをロードする命令である。
命令“mem.st@rx”は、Vレジスタ(マスクレジスタ)にビット“1”が設定されている場合に、XレジスタXjに格納されたデータを、ポインタレジスタrxが指定するアドレス位置Aj(rx)へ格納する命令である。
これらのメモリロード/ストア命令を利用することにより、ポインタレジスタrxの格納値をアドレスとして、メモリセルとALUとの間で各エントリ単位でデータの転送を行なうことができる。
図22は、ALU命令のうち、エントリ間のデータ移動(Move、Swap)を行なう命令を一覧にして示す図である。
命令“ecm.mv.n♯m”は、データ移動命令(move)における移動量を数値で規定する命令である。したがって、この命令では、Xレジスタの格納データの転送時に、エントリj+mのXレジスタの格納値が、エントリjのXレジスタに移動される。エントリ移動量mは、0からMAX_ENTRY−1の自然数をとり、リング状にデータの移動を行なうとして、最大、MAX_ENTRY離れた位置のエントリ間でデータ移動(Move)を行なうことができる。
命令“ecm.mv.r rx”は、ポインタレジスタrxに格納された値だけ離れたエントリ間でデータ移動させる命令である。この命令が実行されると、エントリj+rxのXレジスタの格納値が、エントリjのXレジスタに転送される。
命令“ecm.swp.n♯m”は、数値mで指定される値離れたエントリ、すなわちエントリjおよびj+mのXレジスタの値が交換される。
命令“ecm.swp.r rx”は、ポインタレジスタrxに格納されている値離れたエントリjおよびj+rxのXレジスタの値の交換(swap)が実行される。
この図22に一覧にして示す命令を利用することにより、各ALU(単位ALU回路ブロック)に、所望のエントリのデータを設定することができ、バタフライ演算時に、バタフライ演算の組のデータに対して正確に、バタフライ演算を実行することができ、またメモリセルマット内における格納データを並べ替えおよびアドレス変換を行なう必要がなく、1クロックサイクルでデータビットのスワップ(swap)またはシフト(move)動作を行なって、バタフライ演算を実行することができる。
なお、これらのALU命令は、対応のVレジスタの格納データが“1”のときに実行され、Vレジスタの格納値が“0”の時には、命令は実行されない。
図23は、単位ALU回路ブロック内で行なわれる演算を指定する命令を一覧にして示す図である。
命令“alu.op.adc@rx”は、ポインタレジスタrxが指定するメモリセルアドレスのデータとXレジスタに格納されたデータとを加算し、その加算結果をXレジスタに格納する動作を指定する命令である。加算演算時、全加算演算が行なわれるため、キャリー発生時、Cレジスタにキャリーが格納される。すなわちXレジスタ(Xj)には、ポインタレジスタrxが指定するアドレスのメモリセルデータAj[rx]とXレジスタに格納されたビット値XjとCレジスタに格納されたキャリーCjの排他的論理和(“^”)演算によりサムSumが生成されて、Xレジスタ(Xj)に格納される。
キャリーCjは、メモリセルデータAj[rx]とXレジスタの格納ビットXjとCレジスタの格納値Cjのビットの各ビットのAND演算(&)の論理和(+)により求められる。
この加算命令、マスクレジスタ(VレジスタVj)に“1”が設定されたときに実行され、Vレジスタ(マスクレジスタ)に“0”が設定されている場合には、このエントリにおいて加算命令は実行されない。
命令“alu.op.sbb@rx”は減算命令であり、この減算命令実行値、ポインタレジスタrxが指定するメモリアドレスのデータAj[rx]からXレジスタに格納されたビット値Xjを減算する。演算結果がXレジスタに格納され、Cレジスタには、ボローが格納される。
この減算時においては、Xレジスタに格納されたビットXjの反転値!Xjが用いられ、加算時と同様の処理が実行される。したがって、この減算命令が与えられた場合には、Xレジスタに格納された値が反転されて加算器へ与えられる(最下位ビットのキャリーが1にセットされる)。これにより、2の補数表示による減算を行なうことができる。
この減算命令も、マスクレジスタ(VレジスタVj)に格納された値が“1”のときに、演算処理が実行され、“0”が格納されているときには、減算処理は実行されない。
図24は、ALU内で行なわれる論理演算を指定する命令を一覧にして示す図である。
命令“alu.op.and@rx”は、AND命令であり、この命令実行時、ポインタレジスタrxのポインタが指定するメモリアドレスのデータAj[rx]とXレジスタに格納されたビット値Xjの論理積(AND)がとられ、その論理積結果がXレジスタに格納される。ただし、Vレジスタ(マスクレジスタ)Vの格納値(Vj)が“0”のときには、このAND命令は実行されない。以下の論理演算命令についても同様に、マスクレジスタ(VレジスタVj)の格納値が“1”のときに、指定された演算が実行され、格納値が“0”のときには、指定された演算の実行は禁止される。
命令“alu.op.or@rx”は、ポインタレジスタrxのポインタが指定するメモリアドレスのデータAj[rx]とXレジスタの格納ビットXjの論理和(OR演算)を行ない、その結果をXレジスタに格納する操作を指定する。
命令“alu.op.ex@rx”は、EXOR命令であり、ポインタレジスタrxのポインタが指定するアドレスのメモリセルデータAj[rx]とXレジスタの格納ビットXjの値の排他的論理和演算(EXOR演算)が行なわれ、その演算結果がXレジスタに格納される。
命令“alu.op.not”は、NOT命令(反転命令)であり、Xレジスタのビット値Xjを反転し、その反転結果!XjをXレジスタに格納する。
また、ポインタレジスタrxのポインタが指定するアドレスのメモリセルデータは、Aレジスタに格納される。
単位ALU回路ブロック(ALU)34を、マスクレジスタ(Vレジスタ)58、Cレジスタ56、Xレジスタ54、Aレジスタ52、および算術演算論理回路50で構成し、前述の図19から図24に一覧にして示す命令と組合せて演算処理を記述することにより、種々の演算処理を行なうことができ、特に、FFTに必要なバタフライ演算をワードパラレルかつビットシリアル態様で実行することができる。
FFT処理においては、積和演算および積差演算が繰返し実行される。以下、これらの積和演算および積差演算において利用される加算処理、減算処理および乗算処理のプログラムおよび演算シーケンスの一例について説明する。
図25は、加算演算を実行するプログラムの一例を示す図である。図25において、行番号によりプログラム内の各演算命令の行を指定し、各行において、実行される命令が記述される“//”の記号の後に、実行される演算命令の内容が説明される。したがって、この“//”の後に記述される内容は、演算内容の説明であり、何ら実行命令ではない。図25に示す加算プログラムは、2項加算処理であり、(a+b)=cの処理が実行される。以下、図25に示す加算プログラムの処理動作について説明する。
行番号0において、マスクレジスタ(Vレジスタ)に“1”が設定され、キャリーレジスタ(Cレジスタ)の格納値が“0”にクリアされる。
行番号1において、ポインタレジスタr0に定数asが格納され、ポインタレジスタr1に定数bsが格納され、ポインタレジスタr2に定数csが格納される。これらの定数as、bs、およびcsは、2項加算演算における各演算数a、bおよびcの最下位ビットの対応のエントリ内の位置を示す。
行番号2および行番号3において、加算命令が指定される。ポインタiが、0から演算データのビット幅(bit_count)−1の間、繰返し、加算が実行され、各加算命令実行ごとに、ポインタiが増分される(i++)。for文の後の中括弧で囲まれる関数の内容が、“forループ命令”の条件が満たされるまで、すなわち、ポインタiが演算対象データのビット幅の値に到達するまで、繰返し実行される。
このfor文で規定されるループ命令においては、ポインタレジスタr0の内容が、対応のALU(単位ALU回路ブロック)に転送され(ロードされ)てXレジスタに格納される。次いで、ポインタレジスタr1に格納されるポインタ値が示すアドレスのメモリセルのデータが対応のALU(単位ALU回路ブロック)へ転送されてXレジスタの格納値と加算される(Cレジスタの格納値をキャリーとして入力する)。加算結果が、ポインタレジスタr2のポインタが示すアドレス位置に格納される。この命令列において、“r0+”、“r1+”および“r2+”は、命令実行後、ポインタレジスタr0、r1およびr2のポインタが、1増分されることを示す。
行番号3において、このループ命令において実行される命令列の末尾が示される。このfor{}のループ命令が完了し、データビット列について加算処理が完了すると、行番号4において、Cレジスタの格納値が対応のALU内のXレジスタに転送され、次いで、このXレジスタの格納値が、ポインタレジスタr2が指定するアドレス位置に格納される。この処理により、加算結果により生成されたキャリーが対応のエントリのメモリセル内に格納される。
図26は、図25に示す加算操作時のデータの流れを概略的に示す図である。まず、演算数a、bおよびcのエントリERYの格納領域の最下位ビット位置as、bsおよびcsが、それぞれポインタレジスタr0、r1およびr2のポインタにより指定される。次いで、ポインタレジスタr0、r1およびr2のポインタが示すメモリセルのデータai、biが順次読出されて加算されて、その加算結果が、ポインタレジスタr2がポインタが示すメモリセル位置に格納される。演算数aおよびbが3ビットデータの場合、i=0〜2において加算およびストアが実行され、最終的にCレジスタの格納値(キャリー)が、Xレジスタを介してポインタレジスタr2のポインタが指定するビット位置(cs+3)に格納される。
演算命令“ad.op.adc@r1+”により、ALU内の算術論理演算回路の実行内容を、加算に設定することができる。
図27は、減算操作を示すプログラムの一例を示す図である。この図27に示す減算プログラムにおいては、演算数aおよびbの演算(a−b)が実行され、その減算結果cが生成される。以下、図27を参照して、この2項減算処理の操作について説明する。
まず、行番号0において、VレジスタおよびCレジスタの初期設定が、加算演算処理時と同様に実行される。
行番号1において、加算演算時と同様に、演算数a、bおよびc内のアドレスの初期設定が行なわれ、ポインタレジスタr0、r1およびr2に、各対象演算数a、bおよびcの最下位ビット位置が開始ビットas、bs、およびcsとして設定される。
行番号2および3においてループ演算命令が、加算演算実行プログラムと同様に指定される。命令“alu.op.sbb@r1+”により、演算数aから演算数bを減算する処理が実行される。ロード命令“mem.ld”およびストア命令“mem.st”は、加算時と同様であり、これらの命令により、演算データの対応のALUへの転送および減算結果のメモリマットのビット位置c[i]への格納が実行される。
行番号4の命令に従って、行番号2および3が指定するループ命令の完了後(演算数aおよびbの全ビットについての減算が完了後)、Cレジスタの内容がXレジスタに転送され、次いで、Xレジスタの内容がポインタレジスタr2のポインタが指定するメモリセル位置に格納されてボローが格納される。
減算処理における各データビットの流れは、図26に示す加算演算において“加算”に代えて“減算”が行なわれればよく、ビットbiの反転値!biとビットaiとの加算が行われる。したがって、減算操作時のデータビットの流れは、図26に示す加算演算時と同じである。
図28は、乗算a・b=cを行なう乗算プログラムの一例を示す図である。以下、図28を参照して、2項乗算演算処理について説明する。
まず、行番号0において、ポインタレジスタr2およびr3に、定数asおよびcsが指定される。この行番号0における初期設定時においては、被乗数aおよび乗算結果cの領域の初期設定が行なわれ、乗数bの領域の設定はまだ行なわれない。
行番号1において、for文において被乗数aの格納領域範囲のビット幅だけ乗算を繰返すことが指定される。“a_bit_count”は、被乗数aのビット幅を示す。
行番号2の関数部において、ポインタレジスタr2の指定する被乗数ビットa[j]が転送されてXレジスタに格納される。このXレジスタに格納された被乗数ビットa[j]が、Vレジスタ(マスクレジスタ)に格納される。この処理は、被乗数ビットa[j]が、“0”のときには、乗算を行なう必要がないためその乗算を停止し、消費電力を低減する。
行番号3の命令により、ポインタレジスタr3のポインタがポインタレジスタr0にコピーされ、次いで、ポインタレジスタr1に、定数bsが設定され、乗数bの初期アドレスが設定される。
行番号4において、Cレジスタのクリアが実行される。
行番号5において、for文により、乗数bに対する繰返し処理が指定される。値“b_bit_count”は、乗数bのビット幅を示す。
行番号6における関数文においては、ポインタレジスタr0のポインタが指定するメモリセルのデータ、すなわち乗算結果が、Xレジスタへ転送される(ロードされる)操作が規定される。次に、ポインタレジスタr1のポインタが指定する乗数ビットb[i]の対応のALUへの転送が行なわれ、Vレジスタ(マスクレジスタ)の格納値が“1”のときに、Xレジスタの乗算結果cと乗数bの対応のビットb[i]との加算が行なわれる。この加算演算命令は、Vレジスタ(マスクレジスタ)の格納値が“0”のときには行なわれない。この処理により、乗算a[j]×b[i]が実現され、この乗算結果が、それまでの部分積と加算される。
この加算結果が、ポインタレジスタr0がポインタが示す位置に転送されて格納され(ストアされ)、ポインタレジスタr0のカウント値が1増分される。この行番号6の関数文の命令が、行番号5のfor文の条件が満たされるまで、すなわち、乗数bの全ビットについて繰返し実行される。この加算処理により、1つのビットa[j]についての部分積生成とそれまでに生成された部分積との加算が実行される。
1つの乗数bの全ビットについての処理が完了すると、行番号8において、Cレジスタの格納値がXレジスタに格納され、ポインタレジスタr0のポインタが指定するアドレス位置に、このXレジスタに転送されたキャリーが格納される。これにより、1つの桁iについての部分積の加算演算処理が完了する。
次いで、行番号9において、ポインタレジスタr3のポインタが1増分され、次の桁の乗数ビットが指定される。行番号2から行番号9の演算処理が、被乗数aの各ビットについて繰返し実行される。これらの一連の処理により、ビットシリアル態様で乗算を行なうことができる。
図29は、図28に示す乗算プログラム実行時のビットの流れを模式的に示す図である。図29において、被乗数aのビットa[j]がマスクレジスタ(V)に格納される。次いで、乗算結果ビットc[j]が読出されてXレジスタに格納され、また、乗数ビットb[i]が読出されて加算が選択的に実行される。この加算時において、マスクレジスタ(Vレジスタ)に格納された被乗数ビットa[j]が“0”のときには、加算は行なわれず、Xレジスタには、乗算結果ビットc[j]が維持される。したがって、この加算結果は、c[j]+a[j]×b[i]を示しており、この加算結果が元のビット位置cjに格納される。この処理が、乗数bの全ビットについて繰返し実行される。したがって、乗数bと被乗数ビットa[j]の部分積が求められ、その部分積結果が、対応の桁の部分積ビットに加算される。これにより、被乗数aの各ビットごとに部分積を生成して、それまでの部分積とを加算する処理が繰返し実行されて、最終積が求められる。
このような加算、減算および乗算プログラムを利用して、FFT処理を実行する。
なお、乗算実行時、図29に示す領域cにおいて、乗算結果をクリアせずに、たとえば演算対象数dを格納しておけば、積和演算、すなわちd+a・bを行なうことができ、同様、dの2の補数値を格納しておくことにより、2の補数表示での積差演算処理、a・b−dを実行することができる。
また、乗算実行時においては、たとえば、単位ALU回路ブロック内にXレジスタを2つ設け、2次のブースアルゴリズムに従って、乗算を実行することも可能である。
次に、FFT処理について、サンプリング点数Nが8個である8点FFTの演算操作について説明する。
このFFTにおいて用いられる係数Wは、周期性を有しており、係数W^kとしては、N点FFTの場合、N/2−1個の係数が必要とされるだけである。以下の説明においては、“^”は、図において上付き文字で示される指数を示し、べき乗を示す。したがって、8点FFTの場合、4つの係数W^0、W^1、W^2、およびW^3が利用される。
図30は、時間間引き型8点FFTにおける信号(データ)の流れをその重み係数とともに示す図である。図30において白丸印で示すノードは、利得1のノードであり、単に加算が実行される。各信号線において付される“−1”は、対応の信号に対し(−1)倍が実行される。したがって、第1段目のバタフライ演算においては、係数W^0が用いられ、2段目のバタフライ演算時においては係数W^0およびW^2が用いられる。3段目のバタフライ演算において係数W^0からW^3が用いられる。
これらの係数W^0−W^3を用いて積和演算および積算演算を行なってFFT処理を実行する。この信号フロー図において水平方向に延びる直線が、エントリに対応する。
図31は、時間間引き型8点FFT処理時におけるメモリマット30の記憶データの配列を概略的に示す図である。図31において、メモリマット30においては、8個のエントリERY0−ERY7が利用される。メモリマット30は、処理データを格納する処理データ格納領域50と、バタフライ演算による中間結果データを一時的に格納するテンポラリー領域52と、各バタフライ演算実行時の係数データを格納する係数データ格納領域54と、対応のALU(単位ALU回路ブロック)における演算の実行の制御を行なう制御データを格納する制御データ格納領域56とを含む。
データ格納領域50は、実数成分(Reで示す)を格納する実数成分領域50rと、虚数成分(Imで示す)を格納する虚数成分領域50iに分割される。これらの領域50rおよび50iにおいては、初期設定時(ステップ1)に、各エントリに入力データの実数成分および虚数成分がが配置される。図31においては、時間間引き型FFTを実行する場合の入力データが、各エントリERY0−ERY7に順次格納される。
テンポラリー領域52も、同様、実数成分格納領域52rと、虚数成分格納領域52iに分割され、それぞれ中間演算結果の実数成分および虚数成分が格納される。
係数データ格納領域54は、8点FFTの場合、バタフライ演算段数は3段であり、1回目の計算(初段のバタフライ演算段)の係数を格納する領域54frおよび54fiと、2回目の計算の係数を格納する領域54srおよび54siと、3回目の計算の係数を格納する領域54trおよび54tiを含む。領域54tr、54srおよび54frに、係数の実数成分が格納され、領域54ti、54si、および54tiに、係数の虚数成分が格納される。この領域54に示される係数データにおいて上付き文字で示される数字は、指数を示す。
図30に示す8点FFTにおける各信号線に対応してエントリERY0−ERY7が配設されており、この信号線に対応して領域54において係数データが配置される。
制御データ格納領域56は、この1回目から3回目の計算の演算処理時において、動作可能とされるALUを設定する。この演算制御データは、各計算段に対応してメモリマット30の下位ビット0から2の領域にそれぞれ格納され、ビット0、1および2において格納される制御データが、それぞれ対応のエントリに対応して配置されるALUの演算の実行可否を設定する。この演算制御データは、後に詳細に説明するように、Xレジスタから反転または非反転でVレジスタに転送されて格納される。したがって、XレジスタからVレジスタへの転送時に反転操作が行われる場合、演算制御データが“1”のときには、対応のALUにおいて命令(シフトおよびスワップ操作を含む)は実行されず、演算制御データが“0”のときに、対応のALUにおいて命令が実行される。
上述の処理により、初期設定(ステップ1)が完了する。このメモリマット30へのデータの格納は、図2に示す内部データバス12を介して対応のコントローラ21の制御の下に実行される。
(ステップ2)
制御データ格納領域56の最下位ビット(ビット番号0)の演算制御データパターンを読出し、転送回路(センスアンプ)を介して対応のALUのXレジスタにロードし、次いで、各ALUにおいてXレジスタに格納された演算制御データを反転してVレジスタにコピーする。この結果、エントリERY1、ERY3、ERY5およびERY7に対応するALU(単位ALU回路ブロック)がアクティブ状態となり、指定された演算が実行される。
この操作においては、データ格納領域50に格納される入力データと係数データ格納領域54frおよび54fiに格納されるデータを順次読出して対応のALU(単位ALU回路ブロック)において演算処理を行ない、その処理結果をテンポラリー領域52に格納する。この演算処理においては、エントリERY1、ERY3、ERY5およびERY7において格納される入力データx[4]、x[6]、x[5]およびx[7]についての係数との乗算を行う演算処理が実行される。したがって、積和演算または積差演算を上述の加算、減算および乗算プログラム等を利用して実行することにより、複素数乗算x[i]・Wを実行し、テンポラリー領域52に演算結果が格納される。この複素数乗算時においては、データを実数成分および虚数成分にそれぞれ分割して乗算を行い、乗算の結果に対して、実数成分となる乗算成分の積差演算および虚数成分となる成分の積和演算を実行する。したがって、入力信号x[i]と係数Wの乗算結果の実数成分Reおよび虚数成分Imは、それぞれ、次式で表わされる。
Re=xiRe・wRe^0−x4Im・wIm^0、
Im=x4Re・wIm^0+xiIm・wRe^0
ここで、記号wRe^0およびwIm^0は、それぞれ係数Wの0乗の実数成分および虚数成分を示す。これらの実数成分Reおよび虚数成分Imが、それぞれ、テンポラリ領域52の領域52rおよび52iにそれぞれ格納される。
この乗算により、図30に示す信号フロー図における入力信号x[4]、x[6]、x[5]およびx[7]に対するバタフライ演算前のノードへの入力値が求められる(係数−1)の乗算はまだ行なわれていない。この乗算処理およびテンポラリ領域への乗算結果の格納により、第1回目(1段目)のバタフライ演算に対する準備処理が完了する。
この乗算の演算実行時、1例として、以下の手順で処理が実行される。前述の乗算プログラムに従って、xiIm・wImを算出し、次いでビット反転および1加算を行なって2の補数表示における反転値−xiIm・wImを生成し、実数成分格納領域52rの初期値として格納する。次いで、乗算xiRe・rReを乗算し、先の乗算プログラムにおいて示した乗算結果格納領域cに対応する領域(テンポラリ領域52の実数成分格納領域52rが用いられても良い)に格納された反転値−xiIm・wImを初期値として、積和演算を行なうことにより、最終的に領域52rに格納される値が、積和演算により求められる。
領域52iにおいて配置される値については、データxおよび係数の実数成分および虚数成分の積を求め、その和を加算演算処理により求める。この場合、ビットシリアル態様で領域50および54frおよび54fiに格納されるデータを読出して対応のALUにより演算処理を実行する。エントリERY0−ERY7において、演算制御データにより演算実行が許可されたALUにおいて並列に演算が実行される。
図33においては、図32に示す領域52rおよび52iに格納される値をそれぞれ、以後の表示の簡略化のために、実数成分tmpReiおよび虚数成分tmpImiで置換して表示する。
[ステップ3]
次いで、実際にバタフライ演算を行なうために、まず、各基本バタフライ演算において双対ノードの下側のノードの演算を実行するために、入力データのシフト動作を実行する。この場合、図33に矢印で示すように、ALU間接続用スイッチ回路44においてスイッチの接続経路を1ビット下方向シフト状態に設定する。この状態において、演算制御データは、エントリERY1、ERY3、ERY5およびERY7に対して有効状態であるため、これらのエントリERY1、ERY3、ERY5およびERY7において、コピー動作が実行され、転送データが有効状態のALUを介して対応のエントリに格納される。したがって、エントリERY0の入力データx0Reおよびx0Imが、エントリERY1にそれぞれ転送され、エントリERY2の入力データx2Reおよびx2Imが、エントリERY3に転送される。同様、エントリERY4の入力データx1Reおよびx1Imが、エントリERY5に転送され、エントリERY6の入力データx3Reおよびx3Imが、エントリERY7へ転送されて、それぞれ、実数成分格納領域50rおよび虚数成分格納領域50iに格納される。図33においては、データ格納領域52においてこの転送後のデータ配列を示す。
このコピー動作時においては、以下の手順に従ってデータの転送(コピー)動作が、図21に示すデータロード/ストア命令mem.ld/stおよび図22に示すエントリ間データ移動命令moveに従って実行される。1ビット下方向シフト状態に、ALU間接続用スイッチ回路44を設定する。メモリマット30において、各データビットを並列にエントリERY0−ERY7において読出して、対応のセンスアンプ回路を介してALU間接続回路の送信レジスタに読出データを設定して送信動作を行なう(1ビット下方向シフト動作)。次いで、演算制御データが有効状態とされるALU(単位ALU回路ブロック)において、受信レジスタが能動状態に設定され、送信データの取込が行なわれ、XレジスタまたはAレジスタを介して再び、メモリマット30へ転送される。メモリマット30において、ワード線がこの動作期間中選択状態にあれば、同一ビット位置において、エントリ間でのデータビットの転送動作を実現することができる(ライトドライバを有効状態の単位ALU回路ブロック(ALU)に対して活性状態に設定する)。
これにより、1クロックサイクルで、1ビットのデータのコピー動作を実現することができる。したがって、図33に示すように、演算対象データのコピー動作完了後、エントリERY0、ERY2、ERY4およびERY6のデータ格納領域52のデータが、それぞれ奇数エントリERY1、ERY3、ERY5およびERY7に転送されて格納される。テンポラリー領域52においては、その格納データは同一であり、また係数データ格納領域54および演算制御データ格納領域56においても、その状態は変化しない。
[ステップ4]
データ格納領域50の奇数とエントリERY1、ERY3、ERY5、およびERY7に格納されたデータとテンポラリー領域52の領域52rおよび52iに格納されたデータの実数成分および虚数成分それぞれについて減算を行ない、その減算結果を、それぞれ実数成分および虚数成分について、実数成分格納領域50rおよび虚数成分格納領域50iに格納する。この場合、演算制御データ格納領域56において、ビット位置0の制御データは、奇数エントリERY1、ERY3、ERY5、およびERY7に対してのみ有効状態であり、対応のALUにおいて、減算処理が実行される。これにより、図34に示すように、エントリERY1、ERY3、ERY5、およびERY7において、xiRe−tmpRe(i+4)およびxiIm−tmpIm(i+4)がそれぞれ格納される。この演算処理の結果、図30に示す第1段目のバタフライ演算において2点FFT(基本バタフライ演算)の下側ノードにおける演算結果が求められる。
この減算処理時においても、エントリERY0−ERY7それぞれにおいてデータの書込および読出が実行される。対応のALUにおける演算処理が選択的に制御データ格納領域56に格納された演算制御データにより制御される。無効状態(非活性状態)のALUにおいては、以下の動作が行われても良い。対応のエントリから読出されたデータがXレジスタに格納されず、単に読出データが元のメモリセル位置に書込まれる(センスアンプのリストア動作による)。また、非活性状態のALUにおいて、XおよびAレジスタの入出力を、ロード/ストア命令実行時に、ハイインピーダンス状態に設定して、ライトドライバが活性化されると、センスアンプの保持データがライトドライバを介して元のメモリセルに格納される。ライトドライバを対応のALUの活性/非活性に係らずに活性化することができ、データロード(書込)時のライトドライバの制御が簡略化される。
次いで、各基本バタフライ演算回路の双対ノードの上側ノードについての演算処理を実行するために、以下のステップ5の処理が実行される。
[ステップ5]
図35に示すように、ALU間相互接続用スイッチ回路44において、1ビット上方向シフト状態に接続経路を設定する。ALU群32においては、算術論理演算回路が加算ADDを行なう状態に設定される。また、制御データ格納領域56の最下位ビット位置0のデータパターンが、それぞれALUへ非反転で転送されてVレジスタに格納される。したがって、この状態においては、Vレジスタに“1”が格納されるのは、偶数エントリERY0、ERY2、ERY4、およびERY6に対応して配置されるALUである。ALU間相互接続用スイッチ回路44を介して転送されるデータは、転送先のXレジスタに格納される。テンポラリー領域52の実数成分格納領域52rおよび虚数成分格納領域52iを順次選択して、スイッチ回路44を介してシフトさせて偶数エントリERY0、ERY2、ERY4、およびERY6のALU(単位ALU回路ブロック)におけるXレジスタに格納する。次いで、データ格納領域50における領域50rおよび50iのデータを順次読出して対応のALUのXレジスタに格納し、加算操作ADDを行なって、その演算結果を元のビット位置に格納する。この演算時のデータの流れを、図35においては矢印で示す。
したがって、実数成分格納領域50rおよび52rの隣接エントリ間のデータの加算が行なわれ、偶数エントリの実数成分格納領域50rに加算結果が格納され、また、虚数成分については、領域50iおよび52iの隣接エントリ間の虚数成分の加算が行なわれ、加算結果が偶数エントリの虚数成分格納領域50iに格納される。奇数エントリERY1、ERY3、ERY5、およびERY7においては、転送データがXまたはAレジスタに格納されず、加算操作は行なわれず、また、XおよびAレジスタへの格納も行なわれないため、元の読出されたデータがそのまま元のメモリセル位置に再書込される。
したがって、この1ビットシフト(move)操作を伴う加算操作を行なった結果、偶数エントリのデータ格納領域50の領域50rおよび50iそれぞれにおいて、基本バタフライ演算の上側ノードの演算結果データが、図36に示すように格納される。すなわち、xiRe+tmpRe(i+4)およびxiIm+tmpIm(i+4)が、それぞれエントリERYiの実数成分格納領域50rおよび虚数成分格納領域50iに格納される。この場合、領域52、54および56に対するデータの書込は行なわれないため、保持データが維持される。
この偶数エントリERY0、ERY2、ERY4、およびERY6への演算処理が完了すると、第1回目の計算、すなわち第1段目のバタフライ演算が完了する。
[ステップ6]
2回目の計算の入力データは、1回目の計算の結果の各エントリのデータ格納領域50に格納されるデータである。したがって、2回目の計算時においては、図36に示すデータ配列が用いられ、2段目のバタフライ演算が実行される。
図37は、8点FFTの第1回目の計算が完了した際に形成された信号を示す図である。第一段目の基本バタフライ演算完了時、図37で破線で囲む領域の演算が完了し、各ノードにおいて、演算データf[0]−f[7]がそれぞれ生成される。これらの演算結果データf[0]−f[7]を用いて、2段目のバタフライ演算、すなわち2回目の計算が実行される。この場合、係数は、W^0およびW^2であり、この図37に示す信号フロー図における各水平方向の信号経路に対応してエントリにおけるデータおよび係数データが格納される(水平方向の線が各エントリに対応する)。
[ステップ6]
まず、テンポラリー領域52は、図38に示すようにクリアされ、また、データ格納領域50において実数成分格納領域50rおよび虚数成分格納領域50iにおいて演算対象データが格納される。この演算対象データは、以下の表記を簡単にするために、エントリERYiの格納演算データf[i]の実数成分および虚数成分を、それぞれ、fiReおよびfiImで表記する。
この2段目の計算時においては、先の第1段目のバタフライ演算完了時のデータが利用される。また係数データとしては、図37に示す信号経路に対応して係数データが格納される領域54srおよび54siの格納データが利用される。テンポラリー領域52は初期化される。この場合、単に領域52rおよび52iに対してはデータの書込が行なわれるだけであり、重ね書きが行なわれてもよく、初期化が行われなくても良い。
また、制御データ格納領域56のビット位置1に配置される制御データパターンがALU群へ転送されて対応のXレジスタに格納された後、反転されてVレジスタへ格納される。したがって、この2回目の計算時においては、エントリERY2、ERY3、ERY6およびERY7に対して設けられたALU(単位ALU回路ブロック)において演算が実行される。また、図37に示す係数データとの乗算を行なうノードの出力データを求めるために、各エントリERY0−ERY7に格納されるデータと、係数データ格納領域54srおよび54siにおける格納データの複素数乗算f[i]・Wが実行され、その乗算結果が、テンポラリー領域52に格納される。この複素数乗算実行時においても、単に先の書込計算時と同様、乗算、積和演算および積差演算を利用する。
これらのエントリERY2、ERY3、ERY6およびERY7の格納データに対する演算においては、メモリマット30におけるデータの書込/読出が並列に実行され、ALU群(図示せず)における演算が制御データビットに応じて選択的に非活性化されるだけであり、演算処理は並列に実行される(ビットシリアル態様でかつエントリパラレル態様で)。
この複素数乗算の結果、図39に示すように、テンポラリー領域52において、エントリERY2、ERY3、ERY6およびERY7各々に対する複素数乗算結果の実数成分および虚数成分が、それぞれ実数成分格納領域52rおよび虚数成分格納領域52iに格納される。
この複素数乗算実行時においても、先の1回目の計算時と同様の乗算アルゴリズムおよび積和/積差演算アルゴリズムが利用される。
[ステップ7]
次いで、図40に示すように、ALU間接続スイッチ回路44において、ALU間接続を2ビット下位方向にデータをシフトする経路に確立する。制御データ格納領域56において、ビット位置“1”の制御データパターンの反転データパターンが、各ALUのVレジスタに格納されている。したがって、エントリERY2およびERY3に対応するALUにおいて、エントリERY0およびERY1に対応して配置されるALUからの転送ビットを受け、また、エントリERY6およびERY7が、エントリERY4およびERY5に対応して配置されるALUからの転送データビットを受付ける。このシフト動作時においては、エントリERY0−ERY7は、すべて転送可能状態に設定され、受信動作および受信データのロードが制御データに従って選択的に活性化される。
この状態で、領域50の実数成分格納領域50rおよび虚数成分格納領域50iに格納されるデータビットの転送を実行する。この転送操作により、エントリERY0の格納データf0Reおよびf0Imが、エントリERY2へコピーされる。また、エントリERY1のデータf1Reおよびf1Imが、エントリERY3へコピーされる。同様、エントリERY4のデータf4Reおよびf4Imが、エントリERY6へ転送されて格納され、エントリERY5のデータf5Reおよびf5Imが、エントリERY7へ転送されて格納される。
これにより、先の図37に示す信号フロー図における2回目の計算のバタフライ演算における双対ノードのデータの組が準備される。
なお、図40においては、テンポラリー領域52に格納される積差結果および積和結果を、以後の計算の表記を簡略化するため、それぞれtmpReおよびtmpImの記号で表記する。
次いで、図41に示すように、活性化されたALUに対応するエントリにおいて、領域50および52に格納されたデータの実数成分同士および虚数成分同士の演算を行ない、減算結果を、領域50rおよび50iに格納する。この演算操作時、制御データは、領域56におけるビット位置1の制御データパターンであり、エントリERY2、ERY3、ERY6およびERY7において、減算が行なわれて減算結果が格納される。これにより、2回目の計算におけるバタフライ演算の双対ノードの下側のノードの出力値が算出される。
次いで、制御データ格納領域56のビット位置1の制御パターンをXレジスタへ格納し、このXレジスタのビット値を、非反転でVレジスタに格納する。したがって、この状態において、エントリERY0、ERY1、ERY4およびERY5のデータに対して演算が可能となる。ALU間相互接続用スイッチ回路44においては、図42に示すように、2ビット上方向にシフトする状態に、その接続経路を設定する。この状態で、領域52に格納されるデータと領域50に格納されるデータの実数成分および虚数成分それぞれの加算操作を実行し、その加算結果を、領域50の元の位置に格納する。図42においては、演算データの流れを矢印で示す。
したがって、この状態においては、エントリERY0の領域50のデータf[0](=f0Re+j・f0Im)とエントリERY2に格納されるデータtmpRe2+j・tmpIm2の加算が行なわれ、その加算結果が格納される。同様、エントリERY1においては、2ビット離れた位置のエントリのERY3のテンポラリー領域52の格納データとの加算が行なわれ、その加算結果が領域50に格納される。エントリERY4およびERY5においても、同様、エントリERY6およびERY7のテンポラリー領域52の格納データとの加算が実行され、その加算結果が元の位置に格納される。この演算操作により、各双対ノードにおける上側のノードの加算操作が実行される。
図43は、この加算操作完了後の、メモリマット30の格納データを示す図である。図43に示すように、エントリERY0およびERY2においては、それぞれ、積和演算結果および積差演算結果が格納され、エントリERY1およびERY3にも、同様、2項の被演算値が同じであり、これらの2項被演算値の加算および減算がそれぞれ行なわれたデータが格納される。同様、エントリERY4およびERY6においても加算および減算されたデータがそれぞれ格納され、エントリERY5およびERY7においても、加算および減算されたデータがそれぞれ格納される。この加算および減算操作により、8点FFTにおける2段目のバタフライ演算時実行時の、各双対ノードの加算ノードの出力および減算ノードの出力が求められる。
図44は、2回目の計算完了時の内部ノードの出力の態様を示す図である。すなわち、図44において破線で囲む領域のバタフライ演算が完了すると、各信号伝達経路において、データS0−S7がそれぞれ生成され、これらのデータS0−S7がそれぞれエントリERY0−ERY7に格納される。これらの値を用いて、次の第3回目の計算を実行する。この第3段目のバタフライ演算時においては、係数データとしては、係数データ格納領域54の領域54trおよび54tiに格納された係数データを利用する。
第3回目の計算においても、計算の手順は1回目および2回目と同じであり、単に双対ノードの組が異なるだけである。この第3回目の計算における各双対ノードの入力信号は、4エントリ離れた信号S0およびS4、S1およびS5、S2およびS6、およびS3およびS7の組であり、4ビットシフト動作を利用して、減算および加算を行なう。
すなわち、第3回目の計算実行時においては、まず、図43に示す制御データ格納領域56のビット位置2の制御データを反転してVレジスタに格納し、エントリERY4−ERY7のデータ格納領域50のデータに対する演算を実行する。この場合、単に係数データ格納領域54の領域54trおよび54irに格納されるデータと、データ格納領域50の格納データとの複素数乗算が実行され、その乗算結果が、テンポラリー領域52の対応のエントリに格納される。
次いで、コピー動作を行なうため、エントリERY0−ERY3のデータ格納領域50に格納されるデータが、それぞれエントリERY4−ERY7へ転送されて格納される(4ビットシフト動作によるコピー操作)。この状態で、テンポラリー領域の格納データとデータ格納領域50の格納データとの実数成分および虚数成分それぞれについて減算を行ない、その減算結果を、エントリERY4−ERY7に格納する。この操作により、図44に示す最終出力ノードにおける×(−1)演算操作が実現され、出力データX[4]−X[7]が求められる。
一方、この4ビットシフト動作(コピー操作)を実行する前に、制御データ格納領域56のビット位置2の制御データパターンをXレジスタに格納し、次いで、Xレジスタの格納値を非反転でそのままVレジスタに格納する。今度は、エントリERY0−ERY3の格納データに対する演算が実行される。この場合、4ビットシフト動作を実現する操作を行ない、テンポラリー領域に格納されたデータとデータ格納領域50に格納されたデータの加算を行ない、加算結果を元の位置に格納する。したがって、図44に示す信号フロー図の出力データX[0]−X[3]が、この加算操作により求められ、加算結果のデータが、エントリERY0−ERY3にそれぞれ格納される。
この操作により、バタフライ演算を、データビットに対して並列に実行することができ、サンプリング点数が増大する場合においても、各基本バタフライ演算が並列に実行されるため、1段のバタフライ演算に要するクロックサイクル数は増大せず、高速でFFT処理を実行することができる。
図45は、N点FFT実行時の処理操作を示すフロー図である。演算処理装置としては、これまでに示した半導体信号処理装置の主演算回路が用いられ、メモリマットにおいて、N個のエントリが準備されて利用される。以下、N点FFT処理操作について、図45を参照して説明する。
まず、メモリマットに必要なデータ、すなわち入力データx、係数データWおよび制御データがそれぞれ格納される(ステップSP1)。入力データは、データ格納領域50に、実数成分および虚数成分を分離して格納し、係数データWが、信号フロー図の経路に従って、各バタフライ演算段に応じて格納される。また制御データが、各演算回数(バタフライ演算段)に応じて所定のパターンを持って格納される。この場合、係数データが格納されるエントリの位置と、制御データパターンとは対応する。
まず、演算操作を実行するために、nを0に設定する(ステップSP2)。
この状態で、n番目の制御データパターンを読出し、この制御データパターンを用いてALU群のALU(基本ALU回路ブロック)を選択的に活性化する(ステップSP3)。この制御データパターンは、制御データを反転してALUを非活性化する論理レベルのデータであっても良く、また制御データが非反転の状態で対応のALUを非活性化する論理レベルのデータであっても良い。
この状態で、n番目の係数データWとデータ領域に格納されるデータとの複素数乗算を行ない、その乗算結果をテンポラリー領域へ格納する(ステップSP4)。
次いで、2^n離れたエントリのデータ領域のデータを下方向へシフトし、コピー操作を行なう(ステップSP5)。この場合、各ALUにおいては、制御データパターン(反転値)がマスクデータとして設定されており、活性化されたALUにおいてのみ転送データの受信およびコピー動作が実行される。
次いで、このコピーデータとテンポラリー領域のデータとの複素数減算を行ない、対応のエントリのデータ領域へ結果データを格納する(ステップSP6)。これにより、FFTのバタフライ演算の双対ノードの下側のノードについての出力データが求められる。
次いで、n番目の制御データパターンによるALUのマスク状態を反転する(ステップSP7)。この操作のために、制御データパターンを読出して、Xレジスタを介してVレジスタ(マスクレジスタ)に格納する。
この状態で、2^n離れたエントリのテンポラリー領域データの上方向シフトを行なうように接続経路を設定し、この接続状態で、活性化されたALUにおいて、対応のエントリのデータ領域に格納されたデータと2^nビット離れた位置のテンポラリー領域のデータとの加算を行ない、加算結果を対応のエントリの元のデータ領域へ格納する(ステップSP8)。この場合においても、複素数演算が実行される。この操作により、双対ノードの上側のノードの出力データが求められる。
次いで、nが2を底とするNの対数より1小さい値であるかの判定が行なわれる(ステップSP9)。すなわち、最終のバタフライ演算段の計算が完了したかの判定が行なわれる。まだ、最終FFT結果が求められていない場合には、nを1増分し、再びステップSP3へ戻り、同様の操作を実行する。一方、ステップSP9においてnが2を底とするNの対数よりも1小さい値に等しいと判定されると、最終FFT処理データが求められたとして、処理結果データが出力される。
したがって、N点FFTとして、サンプリング点が2のべき乗のFFT処理は、高速で実行することができる。すなわち、バタフライ演算に要する時間のみで、サンプリング点数にかかわらず、各バタフライ演算段の演算操作を完了することができる。したがって、ビットシリアル態様で演算操作が行なわれ、1つの基本バタフライ演算に要する時間が長い場合においても、1028点、2048点などの多くのサンプリング点に対するFFT処理を行なう場合、大幅に処理時間を短縮することができる。
なお、上述の説明においては、制御データパターンの“0”および“1”のパターンが逆であってもよい。すなわち、マスクレジスタ(Vレジスタ)への格納操作時の反転/非反転操作を反対とすることにより、制御データのビット値と対応のALUの活性/非活性の状態との対応関係を反転させることができる。
また、上述の演算処理においては、双対ノードの下側のノードの出力データを積差演算により先に求め、ついで上側ノードの出力データを積和演算により求めている。しかしながら、上側ノードの出力データを先に求め、ついで、下側ノードの出力データが求められても良い。
以上のように、この発明の実施の形態1に従えば、メモリセルマットを複数のエントリに分割し、各エントリに対応して演算回路を配置し、各エントリにおいて、対応の演算回路の演算の実行可否を制御するデータを係数データとともに格納し、この制御データを用いて係数データと処理データとの複素数乗算を行ない、またALU間接続経路をスイッチ回路により設定してコピー動作および転送動作を行なっており、各エントリにおいて並列に積和演算および積差演算各々を行ない、また加算および減算を並列に行なってバタフライ演算を実行することができ、各サンプリング点に対する基本バタフライ演算を並列に実行することができ、バタフライ演算を基本バタフライ演算単位で逐次実行する場合に比べて大幅に処理時間を低減することができる。
[実施の形態2]
図46は、この発明の実施の形態2に従う半導体信号処理装置におけるメモリマットのデータの配置を示す図である。この図46に示す構成においても、8点FFT処理を対象とし、メモリマット30は、8個のエントリERY0−ERY7に分割される。このメモリマット30は、先の実施の形態1と同様、演算対象データ格納領域50と、中間演算結果データを格納するテンポラリー領域52と、係数データを格納する係数データ格納領域54と、ALUの演算を選択的に活性化する制御データを格納する制御データ格納領域56を含む。
この発明の実施の形態2においては、偶数エントリERY0、ERY2、ERY4、およびERY6には、演算対象データの実数成分が格納され、奇数エントリERY1、ERY3、ERY5、およびERY7には、演算対象データの虚数成分が格納される。ERY0−ERY7それぞれにおいては、FFTバタフライ演算の双対ノードのデータの組の実数部および虚数部が格納される。したがって、データ格納領域50は、双対ノードに対する入力データの上側ノードの入力データを格納する領域50uと、下側ノードの入力データを格納する領域50lとを含む。
テンポラリー領域52は、2つの領域52aおよび52bに分割される。エントリが演算対象データの実数成分および虚数成分を格納するようにグループ化されており、これらの領域52aおよび52bには、それぞれ、各演算において異なる演算サイクルにおいて生成される中間演算結果が格納される。エントリを実数成分および虚数成分にグループ化することにより、双対ノードにおける入力データの算出時のエントリの指定が簡略化され、応じて、バタフライ演算時のエントリ指定のアドレス制御が簡略化される。
係数格納領域54においても、エントリの偶数/奇数に応じて、係数データが、実数部および虚数部に分割されて格納される。8点FFT処理であり、3回の計算(3段のバタフライ演算)が行なわれるため、係数データ格納領域54は、各段の係数をそれぞれ格納する領域54f、54sおよび54tに分割される。領域54f、54sおよび54tにおいては、8点FFT信号フロー図において、上側から記述される重み係数が順次実数成分および虚数成分それぞれに分割されて格納される。
すなわち、1回目の計算に用いられる係数データを格納する領域54fにおいては、係数データW^0の実数成分wRe^0と虚数成分wIm^0が、それぞれ偶数エントリおよび奇数エントリに格納される。2回目の計算に用いられる係数を格納する領域54sにおいては、係数データW^0およびW^2が利用されるため、これらの係数データW^0およびW^2の実数成分および虚数成分がエントリERY0−ERY7に順次格納される。すなわち、エントリERY0およびERY1と、エントリERY4およびERY5に、係数データW^0の実数成分および虚数成分がそれぞれ格納され、エントリERY2およびERY6には、係数データW^2の実数成分が格納され、エントリERY3およびERY7に、係数データW^2の虚数成分が格納される。
3回目の計算に用いられる係数を格納する領域54tにおいては、係数データW^0からW^3が、各々実数成分および虚数成分に分離してエントリERY0からERY7に、順次格納される。
演算制御データ格納領域56においては、先の実施の形態1と同じパターンを有する制御データが、ビット位置0から2の領域に格納される。この制御データ格納領域56に格納される制御データは、8点FFTにおいて時間間引き型のFFT処理が実行されるため、各エントリの番号の2進表示のビット反転値のパターンが、各対応のエントリに格納される。マスクレジスタに格納されるビット値の論理に応じて、この制御データパターンのビット値がすべて反転されてもよい。次に、図46に示すメモリマット30に格納されるデータを用いたFFT処理について説明する。
(ステップ1)
まず、図47に示すように、ALU群32に対しVレジスタに対するマスクビットをすべて1に設定する(V=1)。また、ALU群32における各ALUを乗算MULを行なう状態に設定する。
この状態で、ポインタレジスタ(r0−r3)を利用して、領域50lおよび54fを、演算対象領域に設定し、領域52rを中間データ格納領域に設定し、ビットシリアル態様で乗算を実行する。この乗算により、偶数エントリにおいては、実数成分同士の乗算結果が格納され、奇数エントリにおいては、虚数成分同士の乗算結果が格納される。したがって、領域52aにおいては、すべて実数成分の演算結果データが格納される。すなわち、たとえば、エントリERY0においては、実数成分x4Re・wRe^0が格納され、エントリERY1においては、虚数成分の積x4Im・wIm^0が格納される。同様にして、入力データx[4]、x[6]、x[5]およびx[7]についても、係数W^0との実数成分および虚数成分の積がそれぞれ対応のエントリに格納される。
次いで、1ビット離れたALU間のスワップ命令ecm.swpを実行し、命令間接続用スイッチ回路の接続を1ビットシフト状態に設定する。この状態で、すべてのALUにおいては、マスクビットVが1であり、演算を実行して、虚数成分の算出を行なう。この乗算結果は、図48に示すように、領域52bに格納される。
図48に示すように、ALU間相互接続用スイッチ回路44において、隣接エントリのALUを相互接続し、この接続信号伝送状態を、図16に示すスワップswapを行なう状態に設定する。このスワップ命令swap実行時においては、係数データ格納領域54fの係数データの交換が行なわれる。係数データの実数成分と虚数成分の交換後、各エントリERY0−ERY7の領域50lに格納される双対ノードの下側ノードのデータと実数成分と虚数成分が交換された係数との乗算が実行される。したがって、この乗算結果は、すべて虚数成分であり、図48に示すように、テンポラリー領域52の領域52bにおいて各対応のエントリにそれぞれ格納される。
この処理により、1段目のバタフライ演算において必要とされる2項のデータ値はすべて求められ、次いで、加算または減算が実行される。
(ステップ2)
次に、制御データ格納領域56のビット番号0の制御データパターンをALU群32へ転送し、Xレジスタを介してVレジスタに、非反転で、ビット位置0の制御データを格納する。これにより、図49に示すように、エントリERY0、ERY2、ERY4、およびERY6において、演算が実行される。このALU群32において各ALUを、減算SUBを行なう状態に設定し、また、ALU間相互接続用スイッチ回路44においては、1ビット上方向シフト状態に設定し、領域52aの偶数エントリに格納された値から、領域52aの奇数エントリに格納された値を減算する操作を実行する。
この減算処理においては、活性状態のALUにおいては、1ビット上方向にシフトされたデータをXレジスタに格納し、次いで、Aレジスタに格納された対応のエントリからのデータとの減算を実行する。したがって、まず領域52aにおいて、ワード線を立上げてデータを読出し、1ビット上方向にシフトして(スイッチ回路44を介して)、上側の偶数エントリのALUのXレジスタに、この1ビット上方向にシフトされた値が格納される。このワード線を立上げた状態で、次いで、対応のエントリのメモリセルから読出されたデータを、Aレジスタに格納する(対応のALUにおいて)。この場合、偶数エントリにおいてのみ、ALU回路が活性状態であり、この活性状態のALUのAレジスタにおいてのみ、転送データの格納が行なわれる。この状態で、Aレジスタに格納された値から、Xレジスタに格納された値の減算を行ない、その減算結果を、元の領域52aに格納する。これにより、偶数エントリERY0、ERY2、ERY4およびERY6において領域52aにおいて、積差演算結果が格納され、信号フロー図における1段目の双対ノードの下側ノードの出力値が求められる。
(ステップ3)
次いで、図50に示すように、制御データ格納領域56のビット位置0のデータを反転して、ALU群32へ転送し、奇数エントリERY1、ERY3、ERY5およびERY7に対応して配置されるALUを活性状態に設定する。また、ALU間相互接続用スイッチ回路44においては、1ビット下方向にシフトする状態にその内部の接続回路が設定される。また、ALU群32において、各ALUは加算ADDを行なう状態に設定される。この状態において、テンポラリー領域52の領域52bに格納されるデータを読出してXレジスタに格納する。このXレジスタの格納データが1ビット下方向にシフトされ、奇数エントリに対応して設けられるALUにおいて、Xレジスタに転送データの格納が行なわれる。偶数エントリのALUに対しては、接続回路がデータ送信状態に設定されており、Xレジスタへのシフトデータの格納は行なわれない。次いで、ロード命令に従って、同じビット位置において、データを再び読出し、Aレジスタに読出データを格納する。この場合、偶数エントリにおいては、Aレジスタへの格納は行なわれず、奇数エントリにおいてのみ、転送データビットのAレジスタへの格納が実行されても良く、また、Aレジスタへの格納が行われても良い。非活性状態のALUにおいて、加算処理が非活性状態とされて、また、ストア命令が無効とされ、ストア動作時においてはメモリセルの読出データがセンスアンプおよびライトドライバを介して再書き込みされても良い(ストア命令実行時、非活性のALU(単位ALUか色ブロックにおいてレジスタを全て出力ハイインピーダンス状態に設定することにより、この再書き込み動作は実現される)。
次いで、活性化されたALUにおいて加算ADDを行ない、その加算結果が、テンポラリー領域52の領域52bに格納される。この処理を繰返すことにより、奇数エントリERY1、ERY3、ERY5およびERY7の領域52bにおいて、乗算結果を加算した値の虚数成分が格納され、領域52に格納される差分値および加算値により各双対ノードの上側のノードの入力データが生成される。
(ステップ4)
次いで、制御データ格納領域56のビット位置0の演算制御データを読出して、Xレジスタを介してVレジスタに反転して格納した状態で、ALU群32の演算操作をコピー命令copyを実行する状態に設定する。このコピー操作により、テンポラリー領域52において、領域52bの格納データを領域52aへ転送する。すなわち、領域52bのデータビットが、対応のALUのXレジスタに格納される。次いで、活性状態のALUにおいて、このXレジスタに格納された値が、領域52aに転送されて格納される。非活性状態のALUにおいては、Xレジスタが出力ハイインピーダンス状態であるかまたは対応のライトドライバが非活性状態とされる。したがって、領域52aへのデータ転送時、ワード線が選択され、偶数エントリにおいて、メモリセルデータが読出されても、単に読出されたデータが、センスアンプおよびライトドライバを介してまたはセンスアンプにより再書込されるだけであり、奇数エントリERY1、ERY3、ERY5およびERY7においてのみ、領域52bの格納データの領域52aへのコピー動作が実行される。
この一連の動作完了後、図51に示すように、エントリERY0からERY7において、それぞれ、対応の双対ノードの入力データの準備が完了する。
(ステップ5)
次いで、図52に示すように、エントリERY0−ERY7それぞれにおいて、領域52aに格納される中間値と領域50uに格納されたデータとの加算を行ない、加算結果を領域50uに再び格納する。また、領域50lに格納されるデータから、テンポラリーデータ格納領域52bに格納されたデータの減算を実行する。加算および減算はいずれが先に実行されても良い。
この演算操作時においては、ALU群32においては、マスクビットVがすべて1に設定され、各ALUにおいて加算ADDおよび減算SUBが選択的に実行される。すなわち、領域50uに対する演算処理時には加算ADDが実行され、領域50lの場合には、減算が実行される。これにより、対をなすエントリERYi,ERY(i+1)において、領域50uに、双対ノードの上側のノードの出力値が格納され、領域50lにおいて、双対ノードの下側ノードの出力値が格納される。この処理により、1回目のバタフライ演算が完了し、出力データがそれぞれ生成される。
この結果、図52に示すように、図30に示す表記に従って、偶数エントリには、実数成分データが格納され、奇数エントリには、虚数成分が格納される。この領域50uおよび50lそれぞれにおいて、1つの偶数エントリおよび奇数エントリにより、1つのバタフライ演算完了後の出力データが格納され、領域50uにおいては、双対ノードの上側ノードの出力値が格納され、領域50lには、双対ノードの下側ノードの出力値が格納される。
次いで、2回目のバタフライ演算を実行するために、まず、スワップswap操作を実行する。この場合、図10に示す2ビット分離ALU間スワップの接続形態が利用される。ALU群32において、各ALUがスワップ命令swapを実行する状態に設定され、また、スイッチ回路44においては、2ビット双方向シフトを実現する接続形態に設定される。
このスワップ時においては、図53に示すように、偶数エントリ間での格納領域の異なるデータ(異なる演算結果データ)の実数成分の交換が行なわれ、奇数エントリ間においては、異なる演算結果データ、すなわち、格納領域の異なる虚数成分間の交換が実行される。このスワップ動作時においては、一例として、以下のデータ転送手順が実行される。まず、領域50lのデータが読出され、Xレジスタに格納され、次いで送信レジスタに転送される。次いで、領域50uのメモリセルデータが読出されて、対応のALUのXレジスタを介して送信レジスタに転送される。この送信レジスタを介してデータを双方向に転送することにより、それぞれ対応のALU間においてXレジスタの保持データの交換が行なわれる。この後、領域50lおよび50uに、それぞれXレジスタ(対応のALUに含まれる)に保持されるデータを格納する。これにより、スワップ動作が実現される。
この格納領域が異なるデータを並行して領域50uおよび50lに格納することはできない(同一メモリマットにおいて同時に2本のワード線を選択状態に駆動することはできない)。したがって、ALUのストア命令実行を選択的に活性化して、領域50uおよび50lに対して別のサイクルにおいてデータの転送および書込を実行する。この操作においては、例えば、Vレジスタのマスクデータを利用して選択的にALUを活性化して、スワップする組のエントリの上位側のエントリに対して先ずストア命令を実行し、次いで下位側のエントリに対してストア命令を実行する。
スワップ動作時においては、領域54および56のデータは操作されず、そのまま維持される。
図54は、このスワップ動作完了後のメモリセルマットの格納データの配置概略的に示す図である。図54に示すように、偶数エントリERY0、ERY2、ERY4、およびERY6には、実数成分Reが格納され、奇数エントリERY1、ERY3、ERY5およびERY7は、虚数成分Imが格納される。領域50uにおいては、2回目のバタフライ演算時における双対ノードの上側ノードの入力データが格納され、領域50lには、この双対ノードの下側ノードの入力データが格納される。たとえば、エントリERY0およびERY1の領域50uには、双対ノードの上側ノードのデータf0の実数成分および虚数成分がそれぞれ格納され、領域50lには、双対ノードの入力ノードの下側ノードの入力データf2の実数成分および虚数成分がそれぞれ格納される。これにより、先の図37に示す信号フロー図における2回目の計算時の双対ノードの入力データが、組をなして配列される。この状態は、先の図46に示す1回目の計算時の双対ノードの入力データの配列と同じである。したがって、各エントリにおいて第1回目の計算と同様の演算処理を実行することにより、2回目の計算(2段目のバタフライ演算)を行なうことができる。
この2回目の計算時においては、マスクレジスタのデータとしては、制御データ格納領域56のビット位置“1”の制御データパターンが用いられ、また、係数データとしては、係数データ格納領域54の領域54sに格納される係数が用いられる。
すなわち、図55に示すように、2回目の計算時において基本バタフライ演算の双対ノードの入力データ対において、実数成分および虚数成分がそれぞれ同じエントリに格納される。図55においては、エントリERY0およびERY1に格納されるデータf0およびf2を破線ブロックで代表的に示す。したがって、1回目の基本バタフライ演算時において、エントリERY0およびERY1において格納される双対ノードの入力データx[0]およびx[4]と同じ操作を行なって、バタフライ演算を実行することができる。他のエントリにおいても同様であり、エントリERYiおよびERYi+1において双対ノードの入力データが格納される。したがって、1回目の計算と同様の処理を、図54に示すデータ配列に対して実行することにより、2回目の計算(2段目のバタフライ演算)を行なうことができる。
図56は、図55に示す2回目の計算完了時における領域50の格納データの配置を示す図である。エントリERY0−ERY7においては、2回目の計算(2段目のバタフライ演算)の双対ノードの出力データが格納されており、したがって、その3回目の演算対象データも、図55に示す出力信号s0−s7と対応させて、2回目の計算時の入力データ(演算対象データ)と番号は同じとした。すなわち、エントリERY0およびERY1に、出力データs0およびs1が格納され、エントリERY2およびERY3に、出力データs2およびs3の組が格納され、エントリERY4およびERY5において、出力データs4およびs5の組が格納され、エントリERY6およびERY7に、出力データs6およびs7の組が格納される。図55においては、エントリERY0およびERY1において格納されるデータs0およびs4の組を代表的に示す。
このデータ配置においても、先の1回目の計算時と同様、偶数エントリに実数成分Reが格納され、奇数エントリに虚数成分Imが格納される。
次いで、3回目の計算を行なう場合、2回目の計算と同様に、双対ノードの入力データの組を、隣接エントリの組に格納する必要がある。したがって、図56において示すように、4ビット離れた位置のエントリ間において、双対ノードの下側のデータについて交換を行なう。すなわち、ALU群32においては、スワップ命令swapを実行する状態に設定し、またALU間相互接続スイッチ回路44においては、4ビット分離ALUの結合を行なう状態に設定する。この状態においては、エントリERY0−ERY3の領域50lの格納データが、エントリERY4−ERY7の領域50uの格納データと交換される。
この結果、図56に示すように、エントリERY0およびERY1においては、3回目の計算時における双対ノードの入力データs0およびs4が格納され、エントリERY2およびERY3には、データs1およびs5の組が格納され、エントリERY4およびERY5においては、データs2およびs6が格納され、エントリERY6およびERY7においては、判断結果データs3およびs7が格納される。この場合においても、偶数エントリにおいては実数成分Reが格納され、奇数エントリには、虚数成分Imが格納される。
したがって、この状態においては、図57において示すように、組をなすエントリにおいて、3回目のバタフライ演算実行時においても双対ノードの入力データの組が各エントリに格納されている。従って、係数データWは領域54tに格納される係数データを利用し、また、演算制御データとしては、領域56のビット位置2のデータパターンを利用して、1回目の計算時と同様の演算処理を行なうことにより、最終結果X[0]−X[7]が生成される。
この最終演算結果形成時のメモリマット30における格納データの配置を、図58に示す。すなわち、図58に示すように、エントリERY0およびERY1にFFT処理結果のデータX[0]およびX[4]が格納され、エントリERY2およびERY3に、FFT結果のデータX[1]およびX[5]が格納され、エントリERY4およびERY5に、FFT結果X[2]およびX[6]が格納され、エントリERY6およびERY7に、FFT結果のデータX[3]およびX[7]が格納される。この場合、領域50uにおいて、FFT処理結果のデータX[0]−X[3]が格納され、領域50lに、データX[4]−X[7]が格納され、偶数エントリには、実数成分Reが格納され、奇数エントリには、虚数成分が格納される。
このFFT処理結果のデータの読出時には、領域50uのデータを読出し、次いで領域50lのデータを読出すことにより、FFT処理結果を、上位データ群および下位データ群の順序に従って順次読出すことができる。この場合、さらに、1ビット分離ALU間でのスワップ動作を行なって領域50lと領域50uのデータを交換することにより、エントリERY0−ERY7に、FFT後の処理データが、領域50uおよび領域50lにおいてビット逆転順序で整列して配列される。
N点FFT処理の場合、したがって、上述の処理を、2を底とするNの対数回繰返し、かつ各バタフライ演算段の実行前に演算対象のデータの組を生成するスワップ動作時のALU間距離を、2の^n乗ずつ増分することにより、N点FFT処理を実行することができる。
図59は、実施の形態2に従ってN点FFT処理を実行する際の処理操作を示すフロー図である。以下、図59を参照して、この発明の実施の形態2に従うN点FFT処理の操作について簡単に説明する。
まず、メモリマットの初期設定が行なわれる(ステップSP20)。この初期設定時においては、メモリマットに係数データWおよび制御データが格納され、また計算回数nがクリアされる(0に設定される)。係数データWは、各計算回数(バタフライ演算段)に応じたパターンを有し、各係数データは、実数成分および虚数成分が分離され、それぞれ、偶数エントリおよび奇数エントリに格納される。また、各計算回数に応じたパターンを有する制御データが制御データ格納領域に格納される。各エントリに格納される制御データは、対応のエントリの番号をビット逆順序で記述することにより得られる。
次いで、演算データが格納される(ステップSP21)。この演算データの設定においても、演算対象データの実数成分が偶数エントリに格納され、虚数成分が奇数エントリに格納される。各エントリにおいては、双対ノードのデータが同一エントリに配設されるようにデータの格納が行なわれる。
次いで、計算回数nが0であるかの判定が行なわれる(ステップSP22)。計算回数nが1以上であり、2回目の計算以後の計算の場合には、2^nビット離れたALU間スワップ接続が行なわれ、この2^nビット離れたエントリの演算対象データの実数成分のスワップおよび虚数成分のスワップが実行される。n回目の計算時の双対ノードのデータの組を各エントリに格納する(実数成分および虚数成分について)。
1回目の計算時においては、計算回数nは0であるため、ステップSP24において、各エントリにおいて双対ノードの下側ノードの演算データと対応の係数Wとの乗算が行なわれ、乗算結果が対応のエントリの第1のテンポラリー領域(第1領域)に格納される(ステップSP24)。
次いで、1ビットスワップ動作により、1ビット離れた位置の隣接ALUを介して係数Wの交換が行なわれる(ステップSP25)。この係数交換操作時においては、係数Wの実数成分wReおよび虚数成分wImの交換が行なわれる。
各エントリにおいて、交換後の係数Wと相補対ノードの下側ノードの入力データとの乗算が行なわれ、この乗算結果が、対応のエントリのテンポラリー領域の第2テンポラリー領域(第2領域)に格納する(ステップSP26)。これにより、各エントリのテンポラリー領域において、交換前の係数データとの乗算結果が第1領域に格納され、第2領域に交換後の係数データとの乗算結果が格納される。相補対ノードの入力データ項が、準備される。
次いで、1ビットシフト操作を行ない、選択的に制御データに従ってALUを活性化し、双対ノードのエントリの同一位置間の第1領域の上位ノードエントリのデータから下位ノードエントリのデータの減算を行ない、また第2領域のデータの加算を行なう。減算結果は、上位ノードエントリの第1領域に格納し、加算結果は、下位ノードエントリの第2領域へ格納する(ステップSP27)。ここで、上位ノードエントリは、信号フロー図におけるノードの上位側のノードに対応するエントリを示し、下位ノードエントリは、信号フロー図の下位側のノードに対応するエントリを示す。
次いで、制御データパターンに従って、選択的にALUを活性化し、各下位ノードエントリにおいて第2領域データを、第1領域へ転送して格納する(コピー動作)(ステップSP28)。
次いで、各エントリにおいて、上側ノードのデータに第1領域のデータを加算し、この上側ノードデータ領域へ加算結果を格納する。また、各エントリにおいて、下側ノードの演算データから第1領域データを減算し、この減算結果を下側ノード領域に格納する(ステップSP28)。このように、1つのバタフライ演算動作が完了する。
次いで、計算回数nが2を底とするNの対数より1小さいかの判定が行なわれる(ステップSP30)。この計算回数nが、2を底とするNの対数より1小さい場合には、最後のバタフライ演算が完了したため、その生成データがFFT処理データとして出力される。一方、ステップSP30においてまだバタフライ演算段の処理が完了していないと判定されると、ステップSP31において今回のnを1増分して、ステップSP22へ戻る。この場合、判定ステップSP22においては、判定処理によりステップSP23へ処理が移行し、2^nビット離れたエントリ間において実数成分および虚数成分のスワップが行なわれ、双対ノードデータが、隣接エントリに格納されるようにデータが再配置される。以降、ステップSP24以降の処理がバタフライ演算段の操作が完了するまで繰返し実行される。
上述の操作により、N点FFT処理を実行することができる。
なお、上述の構成においてスワップ命令swapを用いて係数の交換を行なって乗算を実行している。このスワップ命令swapは、コピー命令copyを用いても実現することができる。すなわち、コピー先(ディスティネーション領域)のデータを、テンポラリー領域へ退避する。この後、コピー元(ソース領域)の格納データをコピーして、ディスティネーション領域に格納する。次いで、ソース領域に対しテンポラリー領域へ退避したデータを上書きする。これにより、ソース領域およびディスティネーション領域間でのデータのスワップ操作を実現することができる。
以上のように、この発明の実施の形態2に従えば、メモリセルマットのエントリにおいて、実数成分格納領域および虚数成分格納領域を別々に設けられている、これらの領域を利用して、各バタフライ演算を各エントリごとにスワップ操作を利用して並列に乗算、加算および減算を行なっており、サンプリング点数が増大しても、並列に基本バタフライ演算を実行することができ、高速のFFT処理が実現される。また、実数成分および虚数成分を別々のエントリに格納して処理を開始することにより、中間値処理時の操作が簡略化される。
20 主演算回路、30 メモリマット、32 ALU群、34 ALU(単位ALU回路ブロック)、ERY エントリ、40 センスアンプ群、42 ライトドライバ群、44 ALU間相互接続用スイッチ回路、65 ALU間接続回路、50 演算データ格納領域、50r 実数成分データ格納領域、50i 虚数成分格納領域、52 テンポラリー領域、52r 実数成分格納領域、52i 虚数成分格納領域、54 係数データ格納領域、54tr、54sr、54fr 実数係数成分格納領域、54ti、54si、54fi 重み係数虚数成分格納領域、54t、54S、54f 係数データ格納領域、56 制御データ格納領域、52a,52b 第1,第2テンポラリー領域。