2020-01-05ZYNQ搭載高速ADCボード「Cosmo-Z」にユーザ回路を追加する方法の続きです。前編はこちらフィルタの追加FilterブロックにはADCで計測された生データが流れているので、ここに適当なフィルタを追加します。適当なフィルタということでCICフィルタを選びました。CICフィルタとはCICフィルタというのは足し算とデシメーションだけでできている単純なローパスフィルタで、特性は急峻ではありませんが、構造は簡単です。詳しいことはhttp://nahitafu.cocolog-nifty.com/nahitafu/2015/08/cosmo-z18bit-ec.htmlの記事をご覧ください。Streamを前提としていて、生のデータは入れられないようです。8chに分解するようにしました。8本に分けたところ、VivadoがWarningを出してきました。Streamはビット幅が8の倍数でないと正しく動作しないかもしれないそうなのです。CICフィルタに入れるデータは2の補数表現であろうから、リニア→2の補数表現に変換しなければなりません。CH1をCH1,2,3,4にコピーして、CH2をCH5,6,7,8にコピーする機能もSliceモジュールに持たせましょう。"0000";こんなふうになりました。Combineモジュールの改良Combineモジュールでは逆にこれらのデータを束ねます。Designを配線するSliceモジュールとCombineモジュールをRTLモジュールとして作り、間にCICフィルタを挟みます。ADCに入ってくる信号はCH1(正弦波)とCH2(矩形波:トリガ信号)で、それを以下のような方針で8chに振り分けます。CH2→CICフィルタ(きつめ)→CH8VivadoのIPのCICフィルタの設定は以下のとおりです。フィルタ入出力ビット幅フィルタの設定がきつくなると出力バスのビット幅も増えてきます。同じ条件で評価したいので、いずれのフィルタも、入出力データは16bit幅でTruncationの設定にしています。失敗したことSliceとCombineをRTLモジュールにしたことが失敗でした。Streamを作ると、Varidateをしたときにバスの速度が自動的に推定されないようで、全部手作業で設定しなければいけないようでした。PropertyをつっついてCONFIGの中のFREQ_HZを全部設定しなおさなければなりません。IPとして作れば、おそらく自動で設定されます。RTLモジュールはIPコアと違い、ツールがラッパを作ってアトリビュートを設定することができないのでしょう。論理合成して実行これを論理合成して、計測を行ってみました。結果は次の図の波形のとおり。フィルタがきつくなるにつれ、遅延が増えていくのがわかります。時間軸的に拡大してみると、フィルタを通したほうはすべてカクカクしています。これはCICフィルタがデシメーションをしているためで、4回に1回しかデータを出力しないからです。灰色の線(CH8)は矩形波の反射による鋭いヒゲを除去できているのでLPFとしての効果はありそうです。CICフィルタの周波数特性とノイズ除去性能LPFなので、どのくらいノイズが除去できるか気になるところです。今回使っている正弦波の発振器は、安物なので、波形が歪んでいます。そのため、FFTをすると結構な高調波が乗ってしまうのですが・・・CICフィルタを通すと、(ゆるめ)(ふつう)(きつめ)全体的にノイズは減っているのでしょうが、CICフィルタ自体が緩すぎて、あまり効果は感じられません。サンプリング周波数の1/8付近(10MHz付近)のノイズは落ちていますが、20MHz付近ではかえってノイズが増えているように見えます。矩形波もフィルタした結果のFFTトリガの矩形波もCICフィルタに掛けているので、そのFFTでスペクトラムを見てみます。矩形波のスペクトラムはくし型になります。「ゆるめ」のフィルタ。fs/4の20MHzで急峻に切れています。次は「ふつう」のフィルタ。10MHz付近の減衰が少しだけ大きくなっています。最後は「きつめ」のフィルタ。10MHzと30MHz付近で大きくカットできました。元が幅が広がったスペクトラムのほうがフィルタの特性は把握しやすいですね。10MHz、20MHz、30MHz、40MHzのすべての部分で急峻に切れているのでしょう。まとめいかがでしたでしょうか。Streamをほどいて再結合させ、その間にリアルタイムな信号処理を追加することができました。