【文献】
易 茹、外3名,“遅延デジタルフィルタの分散型積和演算回路を用いたFPGA実装の検討”,第2回電気学会東京支部栃木支所・群馬支所合同研究発表会,日本,電気学会,2012年 2月29日,pp. 18-20, 25-26,インターネット:<URL:https://kobaweb.ei.st.gunma-u.ac.jp/news/pdf/2011/ETT-11-07ekijo.pdf>
(58)【調査した分野】(Int.Cl.,DB名)
固定小数点の2進数であるN個(Nは2以上の整数)のデータx[m,n](n=1,・・・,N)の組をM組(Mは2以上の整数)含むデータセットX[m](m=1,・・・,M)と、固定小数点の2進数であるN個の係数c[n]とを入力とし、M個の積和演算の値z[m]を計算して出力する演算回路において、
前記係数c[n]を2個ずつに組み分けしたときの組毎に計算した値を出力するLUT生成回路と、
前記データセットX[m]のうちN個のデータx[m,n]の各々に係数c[n]を乗じて合算した結果である前記積和演算の値z[m]を、前記M組の各組毎に並列に計算して出力するM個の分散演算回路とを備え、
各分散演算回路は、
自回路に対応するN個のデータx[m,n]を2個ずつに組み分けした各値と前記係数c[n]を2個ずつに組み分けした各値と前記LUT生成回路によって計算された値とに基づいて、前記N個のデータx[m,n]の各々に前記係数c[n]の各々を乗じて合算した2項積和演算の値を、前記2個ずつに組み分けした各組毎に並列に計算して出力する複数の2項分散演算回路と、
前記複数の2項分散演算回路によって計算された値を合算する第1の合算回路と、
この第1の合算回路によって合算された結果の小数点以下桁数を、この小数点以下桁数よりも小さい所定の小数点以桁数に合わせる処理を行い、この処理結果を前記積和演算の値z[m]として出力する桁合わせ回路とから構成され、
各2項分散演算回路は、
前記N個のデータx[m,n]のうち同一組の2個の値のビット位置毎に設けられ、値0と、前記係数c[n]のうち同一組の2個の値と、この係数c[n]の2個の値から前記LUT生成回路によって計算された値とからなる要素値の中から、前記N個のデータx[m,n]のうち同一組の2個の値を構成する同一ビット位置の2個の値に対応する1個の要素値をビット位置毎に取得する複数の索引回路と、
前記複数の索引回路によって取得された要素値に対してビット位置別演算を行う複数のビット位置別演算回路と、
前記複数のビット位置別演算回路によって計算された値を合算した結果を前記2項積和演算の値として出力する第2の合算回路とから構成され、
前記複数のビット位置別演算回路のうち、自回路の対応するビット位置lが所定の値Lc(Lcは2以上L未満の整数)より小さいビット位置別演算回路は、自回路に対応する前記索引回路によって取得された要素値の最下位ビット側の(Lc−l)ビット分を無効化することを特徴とする演算回路。
M個(Mは2以上の整数)の各々が実部値x_real[m]と虚部値x_imag[m](m=1,・・・,M)とに分かれる、M個の複素数X[m](m=1,・・・,M)と、実部値c_realと虚部値c_imagとに分かれる複素数係数Cとを入力とし、実部の積和演算の結果と虚部の積和演算の結果とからなるM個の複素数値Z[m]を計算して出力する演算回路において、
前記複素数係数Cの実部値c_realと虚部値c_imagの差の値d_subと、実部値c_realと虚部値c_imagの和の値d_addとを計算するLUT生成回路と、
前記複素数X[m]のうち自回路に対応するデータの各々に前記複素数係数Cを乗じて合算した結果である複素数値Y[m]を、前記M個の各々について並列に計算して出力するM個の分散演算回路と、
このM個の分散演算回路から出力された複素数値Y[m]のうち、実部の積和演算の結果y_real[m]の小数点以下桁数と虚部の積和演算の結果y_imag[m]の小数点以下桁数のそれぞれを、これらの小数点以下桁数よりも小さい所定の小数点以桁数に合わせる処理を行い、この処理結果を前記複素数値Z[m]を構成するz_real[m],z_imag[m]として出力するM個の桁合わせ回路とを備え、
各分散演算回路は、
前記複素数X[m]の実部値x_real[m]および虚部値x_imag[m]のビット位置毎に設けられ、値0、c_real、−c_imag、d_subからなる要素値の中から、前記実部値x_real[m]および前記虚部値x_imag[m]のうち自回路に対応するビット位置の2個の値に対応する1個の要素値をビット位置毎に取得する複数の第1の索引回路と、
前記複数の第1の索引回路によって取得された要素値に対してビット位置別演算を行う複数の第1のビット位置別演算回路と、
前記複数の第1のビット位置別演算回路によって計算された値を合算した結果を前記実部の積和演算の値y_real[m]として出力する第1の合算回路と、
前記複素数X[m]の実部値x_real[m]および虚部値x_imag[m]のビット位置毎に設けられ、値0、c_imag、c_real、d_addからなる要素値の中から、前記実部値x_real[m]および前記虚部値x_imag[m]のうち自回路に対応するビット位置の2個の値に対応する1個の要素値をビット位置毎に取得する複数の第2の索引回路と、
前記複数の第2の索引回路によって取得された要素値に対してビット位置別演算を行う複数の第2のビット位置別演算回路と、
前記複数の第2のビット位置別演算回路によって計算された値を合算した結果を前記虚部の積和演算の値y_imag[m]として出力する第2の合算回路とから構成され、
前記実部の積和演算c_real×x_real[m]−c_imag×x_imag[m]の結果であるy_real[m]と、前記虚部の積和演算c_imag×x_real[m]+c_real×x_imag[m]の結果であるy_imag[m]とを、前記M個の各々について並列に計算して出力するものであり、
前記複数の第1、第2のビット位置別演算回路のうち、自回路の対応するビット位置lが所定の値Lc(Lcは2以上L未満の整数)より小さいビット位置別演算回路は、それぞれ自回路に対応する前記第1、第2の索引回路によって取得された要素値の最下位ビット側の(Lc−l)ビット分を無効化することを特徴とする演算回路。
【背景技術】
【0002】
ディジタル信号処理における主な演算は、固定小数点の2進数として表現されたディジタル信号のデータに、同じく固定小数点の2進数として表現された係数を乗じて、これらを合算する積和演算である(非特許文献1参照)。
図11に、一般的な積和演算回路の構成を示す。
【0003】
図11の積和演算回路は、各々が2進数で表現されたN個のデータx[n](n=1,・・・,N)と係数c[n](n=1,・・・,N)とを入力とする。ここで、各データx[n]は固定小数点の2進数であり、その小数点以下桁数(小数点以下のビット幅)はx_scaleである。また、各係数c[n]は固定小数点の2進数であり、その小数点以下桁数はc_scaleである。
【0004】
積和演算回路は、N個の乗算回路1000−n(n=1,・・・,N)を備える。各乗算回路1000−nは、データx[n]と係数c[n]との乗算c[n]×x[n]を行い、その結果w[n]を出力する。ここでの乗算は単純な2進数の乗算であるため、w[n]を固定小数点数として扱う場合の小数点以下桁数は、x_scale+c_scaleとなる。
【0005】
また、積和演算回路は、合算回路1001を備える。合算回路1001は、w[n](n=1,・・・,N)の合算Σ
n=1,・・・,N(c[n]×x[n])を行い、その結果yを出力する。ここでの合算は単純な2進数の加算を繰り返す演算であるため、yを固定小数点数として扱う場合の小数点以下桁数は、w[n]の小数点以下桁数と同じく、x_scale+c_scaleとなる。
【0006】
さらに、積和演算回路は、桁合わせ回路1002を備える。桁合わせ回路1002は、yの下位ビット切捨あるいは四捨五入によって、その小数点以下桁数を、積和演算回路が出力すべき固定小数点数zの小数点以桁数z_scaleに合わせる。通常は、小数点以桁数z_scaleは、sの小数点以下桁数x_scale+c_scaleよりも小さい値である。したがって、切捨処理を行う桁合わせ回路1002は、yの下位の(x_scale+c_scale−z_scale)個のビットを削除した値を出力する。また、四捨五入処理を行う桁合わせ回路1002は、前記の切捨処理によって削除されるビットのうち最上位1ビットを、切捨処理で残った値に加算した値を出力する。
【0007】
桁合わせ回路1002が、合算回路1001によって合算された値yに対して切捨処理あるいは四捨五入処理を行う理由を以下に説明する。
一般的にデータや係数には雑音成分が含まれており、特に下位ビットにおいて、信号成分に対する雑音成分の比率が大きくなる。したがって、データと係数の乗算結果についても、その下位ビットにおいて、雑音成分の比率が大きくなる。特に、乗算結果を表すビットのうち、データの小数点以下桁数または係数の小数点以下桁数よりも下位のビットには、量子化雑音が含まれる。
【0008】
また、ディジタル信号処理において、ある積和演算回路が出力した値は、通常、さらに別の係数値を用いた別の積和演算回路の入力となる。このように積和演算が多段に行われるとき、入力値の桁数と比べて出力値の桁数が増加すると、後段の積和演算回路において扱う桁数が増大するため、回路規模や消費電力が増大するという問題を生じる。
【0009】
また、前段の積和演算回路内でデータと係数との乗算が行われるため、桁合わせ回路1002によって桁数を縮小しない場合の乗算以後の桁数は、データと係数の各桁数の和以上となる。したがって、前段の積和演算回路が桁数を縮小しないで出力した値を、その後段の積和演算回路が入力して演算を行う構成では、前段の積和演算回路よりも後段の積和演算回路の方が、回路規模や消費電力が大幅に増大することになる。
【0010】
したがって、後段の積和演算回路が、前段の積和演算回路によって桁数が増大した値を入力して演算を行っても、雑音成分の比率が大きい下位ビットを対象とした演算処理からは、有意な結果を得ることができない。さらに、後段の積和演算処理を担う回路の面積やその回路が消費した電力は、前記の桁数の増大によって大幅に増大するため、無駄な回路面積や消費電力が大幅に増大するという問題を生じる。
【0011】
そこで、
図11の積和演算回路では、桁合わせ回路1002によって、雑音成分の高い下位ビットを削除し、有意なビット幅に限定して後段に出力することにより、後段回路のコスト(面積や消費電力)を削減している。
【0012】
このように、回路規模や消費電力を削減するため、従来の積和演算回路では、その出力値に対して雑音成分の高い下位ビットを削除する処理を行っている。しかしながら、内部の乗算回路1000−n自体は、雑音成分の高いビットであるか否かに関わらず、正確な乗算処理を行っていた。したがって、従来の積和演算回路内の乗算回路1000−nによって正確に算出された下位ビットは、桁合わせ回路1002によって雑音成分の高いビットとして削除されていた。
【0013】
乗算回路1000−nは、桁数の増加に対して回路規模や消費電力が大幅に増大する特性をもっている(バランスツリー型の乗算回路では桁数の2乗に比例する)。このため、桁数の増加は回路素子や消費電力の増大を招くが、乗算回路1000−nにより正確に算出された下位ビットは、桁合わせ回路1002によって雑音成分の高いビットとして削除される。
【0014】
したがって、従来の積和演算回路で使用されていた乗算回路1000−n内には、雑音成分が高いために桁合わせ回路1002によって無効化される下位ビット値を正確に計算するための回路が含まれており、この下位ビット値を正確に計算するための回路の面積やその回路が消費した電力は無駄になっていた。特に、ディジタル信号処理システムの精度向上のためのデータの桁数や係数の桁数を増やす場合に、無駄な回路面積と消費電力の増大を招くという課題があった。
【発明を実施するための形態】
【0024】
[第1の実施例]
以下、本発明の実施例について図面を参照して説明する。
図1は本発明の第1の実施例に係る演算回路の構成を示すブロック図である。本実施例の演算回路は、M組(Mは2以上の整数)のデータセットX[m](m=1,・・・,M)と、N個(Nは2以上の整数)の係数c[n](n=1,・・・,N)とを入力とする。各データセットX[m](m=1,・・・,M)は、N個のデータx[m,n](n=1,・・・,N)の組からなる。なお、データx[m,n]および係数c[n]の各々は、符号付きの固定小数点数を表現する、2の補数の2進数である。各データx[m,n]の小数点以桁数をx_scale、各係数c[n]の小数点以桁数をc_scaleとする。
【0025】
図1の演算回路は、上記入力に対して、M個の積和演算の値z[m](m=1,・・・,M)を計算して出力する。演算回路が出力する積和演算の値z[m](m=1,・・・,M)の各々は、データセットX[m](m=1,・・・,M)を構成するN個のデータx[m,n](n=1,・・・,N)の各々に係数c[n]を乗じて合算した結果、すなわちΣ
n=1,・・・,N(c[n]×x[m,n])に相当する結果から、雑音成分の高い下位ビットを削除して有意なビット幅に限定した値である。なお、積和演算の値z[m]は、符号付きの固定小数点数を表現する、2の補数の2進数であり、その小数点以桁数をz_scaleとする。
【0026】
図1の演算回路は、1個のLUT生成回路1と、M個(Mは2以上の整数)の分散演算回路2−1〜2−Mとから構成される。
LUT生成回路1は、積和演算の係数であるN個の係数c[n](n=1,・・・,N)を入力とし、これらを2個ずつの組に分けたときの各組の値から、分散演算用LUTの要素として使用する値を計算する。そして、LUT生成回路1は、計算した値を係数c[n]と併せて各分散演算回路2−1〜2−Mに分配する。
【0027】
係数c[n](n=1,・・・,N)を2個ずつに組み分けする方法は、後述する各分散演算回路2−m(m=1,・・・,M)において行われる、分散演算に基づいた2項の積和演算の計算c[p]×x[m,p]+c[q]×x[m,q](pとqはそれぞれ1からNまでの範囲内の整数で、p≠q)でのc[p]とc[q]の組み分けと同じにする必要がある。
【0028】
本実施例では、係数c[n]を、番号順が連続する奇数番目の値と直後の偶数番目の値の2個の組に組み分けする方法を説明する。したがって、本実施例では、2個ずつの組み分けにより、c[1]とc[2]、c[3]とc[4]、・・・というように、c[2×n’−1]とc[2×n’](n’=1,・・・,N’、N’はN/2以下で最大の整数)が同じ組に属する。前記のN’の値は、Nが偶数の場合にN/2であり、Nが奇数の場合に(N−1)/2である。
【0029】
なお、本発明はこの組み分け方法に限定されず、係数c[n]の組み分け方法は、各分散演算回路2−m(m=1,・・・,M)において行われる分散演算に基づいた2項の積和演算での組み分け方法と同じであればよい。
【0030】
LUT生成回路1は、係数c[n](n=1,・・・,N)を2個ずつに組み分けした値c[2×n’−1]とc[2×n’](n’=1,・・・,N’)の和、すなわちc[2×n’−1]+c[2×n’]をd[n’]として計算し、係数c[n](n=1,・・・,N)と計算した値d[n’](n’=1,・・・,N’)とを、各分散演算回路2−1〜2−Mに出力する。
【0031】
なお、本発明は、以上の計算に限定されず、各分散演算回路2−m(m=1,・・・,M)において用いられる分散演算用LUTの要素を生成するための計算であればよい。また、LUT生成回路1により計算された値d[n’]は、符号付きの固定小数点数を表現する、2の補数の2進数である。
【0032】
分散演算回路2−m(m=1,・・・,M)の各々は、N個のデータx[m,n](n=1,・・・,N)から構成されるデータセットX[m]と、LUT生成回路1から分配された係数c[n](n=1,・・・,N)およびLUT生成回路1で計算された値d[n’](n’=1,・・・,N’)とを入力とし、データセットX[m]のうち自回路に対応するN個のデータx[m,n](n=1,・・・,N)の各々に係数c[n]を乗じて合算した結果、すなわち、Σ
n=1,・・・,N(c[n]×x[m,n])に相当する値z[m]を出力する。
【0033】
図2に、分散演算回路2−m(m=1,・・・,M)の構成を示す。各分散演算回路2−mは、N’個の2項分散演算回路20m−n’(n’=1,・・・,N’)と、分散演算結果合算回路21mと、桁合わせ回路22mとから構成される。
【0034】
図2の分散演算回路2−mは、入力されたデータセットX[m]のうち自回路に対応するN個のデータx[m,n]に対して、LUT生成回路1が係数c[n](n=1,・・・,N)に対して行った2個ずつの組み分けと同様に、2個ずつの組み分けを行う。
【0035】
本実施例のLUT生成回路1は、係数c[n](n=1,・・・,N)のうち番号が連続する奇数番目の値と直後の偶数番目の値の2個を同じ組みとして組み分けしている。このため、各分散演算回路2−mが行うN個のデータx[m,n]の組み分けについても同じく、x[m,2×n’−1]とx[m,2×n’](n’=1,・・・,N’、N’はN/2以下で最大の整数)を1つの組とする。
【0036】
2項分散演算回路20m−n’(n’=1,・・・,N’)の各々は、自回路に対応する1組みのデータx[m,2×n’−1],x[m,2×n’]と、係数c[n](n=1,・・・,N)のうち自回路に対応する1組みの係数c[2×n’−1],c[2×n’]と、LUT生成回路1により計算された値d[n’]とを入力とする。
【0037】
2項分散演算回路20m−n’は、値0、c[2×n’−1]、c[2×n’]、d[n’]を各要素の数値とするLUTを構成し、このLUTを用いた分散演算によって、積和演算c[2×n’−1]×x[m,2×n’−1]+c[2n’]×x[m,2×n’]の結果を取得してy’[m,n’]として出力する。なお、積和演算の結果y’[m,n’]は、符号付きの固定小数点数を表現する、2の補数の2進数である。
【0038】
分散演算結果合算回路21mは、各2項分散演算回路20m−n’(n’=1,・・・,N’)が出力した値y’[m,n’]を合算、すなわち、Σ
n'=1,・・・,N'(y’[m,n’])を計算し、その結果をy[m]として出力する。
【0039】
なお、以上の分散演算回路2−mの説明はNが偶数の場合であり、Nが奇数の場合は、
図2に示すように、c[N]×x[m,N]を計算して結果をy’[m,N’+1]として出力する補助乗算回路23mを追加する。
【0040】
さらに、Nが奇数の場合、分散演算結果合算回路21mは、各2項分散演算回路20m−n’(n’=1,・・・,N’)が出力した値y’[m,n’](n’=1,・・・,N’)と補助乗算回路23mが出力した値y’[m,N’+1]とを合算して、結果をy[m]として出力する。
【0041】
桁合わせ回路22mは、分散演算結果合算回路21mから出力された積和演算の結果y[m]の下位ビット切捨あるいは四捨五入によって、y[m]の小数点以下桁数を、演算回路が出力すべき固定小数点数の小数点以桁数z_scaleに合わせる処理を行い、その処理結果をz[m]として出力する。z_scaleは、y[m]の小数点以下桁数y_scaleよりも小さい値である。
【0042】
したがって、切捨処理を行う桁合わせ回路22mは、y[m]の下位の(y_scale−z_scale)個のビットを削除した値を出力する。また、四捨五入処理を行う桁合わせ回路22mは、前記の切捨処理によって削除されるビットのうち最上位1ビットを、切捨処理で残った値に加算した値を出力する。
【0043】
図3に、2項分散演算回路20m−n’(m=1,・・・,M、n’=1,・・・,N’)の構成を示す。ここで、2進数で表現された任意のデータx[m,n](m=1,・・・,M、n=1,・・・,N)の1個分のビット幅をLとし、2項分散演算回路20m−n’が入力とするデータx[m,2×n’−1]の各ビットをx[m,2×n’−1][l](l=1,・・・,L)、x[m,2×n’]の各ビットをx[m,2×n’][l](l=1,・・・,L)とする。
【0044】
図3に示した2項分散演算回路20m−n’は、L個のLUT索引回路200m−n’−l(選択回路)と、L個のビット位置別演算回路201m−n’−lと、合算回路202m−n’とから構成される。
【0045】
2項分散演算回路20m−n’は、データx[m,2×n’−1],x[m,2×n’]のビット位置l(l=1,・・・,L)毎に設けられたLUT索引回路200m−n’−lを有する。LUT索引回路200m−n’−lは、データx[m,2×n’−1]とx[m,2×n’]のうち自回路に対応するビット位置lにあるビットx[m,2×n’−1][l]とx[m,2×n’][l]とに基づいて、LUTの要素4個から1個を選択し、この選択した要素値をLUT#m−n’−lとして取得する。なお、LUT#m−n’−lは、符号付きの固定小数点数を表現する、2の補数の2進数である。
【0046】
図4に、ビットx[m,2×n’−1][l]およびx[m,2×n’][l]の各値と、そのとき選択されるLUTの要素値LUT#m−n’−lとの関係を示す。ビットx[m,2×n’−1][l]およびx[m,2×n’][l]の各値と要素値LUT#m−n’−lとの関係は、一般的な2項の積和演算を分散演算を用いて行う場合のLUTにおけるアドレスと記憶値との関係と同じである。LUT#m−n’−lの値は、(c[2×n’−1]×x[m,2×n’−1][l]+c[2×n’]×x[m,2×n’][l])となる。
【0047】
図3に示した2項分散演算回路20m−n’において、LUT索引回路200m−n’−lによってビット位置l(l=1,・・・,L)毎に選択された、LUTの要素値LUT#m−n’−lは、それぞれビット位置別演算回路201m−n’−lによってビット位置別演算が施される。
【0048】
合算回路202m−n’は、L個のビット位置別演算回路201m−n’−lによって計算されたビット位置別演算結果BR#m−n’−lを合算した結果、すなわち、Σ
l=1,・・・,L(BR#m−n’−l)をy’[m,n’]として出力する。
図5を用いて、2項分散演算回路20m−n’の演算の概念を説明する。
【0049】
ビット位置別演算回路201m−n’−lは、自回路の対応するビット位置lがLc(Lcは2以上L未満の整数)より大きい場合(l=Lc+1,・・・,L)に、自回路に対応するLUT索引回路200m−n’−lによって選択された要素値LUT#m−n’−lに対して、(l−Lc)ビット分の左シフト演算を行った結果を、ビット位置別演算結果BR#m−n’−lとして出力する。
【0050】
この左シフト演算は、要素値LUT#m−n’−lに対して2
(l-Lc)を乗じたことと等価であり、左シフト演算によってLSB側に追加される(l−Lc)個のビット値は0である。
図5で言えば、ビット位置別演算結果BR#m−n’−(L−1)が、ビット位置lがLcより大きい場合の例を示している。
【0051】
ただし、l=Lのビット位置(データのMSB位置)に対応するビット位置別演算回路201m−n’−Lは、LUT索引回路200m−n’−Lによって選択された要素値LUT#m−n’−Lに対して符号反転を行った後
に(L−Lc)ビット分の左シフト演算を行った結果を、ビット位置別演算結果BR#m−n’−Lとして出力する。
【0052】
また、ビット位置別演算回路201m−n’−lは、自回路の対応するビット位置lがLcより小さい場合(l=1,・・・,Lc−1)に、自回路に対応するLUT索引回路200m−n’−lによって選択された要素値LUT#m−n’−lに対して、(Lc−l)ビット分の右シフト演算を行った結果を、ビット位置別演算結果BR#m−n’−lとして出力する。
【0053】
この右シフト演算は、要素値LUT#m−n’−lを2
(Lc-l)で除したことに相当し、右シフト演算前のLSB側(Lc−l)個のビット値は、右シフト演算後、回路によって保持されず無効となる。この右シフト演算の処理は、要素値LUT#m−n’−lのLSB側(Lc−l)個のビットに対して切捨処理を施すことと等価である。
図5で言えば、ビット位置別演算結果BR#m−n’−(Lc−1),BR#m−n’−1が、ビット位置lがLcより小さい場合の例を示している。
【0054】
また、l=Lcのビット位置に対応するビット位置別演算回路201m−n’−Lcは、自回路に対応するLUT索引回路200m−n’−Lcによって選択された要素値LUT#m−n’−Lcに対して演算を行わず、要素値LUT#m−n’−Lcをそのままビット位置別演算結果#m−n’−Lcとして出力する。
【0055】
上述のように、ビット位置lがLcより小さい場合の各要素値LUT#m−n’−l(l=1,・・・,Lc−1)は、ビット位置別演算回路201m−n’−lでの(Lc−l)ビット分の右シフト演算によって、LSB側(Lc−l)個のビット値が無効となる。また、通常は、LUT索引回路200m−n’−lがLUTの要素値4個の中から1個を選択するために、要素値のビット位置毎に、4個のビット値から1個のビット値を選択する4:1セレクタ回路が用いられる。
【0056】
そこで、要素値LUT#m−n’−lの各ビットのうち、ビット位置別演算回路201m−n’−lにより無効となるLSB側(Lc−l)個のビットについては、前記の4:1セレクタ回路を省くことにより、LUT索引回路200m−n’−lの回路規模を削減することが可能である。
【0057】
各ビット位置別演算回路201m−n’−l(l=1,・・・,L)から出力されるビット位置別演算結果BR#m−n’−lは、合算回路202m−n’によって合算され、その合算結果Σ
l=1,・・・,L(BR#m−n’−l)が上記のy’[m,n’]として出力される。
【0058】
本実施例では、ビット位置lに応じて異なるビット数の左シフト演算あるいは右シフト演算が行われているため、各ビット位置別演算結果BR#m−n’−lは、それぞれ異なるビット幅となっている。そこで、合算回路202m−n’は、最大のビット幅、すなわち、ビット位置別演算結果BR#m−n’−Lのビット幅に、他のビット位置別演算結果BR#m−n’−1〜BR#m−n’−(L−1)のビット幅を合わせた後に、各ビット位置別演算結果BR#m−n’−l(l=1,・・・,L)の合算を行う。
【0059】
各ビット位置別演算結果BR#m−n’−lは、符号付きの固定小数点数を表現した、2の補数の2進数である。したがって、前記のビット幅合わせでは、その符号ビットS#lと同じ値のビットをMSB側に追加する必要がある。
【0060】
なお、ビット位置lがLcより小さい場合(l=1,・・・,Lc−1)に、ビット位置別演算回路201m−n’−lが要素値LUT#m−n’−lに対して(Lc−l)ビット分の右シフト演算を行うとき、無効化されるLSB側(Lc−l)個のビットのうちMSB側1ビットの値を、前記右シフト演算の結果に加算して、ビット位置別演算結果BR#m−n’−lとすることも可能である。この処理は、要素値LUT#m−n’−lのLSB側(Lc−l)個のビットに対して四捨五入処理を施すことと等価である。
【0061】
各2項分散演算回路20m−n’が出力する値y’[m,n’]は、データx[m,n]と係数c[n]との積和演算の結果である。従来の技術(乗算と加算を組み合わせた演算)により積和演算の結果を得た場合の小数点以下桁数は、データx[m,n]の小数点以下桁数x_scaleと係数c[n]の小数点以下桁数c_scaleとの和、すなわち、x_scale+c_scaleである。また、積和演算を通常の分散演算(本実施例におけるパラメタLcの値を1とした場合に相当する)により行った場合も、積和演算の結果の小数点以下桁数はx_scale+c_scaleである。
【0062】
これに対して、本実施例では、
図6に示したように、(Lc−l)個の下位ビットが無効化されているため、各2項分散演算回路20m−n’が出力する値y’[m,n’]の小数点以下桁数y’_scaleは、無効化されたビット数分だけ短くなるので、x_scale+c_scale−Lc+1となる。
【0063】
このように、本実施例の演算回路は、全ビットに対して正確な乗算を行う乗算回路ではなく、データのビット位置l毎にLUTから要素値LUT#m−n’−lを取得し、要素値LUT#m−n’−lに対して、ビット位置lに応じて予め指定された下位ビット、本実施例では(Lc−l)個の下位ビットについて、無効化した上で、これらを累積する分散演算を行う。
【0064】
これにより、本実施例では、無効化を行わない従来の演算回路と比較して、無効化されたビットに対する累積処理が不要となるため、その分の回路面積や消費電力を削減できる。また、無効化された下位ビットには雑音成分が多く含まれているため、従来の演算回路においても桁合わせ回路22mによって四捨五入処理や切捨処理が施されるので、本実施例の下位ビット無効化は、演算回路が出力する値の精度を劣化させない。
【0065】
すなわち、本実施例の演算回路は、上位ビットと下位ビットを区別せずに全ビットに対して正確な乗算を行う乗算回路ではなく、データのビット位置l毎にLUTから要素値LUT#m−n’−lを取得して累積する分散演算を採用し、ビット位置l毎に予め指定された下位ビットの処理を省くことにより、演算精度の劣化なく、回路の面積・電力を削減できる効果がある。
【0066】
特に、本実施例の演算回路は高速化のために、分散演算回路内のデータのビット位置l毎のLUT検索と累積を同時に行うためのデータビット幅分の並列化と、M個のデータセットに対する分散演算を同時に行うための分散演算回路の個数分の並列化を行っている。このため、本実施例の演算回路では、上記の無効化されたビットに対する累積処理に要する回路規模が増大しており、下位ビットの処理を省くことによる回路の削減効果は大きい。
【0067】
[第2の実施例]
次に、本発明の第2の実施例について説明する。
図7は本発明の第2の実施例に係る演算回路の構成を示すブロック図である。
図7の演算回路は、各々が実部値x_real[m]と虚部値x_imag[m](m=1,・・・,M)とに分かれる、M個(Mは2以上の整数)の複素数X[m](m=1,・・・,M)と、実部値c_realと虚部値c_imagとに分かれる複素数係数Cとを入力とする。なお、データx[m,n](m=1,・・・,M、n=1,・・・,N)は、負の値も取り得る符号付き数値(2の補数による2進数で表現された数値)である。各複素数X[m](m=1,・・・,M)の実部値x_real[m]および虚部値x_imag[m]の小数点以桁数をx_scale、複素数係数Cの実部値c_realおよび虚部値c_imagの小数点以桁数をc_scaleとする。
【0068】
また、2進数で表現された任意のデータx_real[m](m=1,・・・,M)およびx_imag[m](m=1,・・・,M)の1個分のビット幅をLとし、後述する分散演算回路2a−mが入力とするデータx_real[m]の各ビットをx_real[m][l](l=1,・・・,L)、x_imag[m]の各ビットをx_imag[m][l](l=1,・・・,L)とする。
【0069】
図7の演算回路は、上記入力に対して、実部値z_real[m]と虚部値z_imag[m](m=1,・・・,M)とに分かれる、M個の複素数値Z[m](m=1,・・・,M)を、分散演算(distributed arithmetic)により取得し出力する。M個の複素数値Z[m]は、各々が(C×X[m])に相当する。すなわち、実部値z_real[m]は、c_real×x_real[m]−c_imag×x_imag[m]に相当する。虚部値z_imag[m]は、c_imag×x_real[m]+c_real×x_imag[m]に相当する。
【0070】
ただし、実部値z_real[m]と虚部値z_imag[m]とは、複素数X[m]と複素数係数Cとの乗算結果に対して、雑音成分の高い下位ビットを削除して有意なビット幅に限定した値である。つまり、実部値z_real[m]は、c_real×x_real[m]−c_imag×x_imag[m]と完全に一致するとは限らない。同様に、虚部値z_imag[m]は、c_imag×x_real[m]+c_real×x_imag[m]と完全に一致するとは限らない。なお、実部値z_real[m]と虚部値z_imag[m]とは、符号付きの固定小数点数を表現する、2の補数の2進数であり、その小数点以桁数をz_scaleとする。
【0071】
図7に示す演算回路は、1個のLUT生成回路1aと、M個(Mは2以上の整数)の分散演算回路2a−1〜2a−Mと、M個の桁合わせ回路3a−1〜3a−Mとから構成される。
【0072】
LUT生成回路1aは、複素数係数Cの実部値c_realと虚部値c_imagとを入力とし、実部値c_realと虚部値c_imagの差c_real−c_imagに相当する値d_subと、実部値c_realと虚部値c_imagの和c_real+c_imagに相当する値d_addとをそれぞれ計算し、実部値c_realおよび虚部値c_imagと共に値d_subおよびd_addを各分散演算回路2a−1〜2a−Mに出力する。
【0073】
分散演算回路2a−m(m=1,・・・,M)の各々は、複素数X[m](m=1,・・・,M)と、LUT生成回路1aから分配された実部値c_realおよび虚部値c_imagと値d_subおよびd_addとを入力とし、複素数X[m]のうち自回路に対応するデータの各々に複素数係数Cを乗じて合算した結果である複素数値Y[m](m=1,・・・,M)を、M個の各々について並列に計算して出力する。
【0074】
分散演算回路2a−mは、値0、c_real、−c_imag、d_subを各要素の数値とする実部用LUTと、値0、c_imag、c_real、d_addを各要素の数値とする虚部用LUTとを構成し、実部用LUTを用いた分散演算によって実部の積和演算c_real×x_real[m]−c_imag×x_imag[m]の結果を取得してy_real[m]として出力すると共に、虚部用LUTを用いた分散演算によって虚部の積和演算c_imag×x_real[m]+c_real×x_imag[m]の結果を取得してy_imag[m]として出力する。
【0075】
桁合わせ回路3a−mは、分散演算回路2a−mから出力された実部の積和演算の結果y_real[m]の下位ビット切捨あるいは四捨五入によって、y_real[m]の小数点以下桁数を、演算回路が出力すべき固定小数点数の小数点以桁数z_scaleに合わせる処理を行い、その処理結果をz_real[m]として出力する。同様に、桁合わせ回路3a−mは、分散演算回路2a−mから出力された虚部の積和演算の結果y_imag[m]の下位ビット切捨あるいは四捨五入によって、y_imag[m]の小数点以下桁数を、演算回路が出力すべき固定小数点数の小数点以桁数z_scaleに合わせる処理を行い、その処理結果をz_imag[m]として出力する。z_scaleは、y_real[m]やy_imag[m]の小数点以下桁数y_scaleよりも小さい値である。
【0076】
したがって、切捨処理を行う桁合わせ回路3a−mは、y_real[m],y_imag[m]に対して、下位の(y_scale−z_scale)個のビットを削除した値を、それぞれz_real[m],z_imag[m]として出力する。また、四捨五入処理を行う桁合わせ回路3a−mは、前記の切捨処理によって削除されるビットのうち最上位1ビットを、切捨処理で残った値に加算した値を出力する。
【0077】
図8に、分散演算回路2a−m(m=1,・・・,M)の構成を示す。
図8に示した分散演算回路2a−mは、L個の実部用LUT索引回路203m−l(実部用選択回路)と、符号反転回路204と、L個の実部用ビット位置別演算回路205m−lと、実部用合算回路206mと、L個の虚部用LUT索引回路207m−l(虚部用選択回路)と、L個の虚部用ビット位置別演算回路208m−lと、虚部用合算回路209mとから構成される。
【0078】
分散演算回路2a−mは、データx_real[m],x_imag[m]のビット位置l(l=1,・・・,L)毎に設けられた実部用LUT索引回路203m−lと虚部用LUT索引回路207m−lとを有する。
【0079】
実部用LUT索引回路203m−lは、データx_real[m],x_imag[m]のうち自回路に対応するビット位置lにあるビットx_real[m][l],x_imag[m][l]に基づいて、実部用LUTの4要素値、すなわち値0、c_real、−c_imag、d_subの中から1個を選択し、この選択した要素値をLUTr#m−lとして取得する。要素値LUTr#m−lは、符号付きの固定小数点数を表現する、2の補数の2進数である。
【0080】
虚部用LUT索引回路207m−lは、データx_real[m],x_imag[m]のうち自回路に対応するビット位置lにあるビットx_real[m][l],x_imag[m][l]に基づいて、虚部用LUTの4要素値、すなわち値0、c_imag、c_real、d_addの中から1個を選択し、この選択した要素値をLUTi#m−lとして取得する。要素値LUTi#m−lは、符号付きの固定小数点数を表現する、2の補数の2進数である。
【0081】
図9に、ビットx_real[m][l]およびx_imag[m][l]の各値と、そのとき選択される実部用LUTの要素値および虚部用LUTの要素値との関係を示す。ビットx_real[m][l]およびx_imag[m][l]の各値と実部用LUTの要素値および虚部用LUTの要素値との関係は、一般的な2項の積和演算を分散演算を用いて行う場合のLUTにおけるアドレスと記憶値との関係と同じである。
【0082】
図8に示した分散演算回路2a−mにおいて、実部用LUT索引回路203m−lによってビット位置l(l=1,・・・,L)毎に選択された、LUTの要素値LUTr#m−lは、それぞれ実部用ビット位置別演算回路205m−lによってビット位置別演算が施される。同様に、虚部用LUT索引回路207m−lによってビット位置l毎に選択された、LUTの要素値LUTi#m−lは、それぞれ虚部用ビット位置別演算回路208m−lによってビット位置別演算が施される。
【0083】
実部用合算回路206mは、L個の実部用ビット位置別演算回路205m−lによって計算されたビット位置別演算結果BRr#m−lを合算した結果、すなわち、Σ
l=1,・・・,L(BRr#m−l)をy_real[m]として出力する。同様に、虚部用合算回路209mは、L個の虚部用ビット位置別演算回路208m−lによって計算されたビット位置別演算結果BRi#m−lを合算した結果、すなわち、Σ
l=1,・・・,L(BRi#m−l)をy_imag[m]として出力する。
【0084】
図10に、分散演算回路2a−mの演算を説明するための概念図を示す。なお、ビット位置別演算処理と合算処理とは、実部用・虚部用共に同じであるため、
図10では、実部用のビット位置別演算処理と合算処理を例に挙げて記載している。
【0085】
実部用ビット位置別演算回路205m−lは、自回路の対応するビット位置lがLc(Lcは2以上L未満の整数)より大きい場合(l=Lc+1,・・・,L)に、自回路に対応する実部用LUT索引回路203m−lによってビット位置l毎に選択された要素値LUTr#m−lに対して、(l−Lc)ビット分の左シフト演算を行った結果を実部用ビット位置別演算結果BRr#m−lとして出力する。同様に、虚部用ビット位置別演算回路208m−lは、自回路の対応するビット位置lがLcより大きい場合に、自回路に対応する虚部用LUT索引回路207m−lによってビット位置l毎に選択された要素値LUTi#m−lに対して、(l−Lc)ビット分の左シフト演算を行った結果を虚部用ビット位置別演算結果BRi#m−lとして出力する。
【0086】
これらの左シフト演算は、要素値LUTr#m−l,LUTi#m−lに対して2
(l-Lc)を乗じたことと等価であり、左シフト演算によってLSB側に追加される(l−Lc)個のビット値は0である。
図10で言えば、ビット位置別演算結果BRr#m−(L−1)が、ビット位置lがLcより大きい場合の例を示している。
【0087】
ただし、l=Lのビット位置(データのMSB位置)に対応する実部用ビット位置別演算回路205m−Lは、実部用LUT索引回路203m−Lによって選択された要素値LUTr#m−Lに対して符号反転を行った後
に(L−Lc)ビット分の左シフト演算を行った結果を実部用ビット位置別演算結果BRr#m−Lとして出力する。同様に、l=Lのビット位置に対応する虚部用ビット位置別演算回路208m−Lは、虚部用LUT索引回路207m−Lによって選択された要素値LUTi#m−Lに対して符号反転を行った後
に(L−Lc)ビット分の左シフト演算を行った結果を虚部用ビット位置別演算結果BRi#m−Lとして出力する。
【0088】
また、実部用ビット位置別演算回路205m−lは、自回路の対応するビット位置lがLcより小さい場合(l=1,・・・,Lc−1)に、自回路に対応する実部用LUT索引回路203m−lによって選択された要素値LUTr#m−lに対して、(Lc−l)ビット分の右シフト演算を行った結果を実部用ビット位置別演算結果BRr#m−lとして出力する。同様に、虚部用ビット位置別演算回路208m−lは、自回路の対応するビット位置lがLcより小さい場合に、自回路に対応する虚部用LUT索引回路207m−lによって選択された要素値LUTi#m−lに対して、(Lc−l)ビット分の右シフト演算を行った結果を虚部用ビット位置別演算結果BRi#m−lとして出力する。
【0089】
これらの右シフト演算は、要素値LUTr#m−l,LUTi#m−lを2
(Lc-l)で除したことに相当し、右シフト演算前のLSB側(Lc−l)個のビット値は、右シフト演算後、回路によって保持されず無効となる。この右シフト演算の処理は、要素値LUTr#m−l,LUTi#m−lのLSB側(Lc−l)個のビットに対して切捨処理を施すことと等価である。
図10で言えば、ビット位置別演算結果BRr#m−(Lc−1),BRr#m−1が、ビット位置lがLcより小さい場合の例を示している。
【0090】
また、l=Lcのビット位置に対応する実部用ビット位置別演算回路205m−Lcは、自回路に対応する実部用LUT索引回路203m−Lcによって選択された要素値LUTr#m−Lcに対して演算を行わず、要素値LUTr#m−Lcをそのまま実部用ビット位置別演算結果BRr#m−Lcとして出力する。同様に、l=Lcのビット位置に対応する虚部用ビット位置別演算回路208m−Lcは、自回路に対応する虚部用LUT索引回路207m−Lcによって選択された要素値LUTi#m−Lcに対して演算を行わず、要素値LUTi#m−Lcをそのまま虚部用ビット位置別演算結果BRi#m−Lcとして出力する。
【0091】
実部用ビット位置別演算回路205m−l(l=1,・・・,L)から出力される実部用ビット位置別演算結果BRr#m−lは、実部用合算回路206mによって合算され、その合算結果Σ
l=1,・・・,L(BRr#m−l)がy_real[m]として出力される。同様に、虚部用ビット位置別演算回路208m−lから出力される虚部用ビット位置別演算結果BRi#m−lは、虚部用合算回路209mによって合算され、その合算結果Σ
l=1,・・・,L(BRi#m−l)がy_imag[m]として出力される。
【0092】
本実施例では、ビット位置lに応じて異なるビット数の左シフト演算あるいは右シフト演算が行われているため、各ビット位置別演算結果BRr#m−l,BRi#m−lは、それぞれ異なるビット幅となっている。
【0093】
そこで、実部用合算回路206mは、最大のビット幅、すなわち、ビット位置別演算結果BRr#m−Lのビット幅に、他のビット位置別演算結果BRr#m−1〜BRr#m−(L−1)のビット幅を合わせた後に、各ビット位置別演算結果BRr#m−l(l=1,・・・,L)の合算を行う。同様に、虚部用合算回路209mは、ビット位置別演算結果BRi#m−Lのビット幅に、他のビット位置別演算結果BRi#m−1〜BRi#m−(L−1)のビット幅を合わせた後に、各ビット位置別演算結果BRi#m−l(l=1,・・・,L)の合算を行う。
【0094】
各ビット位置別演算結果BRr#m−l,BRi#m−lは、符号付きの固定小数点数を表現した、2の補数の2進数である。したがって、前記のビット幅合わせでは、その符号ビットと同じ値のビットをMSB側に追加する必要がある。
【0095】
上述のように、ビット位置lがLcより小さい場合の各要素値LUTr#m−l,LUTi#m−l(l=1,・・・,Lc−1)は、ビット位置別演算回路205m−l,208m−lでの(Lc−l)ビット分の右シフト演算によって、LSB側(Lc−l)個のビット値が無効となる。また、通常は、LUT索引回路203m−l,207m−lがLUTの要素値4個の中から1個を選択するために、要素値のビット位置毎に、4個のビット値から1個のビット値を選択する4:1セレクタ回路が用いられる。
【0096】
そこで、要素値LUTr#m−l,LUTi#m−lの各ビットのうち、ビット位置別演算回路205m−l,208m−lにより無効となるLSB側(Lc−l)個のビットについては、前記の4:1セレクタ回路を省くことにより、LUT索引回路203m−l,207m−lの回路規模を削減することが可能である。
【0097】
なお、ビット位置lがLcより小さい場合(l=1,・・・,Lc−1)に、ビット位置別演算回路205m−l,208m−lが要素値LUTr#m−l,LUTi#m−lに対して(Lc−l)ビット分の右シフト演算を行うとき、無効化されるLSB側(Lc−l)個のビットのうちMSB側1ビットの値を、前記右シフト演算結果に加算し、ビット位置別演算結果BRr#m−l,BRi#m−lとすることも可能である。この処理は、要素値LUTr#m−l,LUTi#m−lのLSB側(Lc−l)個のビットに対して四捨五入処理を施すことと等価である。
【0098】
各分散演算回路2a−mが出力する値y_real[m],y_imag[m]は、データx_real[m],x_imag[m]と複素数係数Cとの積和演算結果である。従来の技術(乗算と加算を組み合わせた演算)により積和演算の結果を得た場合の小数点以下桁数は、データx_real[m],x_imag[m]の小数点以下桁数x_scaleと複素数係数Cの小数点以下桁数c_scaleとの和、すなわち、x_scale+c_scaleである。また、積和演算を通常の分散演算(本実施例におけるパラメタLcの値を1とした場合に相当する)により行った場合も、積和演算の結果の小数点以下桁数はx_scale+c_scaleである。
【0099】
これに対して、本実施例では、
図10に示したように、(Lc−l)個の下位ビットが無効化されているため、各分散演算回路2a−mが出力する値y_real[m],y_imag[m]の小数点以下桁数y_scaleは、無効化されたビット数分だけ短くなるので、x_scale+c_scale−Lc+1となる。
【0100】
このように、本実施例の演算回路は、全ビットに対して正確な乗算を行う乗算回路ではなく、データのビット位置l毎にLUTから要素値LUTr#m−l,LUTi#m−lを取得し、要素値LUTr#m−l,LUTi#m−lに対して、ビット位置lに応じて予め指定された下位ビット、本実施例では(Lc−l)個の下位ビットについて、無効化した上で、これらを累積する分散演算を行う。
【0101】
これにより、本実施例では、無効化を行わない従来の演算回路と比較して、無効化されたビットに対する累積処理が不要となるため、その分の回路面積や消費電力を削減できる。また、無効化された下位ビットには雑音成分が多く含まれているため、従来の演算回路においても桁合わせ回路22mによって四捨五入処理や切捨処理が施されるので、本実施例の下位ビット無効化は、演算回路が出力する値の精度を劣化させない。
【0102】
すなわち、本実施例の演算回路は、上位ビットと下位ビットを区別せずに全ビットに対して正確な乗算を行う乗算回路ではなく、データのビット位置l毎にLUTから要素値LUTr#m−l,LUTi#m−lを取得して累積する分散演算を採用し、ビット位置l毎に予め指定された下位ビットの処理を省くことにより、演算精度の劣化なく、回路の面積・電力を削減できる効果がある。
【0103】
特に、本実施例の演算回路は高速化のため、分散演算回路内のデータのビット位置l毎のLUT検索と累積を同時に行うためのデータビット幅分の並列化と、M個のデータセットに対する分散演算を同時に行うための分散演算回路の個数分の並列化を行っている。このため、本実施例の演算回路では、上記の無効化されたビットに対する累積処理に要する回路規模が増大しており、下位ビットの処理を省くことによる回路の削減効果は大きい。
【0104】
第1、第2の実施例で説明した演算回路は例えばFPGAによって実現することができる。
【0105】
なお、従来の積和演算回路では、データの小数点以下桁数をx_scaleとし、係数の小数点以下桁数をc_scaleとするとき、正確な積和演算値の小数点以下桁数はx_scale+c_scaleとなる。そして、桁合わせ回路によって、小数点以下桁数をz_scaleに丸めている。したがって、x_scale+c_scale−z_scaleが、桁合わせによって削除されるビット数Lrとなる。
【0106】
これに対して、本発明では、上記の正確な積和演算値よりも、(Lc−1)ビット分が削除されている。本発明により、回路規模や消費電力を削減しつつ、正確な積和演算値とほぼ同じ値を得たい場合は、上記LrからLog
2(Lc)を減じた値を(Lc−1)の値よりも大きくする、すなわち、Lc−1<Lr−Log
2(Lc)とする。例えば、Lが9、x_scale,c_scale,z_scaleが全て8の場合は、Lcを5以下とする。
【0107】
このようにLcの値を定める理由は、本発明ではデータのビット幅Lと同じ個数のLUTの索引結果を合算しており、この合算によって正確な積和演算値との差が累積されるので、差の累積によって、丸め後の値に大きい影響を及ぼさないようにするためである。