積和の実装2

DSP48A1のドキュメントのパイプライン化された複素数積和の実装を見ていてふと気が付いたが、積和結果がいるのは処理の最後になってからなので、それまでの積和をAlow*Blow,Ahigh*Blow,Alow*Bhigh,Ahigh*Bhighの4つの部分積で独立に足し合わせ、最後の最後で4サイクルかけて部分積をシフトしながら加算して最終的な結果にすればいいことに気が付いた。
部分積を加算する4サイクル分余計に処理サイクル数がかかるが、加算専用のDSP48Aブロック×2(96bit)が要らなくなるので、その分乗算性能を上げることができるのと、暗黙的に考えているオーディオ用デジタルフィルタではタップ数が長い割にデータレートは低いので、そんなにロスにならないんじゃないかという見積り。
あと、積和器のレイテンシ調整のためにFPGAファブリック側でレジスタを入れなくていいので、ロジックもコンパクトになる…気がする。


あと問題になりそうなのは、独立した加減算器だと96bit(48bit×2)で加減算できるが、この方式だと82bit(48bit+17bit*2)しかないというのと、独立した加減算器はキャリーチェーンで接続されて96bit以上にならないとオーバーフローしないのに対して、部分積それぞれは完全に独立しているので、どれか一つでもオーバーフローすると破綻するということ。
とはいっても、一番余裕のないAhigh*Bhighでも、36bit積結果に対して48bit和で、12bit(=4096倍)の余裕があるので特に問題になることはないと思うが。


割とコンパクトになりそうな気がするのと、パイプライン動作がシンプルになって書きやすそうなので書いてみよう。