DSP48A1ユニット

35bitの時から興味が出てDSP48A1ユニットについて調べた覚書。
演算はP = A * (B ± D) ± Cという信号処理でよく見かける形。
(B±D)の部分が前置加減算器、A*の部分が乗算器、±Cの部分が加減算器として実装され、パイプラインレジスタをすべて有効にすると、それぞれレジスタで区切られる。
VirtexのDSP48Eだと論理演算ができてALU的に使えたり、乗算が25×18だったりするが、Spartanの場合は乗算専用感が強い気がする。

前置加減算器

乗算前にデータBとデータDを加減算する。おもにFIRフィルタで係数が対称になっているものや、複素演算のような乗算の前に加減算が来るもので使えるとデータシートに記載がある。
乗算後にある加減算器と違い、キャリー伝播用の入出力が出ておらず、入出力ともに18bitなため、オーバーフローしないように入力値を取らないといけない。
データ入力に使う場合は、単純に考えて1bitガードビットにして入力の桁数を1bit下げれば十分だが、係数の場合はもっと追い込むことはできなくはないと思う。
35bit×35bitの計算は、ガードビットをつけて変換すると35bit×(33bit±33bit)に変換できる(2bit減っているのは上下で1bitずつガードビットが必要なため)。
また、前置加減算器を使わない場合、前置加減算器のパイプラインレジスタをレイテンシ調整に使えるよう。

乗算器

18bit×18bit=36bitの符号付乗算を行う乗算器。
以前も調べたとおり、乗算のモードを切り替えることはできないため、符号なしを含む演算を行いたい場合は符号なし側は17bitまでになる。
結果はパイプラインレジスタ経由か、直接出力でFPGAのファブリックに出力可能。
また、次段のMUXを経由して加減算器に入力することもできる。

加減算器

48bit±(48bit+Cin)=Cout+48bitを行う加減算器。
キャリー伝播ロジックとユーザーが制御可能なキャリー入力があるため、任意の桁数まで時分割でも空間分割でも拡張可能。
入力はXとZと名前がついており、Xは0、乗算器出力(符号拡張)、加減算出力のフィードバック(積和)、D:A:Bを連結した48bit入力が選べる。Zは0、PCIN(カスケード専用ポートからの入力)、加減算出力のフィードバック(積和)、C入力からの入力が選べる。
乗算結果36bitに対して、48bitで積和を行うので、ガードビットとして12bitもあり、ダイナミックレンジが広い処理でも安心。


使い方で注意しないといけないと思ったのは、一部のカスケード用ポート(名前にCがついている)はカスケードとしてしか使えないということと。
DSP48A1ブロックは縦に並んでいるらしく、それをカスケードでつないでいくような使い方を想定しているらしい。
データシートにFIRを実装した場合の例などがある。