続・逆数の計算
以前から、低精度の浮動小数点でそこそこ高速に実行できる逆数生成にトライ中です。
テーブル+補間型で作成中ですが、正規化数限定でいろいろ精度を試そうとしています。
XILINXのシンセサイザは、ISEの時代から initial 文でメモリを初期化できるという特徴があります。
なら、「parameter の内容に 合わせて initial 文の中で、テーブル計算すれば汎用性の高いコードが書けるのでは?」ってことでトライしてみました。
シミュレーションまでは当然良好でした。
が、
ISEで、合成してみたところ、 合成で real 型使えないと怒られた... orz
Vivado で合成してみたところ、合成通ったけど覗くと中身が無い... orz
(Vivadoはどうやら $realtobits などが未サポートの模様)
とりあえず、深追いせずにひとまず case 文で ROM化しました....
単精度浮動小数点を、Distributed-ROM 狙いで 64点補間で生成。レイテンシは 6です。
シミュレーションでの最大誤差は倍精度と比べて 6.01562e-005でした。
14bit程度の精度は出ているようです。
とりあえず ISE 14.7 で、Zybo (XC7Z010-1CLG400) 向け設定で
Number of Slice Registers : 308
Number of Slice LUTs : 132
Number of DSP48E1s : 1
Minimum period: 2.087ns (Maximum Frequency: 479.157MHz)
Vivado 2016.1 、同じく Zybo設定
LUT : 109
FF : 273
DSP : 1
となった。
リソースカウントが違うのか、ROMの論理圧縮か何かが違うのかな?
ちゃんと実機テストできて無いので、いろいろ怪しいですが、とりあえず、Vivado の方はロジアナで覗くとシミュレーションどおりではありそうです。
ソースは github に入れているので、興味のある方はこちらをどうぞ
https://github.com/ryuz/jelly
ちなみに BRAM利用を前提に、1024点補間とかすると、
3.17072e-007
程度の誤差まで迫れました。
今回は並列に気軽に何個も使えるようにという思いもあり、DSP1個でシンプルな補間としていますが、たぶんいろいろ工夫の余地はあるのだと思います。
[追記]
real型を使わずに書いたら、ひとまず vivado では意図通りテーブルの初期化が確認できました。
initial の中で
mem[i][GRAD_WIDTH +: FRAC_WIDTH] = base_frac[0 +: FRAC_WIDTH];
mem[i][0 +: GRAD_WIDTH] = grad[0 +: GRAD_WIDTH];
とかくと
[Synth 8-311] ignoring non-constant assignment in initial block
というエラーになるのに
mem[i] = {base_frac[0 +: FRAC_WIDTH], grad[0 +: GRAD_WIDTH]};
と書けば通るとか、なるほど、分かるけど微妙な制約とかはありました。 (^^;
整理してまた push しておきます。
« Vivado HL WebPack 2016.1 | トップページ | 射影変換の逆 »
「FPGA」カテゴリの記事
- LUT-Networkの蒸留とMobileNet風構成とセマンティックセグメンテーション(2020.03.09)
- LUT-Networkの蒸留(Distillation)について(2019.12.29)
- FPGAでのDNN(Deep Neural Network)の整理(LUT-Netまとめ)(2019.12.15)
- LUT-NetのFPGAリソースについて(2019.12.08)
- MNIST認識のリアルタイム動作環境更新(2019.09.02)
この記事へのコメントは終了しました。
コメント