FPGAによる数値演算回路

 しばらく(15年以上)デジタルの世界から離れて物理の世界に入っていたが、久しぶりにちょっとのぞいてみたところ、FPGAなる物があり(15年前はPAL, GALしかなかった)、1年半ほどいじってマニュアルのみの独学でいろいろ作成した結果を参考までに載せる。大学の方が忙しいのでメーカーの研修会には一度も行っていない。そのため、間違った解釈があるかもしれないがご容赦されたい。FPGAやCPLDはXILINXとALTERAの両方を試用したが、古い人間にはなじみのあるTTLシリーズ・マクロが利用可能なALTERAの方を主に利用したので、そちらを使った回路を示す。(なお、XILINXでも同様な回路を作成可能である。)

注:本ページの内容の利用等については、末尾にリンクのあるトップページにある免責事項を参照されたい。

 以下に参考となる回路やプログラムなどを示す。

1 初等関数や浮動小数点数の計算

 マイコンやFPGAなどで、初等関数や浮動小数点演算などの計算を行う際、それらのライブラリーが存在していない時に、それらを行うためのアルゴリズムをCプログラムの形態で示しておく。Cは可読性がよいので、これらのCプログラムからアルゴリズムを読み取り、それをマイコンのプログラムやFPGAの回路に実装すれば計算ルーチンを実装できる。(または、マイコンの場合はCでそのまま実装できると思われる。さらに、マイコンでFlash容量が限られている際に、必要なルーチンのみを実装する際にも便利かもしれない。)浮動小数点演算に関しては IEEE single floatのみを示すが、doubleに関しても同様にすれば実現可能である。IEEEフォーマットに関しては、各種の参考文献やインターネット情報にあり、それらを参照されたい。なお、筆者はモートローラのMC68040やMC68881などのマニュアルを参照した。初等関数に関しては次に記す文献を参照した。「Ref.1: 電子計算機のための数値計算法1〜3 山内他、培風館」。絶版かもしれないが、ほとんどの大学図書館には存在すると思う。この本は非常に参考になる。以下に例示した初等関数に関してもsingle float精度であるが、この参考文献の高精度多項式における系数を使用して近似多項式の次数を上げればdouble化もすぐにできる。(Numerical recipes という本に載っているアルゴリズムを使う手もあるが、Ref.1の方が背景がよく分かり、FPGAによるハード化の見通しが容易であるために、ハード量削減や最適化もしやすい。)

以下、種々の計算例を示す。詳細はリンク部を参照されたい。

1-1 浮動小数点・四則演算、および整数・浮動小数の相互変換等

1-2 初等関数演算(sin, cos, tan, exp, log, atan, power, floor, int, etc.)

1-3 FPGAによるCOS 関数の実装例

 

2 FIR filter と FFT

 メーカーと開発ツールの正式契約やIP使用料の契約を行えば、FIR filterやFFTは自由に使えるのだが、面倒なので、作ってしまった。なお、チューニングはしていないので、そこそこの性能であるが、実用に足りる場合も多いと思うので例示しておく。

2-0 最初に(使用したFPGAやインターフェースなど)

2-1 FIR filterのFPGAへの実装例

2-2 FFTのFPGAへの実装例

 

Top Pageへ