XILINXのAXI Stream複素数乗算回路
FPGAで高速フーリエ変換回路を作りたいと思い、XILINXのCoreGeneratorの中にある複素数乗算回路を試しています。
CoreGenのMultipliersの中にある、5.0のAXI4 Streamのものです。
実数部と虚数部はデフォルトのまま、ともに16bitにします。
出力の幅はフォルトでは33になって、実数虚数合わせてなぜか80bitになるようです。
ここでよくわからないのが、Latencyの設定です。AutomaticにするとLatency 6になりますが、Manualにすると0~6まで変えることができます。
![]()
数の表現
FFTなどで使うような-1~+1までの数を表現したい場合、16bitの固定小数点では下記のように符号1ビットで、有効数字15bitで表します。

この表現だと、+1は0x7fff、-1は0x8001、+0.5は0x3fff、0は0x0000となります。
このような数を2個、16bit & 16bitの組にして、複素数乗算器に入れると、80bitの信号が出てきますが、[70:55]と[30:15]を切り出すと、元のとおり16bit & 16bitの複素数の乗算結果が得られます。

![]()
パイプライン化の検証
Latency 0にしてシミュレーションしてみたところ、入力を与えるのと同時に結果が出てきました。
Latency 1にすると、入力が与えられた次のクロックで出てきます。
Latency 2すると、入力が与えられた次の次のクロックで出てきます。
気になるのは、このコアの中身はパイプライン化されているかどうかです。Latencyが大きいと、もしかすると、1つの乗算器を何回も使いまわすようなことをしているかもしれません。
乗算器の使いまわしをしていてパイプライン化されていないとすると、連続してデータを与えることができないので、困ってしまいます。シミュレーションで試したところ、Automaticに設定してレイテンシ6の回路を作り、1クロックごとに異なるデータを与えても問題ないようでした(下の図)。
つまり、中身はパイプライン化されています。
![]()
リソースの使用量
リソースはどのくらい使っているのかというと、ZYNQの030に実装してみたところ、
でした。なぜ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にして、ユーザロジックで入力と出力にレジスタを入れたところ、
のようになったので、おそらく解析できていないのだと思います。
コアの中がどういう回路なのかはわかりませんが、上のタイミングエラーのレポートを見る限り、fanoutが大きい気がするので、Latencyをautoにしないと最高速度での動作はできないのかもしれません。
ちなみに、Latency=Auto(6)にしたところ、667MHzでもタイミングエラーはでませんでした。
![]()
まとめ
- XILINXのAXI Stream複素数乗算器は、ちゃんと動く
- レイテンシはAuto (=6)のままにしないと、400MHzの動作でもタイミングエラーが出る
- 虚部・実部を16bit & 16bitで表現した場合、結果の[70:55]と[30:15]を切り出せばよい
| 固定リンク











コメント