こんにちは、ドルフィンシステムの笹生です。
今回から数回は「FPGA のリソースはデータビット幅の違いでどのように変わるのか」をテーマにお送りします。
FPGA では、実装したい関数のリソースを見積もる場合単純にはいかない場合が多いです。
基本的に FPGA は ルックアップテーブル、レジスタで構成されますが、Xilinx や Intel などの FPGA は多くの種類でエンベデッドの
DSP回路、RAMがも一緒に構成要素として実装されています。これらFPGA の「ハードウェア構成要素」は物理的に粒度 (ビット幅等の最小単位) が決まっており、FPGA の型番やファミリによっても異なります。
またコンパイラの設定などでは、論理圧縮をしてリソースを消費しない方向でコンパイルする場合もあれば、スピード重視、並列化重視でリソースを多く消費する方向でコンパイルする場合もあります。
こういった諸条件が多くあるので、コンパイルをせずに事前に正確なリソース見積もりをするのは正直に言って難しいです。でもある程度のざっくりした傾向を知っておくことは重要ではないかと思います。なぜなら FPGA はファミリによっては現在でも大変高価なデバイスですので、購入してから「リソースが足りなくて実装ができない!」ということを避ける必要があるからです。
リソースを比較する関数の候補について
さて検証したい関数の候補をざっと挙げてみます。
ビット幅を変えて影響がある関数なのですが、ベーシックなものからよく使う割と複雑な関数までを検証してみます。
・加算
・乗算
・除算
・CORDIC
・FIRフィルタ
・FFT
今回は加算と乗算回路を LabVIEW FPGA を使ってターゲットは FlexRIO 7951R (Virtex5 LX30) で確認をしました。残りの除算以降は次回以降に検証したいと思います。
加算回路のリソースはビット幅でどう変わるか
加算回路として以下のような実装をしてみました。
この加算器の入力側の Input A/B それぞれのビット幅を
8,16,,,64 bit に 8bit づつ変更してコンパイルをし、使用したリソースを比較してみます。
| 
Resouce | 
ベース | 
Add FIX8 | 
Add
  FIX16 | 
Add
  FIX24 | 
Add
  FIX32 | 
Add
  FIX40 | 
Add
  FIX48 | 
Add
  FIX56 | 
Add
  FIX64 | 
| 
Total
  Slice | 
665 | 
709 | 
733 | 
798 | 
776 | 
769 | 
772 | 
816 | 
849 | 
| 
Slice
  Register | 
1414 | 
1529 | 
1585 | 
1641 | 
1738 | 
1762 | 
1786 | 
1810 | 
1833 | 
| 
Slice
  LUT | 
1315 | 
1392 | 
1417 | 
1442 | 
1543 | 
1567 | 
1591 | 
1614 | 
1710 | 
| 
Block
  RAM | 
0 | 
0 | 
0 | 
0 | 
0 | 
0 | 
0 | 
0 | 
0 | 
| 
DSP 48s | 
0 | 
0 | 
0 | 
0 | 
0 | 
0 | 
0 | 
0 | 
0 | 
| 
レジスタ消費 | 
0 | 
115 | 
171 | 
227 | 
324 | 
348 | 
372 | 
396 | 
419 | 
| 
LUT消費 | 
0 | 
77 | 
102 | 
127 | 
228 | 
252 | 
276 | 
299 | 
395 | 
ベースの列は、LabVIEW FPGA で最初から使用されているリソースです。
レジスタ消費と LUT 消費をグラフにすると以下のようになりました。
加算回路はレジスタ、LUT どちらもビット幅に対しては線形に近い増え方をしています。
加算回路はビット幅が倍になれば消費リソースは概ね倍になるようです。
乗算回路のリソースはビット幅でどう変わるか
乗算回路として以下のような実装をしてみました。
この乗算器の入力側の Input A/B それぞれのビット幅を
8,16,,,64 bit に 8bit づつ変更してコンパイルをし、使用したリソースを比較してみます。
| 
Resouce | 
ベース | 
Mul FIX8 | 
Mul
  FIX16 | 
Mul
  FIX24 | 
Mul
  FIX32 | 
Mul
  FIX40 | 
Mul
  FIX48 | 
Mul
  FIX56 | 
Mul
  FIX64 | 
| 
Total
  Slice | 
665 | 
725 | 
804 | 
781 | 
855 | 
781 | 
899 | 
928 | 
722 | 
| 
Slice
  Register | 
1414 | 
1564 | 
1660 | 
1737 | 
1769 | 
1785 | 
1802 | 
1817 | 
1833 | 
| 
Slice
  LUT | 
1315 | 
1399 | 
1430 | 
1507 | 
1530 | 
1652 | 
1750 | 
1801 | 
1851 | 
| 
Block
  RAM | 
0 | 
0 | 
0 | 
0 | 
0 | 
0 | 
0 | 
0 | 
0 | 
| 
DSP 48s | 
0 | 
1 | 
1 | 
2 | 
4 | 
8 | 
11 | 
12 | 
12 | 
| 
レジスタ消費 | 
0 | 
150 | 
246 | 
323 | 
355 | 
371 | 
388 | 
403 | 
419 | 
| 
LUT消費 | 
0 | 
84 | 
115 | 
192 | 
215 | 
337 | 
435 | 
486 | 
536 | 
| 
DSP消費 | 
0 | 
1 | 
1 | 
2 | 
4 | 
8 | 
11 | 
12 | 
12 | 
乗算回路についてもレジスタとLUT の消費量をグラフにしてみました。
LUT消費はほぼ線形な感じですが、レジスタ消費が線形的でないのは実は出力ビット幅の上限が 64bit
だからのようです。というのは横軸の Mul FIX32 以降は入力レジスタは増えても出力レジスタはすべて 64bit で残りは捨てられているからだと思われます。
DSP
48s の消費量もグラフにしてみます。
こちらも線形にはなっていません。おそらく出力ビット幅 64bit の制限がなければ、2乗カーブに近くなると思われます。今回は頭打ちのようなグラフですが、これは LabVIEW の制約だと思われ、HDL で記述すればまた違った結果になるかもしれません。
まとめ
「FPGA のリソースはデータビット幅の違いでどのように変わるのか」をテーマに、今回は信号処理で基本中の基本の関数「加算回路」と「乗算回路」について検証してみました。
結論から言うと基本的には加算回路は線形にビット幅に対応し、乗算回路は少なくとも入力ビット幅が 32bit 以下の時はビット幅の二乗に対応しそうなことがわかりました。





0 件のコメント :
コメントを投稿