« MCAでK40の効果を見てみる | トップページ | FPGAで作るHyperFFTのアルゴリズム »

2016.06.20

XILINXのAXI Stream複素数乗算回路

FPGAで高速フーリエ変換回路を作りたいと思い、XILINXのCoreGeneratorの中にある複素数乗算回路を試しています。

Cmult0

CoreGenのMultipliersの中にある、5.0のAXI4 Streamのものです。

実数部と虚数部はデフォルトのまま、ともに16bitにします。

Cmult1

出力の幅はフォルトでは33になって、実数虚数合わせてなぜか80bitになるようです。

Cmult2

ここでよくわからないのが、Latencyの設定です。AutomaticにするとLatency 6になりますが、Manualにすると0~6まで変えることができます。

数の表現

FFTなどで使うような-1~+1までの数を表現したい場合、16bitの固定小数点では下記のように符号1ビットで、有効数字15bitで表します。

Cmult9


この表現だと、+1は0x7fff、-1は0x8001、+0.5は0x3fff、0は0x0000となります。

このような数を2個、16bit & 16bitの組にして、複素数乗算器に入れると、80bitの信号が出てきますが、[70:55]と[30:15]を切り出すと、元のとおり16bit & 16bitの複素数の乗算結果が得られます。

Cmult10

パイプライン化の検証

Latency 0にしてシミュレーションしてみたところ、入力を与えるのと同時に結果が出てきました。

Cmult3

Latency 1にすると、入力が与えられた次のクロックで出てきます。

Cmult4

Latency 2すると、入力が与えられた次の次のクロックで出てきます。

Cmult5

気になるのは、このコアの中身はパイプライン化されているかどうかです。Latencyが大きいと、もしかすると、1つの乗算器を何回も使いまわすようなことをしているかもしれません。

乗算器の使いまわしをしていてパイプライン化されていないとすると、連続してデータを与えることができないので、困ってしまいます。シミュレーションで試したところ、Automaticに設定してレイテンシ6の回路を作り、1クロックごとに異なるデータを与えても問題ないようでした(下の図)。

Cmult7

つまり、中身はパイプライン化されています。

リソースの使用量

リソースはどのくらい使っているのかというと、ZYNQの030に実装してみたところ、

Cmult6

でした。なぜDSP48Eの使用数が3個なのかはわかりません。複素数の乗算なら4回の掛け算だと思うのですが、謎です。レイテンシを変えていっても変化はありませんでした。

気になるリソースの使用率は、

Latency 1の場合

Number of Slice Registers 1
Number of occupied Slices 1
Number of DSP48E1s        3

Latency 2の場合

Number of Slice Registers 2
Number of occupied Slices 2
Number of DSP48E1s        3

Latency 3の場合

Number of Slice Registers 2
Number of occupied Slices 2
Number of DSP48E1s        3

Latency Auto(6の場合)

Number of Slice Registers 66?
Number of occupied Slices 66?
Number of DSP48E1s        3

と、ほぼDSP48のみだけで動いているようなのですが、レイテンシを増やしていくとSLICEも使うようになります。

速度の見積もり

どのくらいの速度で動くかというと、Latency2,3の場合CLK 400MHzにするとタイミングエラーが出ました。Latency 1の場合はタイミングエラーが出ないのですが、

Latency 1にして、ユーザロジックで入力と出力にレジスタを入れたところ、

Cmult8

のようになったので、おそらく解析できていないのだと思います。

コアの中がどういう回路なのかはわかりませんが、上のタイミングエラーのレポートを見る限り、fanoutが大きい気がするので、Latencyをautoにしないと最高速度での動作はできないのかもしれません。

ちなみに、Latency=Auto(6)にしたところ、667MHzでもタイミングエラーはでませんでした。

まとめ

  • XILINXのAXI Stream複素数乗算器は、ちゃんと動く
  • レイテンシはAuto (=6)のままにしないと、400MHzの動作でもタイミングエラーが出る
  • 虚部・実部を16bit & 16bitで表現した場合、結果の[70:55]と[30:15]を切り出せばよい

|

« MCAでK40の効果を見てみる | トップページ | FPGAで作るHyperFFTのアルゴリズム »

コメント

コメントを書く



(ウェブ上には掲載しません)




« MCAでK40の効果を見てみる | トップページ | FPGAで作るHyperFFTのアルゴリズム »