· 

VHDLで1次IIRフィルタ(3)

これまでやってきたことをQuartusでやります。ターゲットは相変わらずのMAX10です。てか、ホント素人がとっつきやすい規模のFPGAがないよなー。素人が手を出すなってか。

で、spi_slaveは書き直した(VHDLでSPIスレーブ(2)参照)。そしてMAX10を使うからにはALTFPを使おうって改造を施した。そしてMAX10を使うってことは、内蔵PLLが使えるので160MHz問題もたなぼた解決。

ページがソースコードでいっぱいになっちゃうので、実装はこちら、シミュレーション用はこちらに保存しています。

MAX10はハードウェア乗算器が48個あるらしく、その7個を使っているらしい。LEを3kも使っているところが、信号のビット数とかをもうちょっと細かく制御しなかったとか、素人っぽい手抜かりによるものなんだろう。

ALTFPで足し算する回路を生成したときの性能です。11サイクルでできるぜってなってます。OpenCoresから拾ってきたFPUより1clock多い。

ALTFPで掛け算をする回路を生成したときの性能です。7サイクルでできるぜってなっています。OpenCoresから拾ってきたFPUより8clock少ない!

ALTFPで足し算する回路を生成したときの性能です。11サイクルでできるぜってなってます。OpenCoresから拾ってきたFPUより1clock多い。

全体の計算結果です。うまくいってるー。いや、意外と苦労(いや苦悩)したけど。

ところで、ALTFPには開始とか完了とか信号がなくて、入ってきたものをそのまま計算して印象としては成り行きで答えが出ている。今回の回路に実装するにあたっては、ALTFPを生成したときに表示される性能を使ってカウントして完了を判定している。

で、ALTFPって、性能を無理やり調整できる(最適化というんか?)。のでやってみる。

ProjectNavigatorでIP Componentsを選ぶと使っているIPが表示される。でFP_ADDを押すと、生成用ダイアログが表示される。パフォーマンスタブを押し、当初200ってなってたところを今回使用する160に変更してEnterを押すと、なんと9cycleでできるって言ってきています。2サイクル縮んだ。

他のもやって、まとめると

FP_ADD 11-->9

FP_MUL 7-->6

FP_SUB 11-->9

ってなる。

上が調整前、下が調整後。resultが更新されるタイミングが早くなってます。かしこいねー。

うぎゃーーああぁぁぁぁぁーー鬱