06-03-2016 03:23 AM
現在、入力信号10Hz(サンプリング周波数1000Hz)に対して、 1周期分(100点)のデータの平均値を出力し、
1サンプル移動して同様に100点のデータの平均値を出力する、というような移動平均のプログラムをFPGAで書きたいと考えております。
FPGAを利用しなければ上記の仕様を満たしたプログラムを構築できるのですが、FPGAを利用するとサポートされていない関数が含まれておりコンパイルできません。
FPGAで構築する場合は、フィードバックノード(またはシフトレジスタ)を用いて構築する方法があるかと思いますが、それ以外に方法はありますか。
この方法だと、100点ずらすのに100回フィードバックノードを利用することになると思われるので、できれば避けたいです。
添付させて頂いたファイルは、入力信号生成部分のプログラムになります。
ご教授、アドバイス等宜しくお願いいたします。
解決済! 解決策の投稿を見る。
06-03-2016 10:53 AM - 編集済み 06-03-2016 10:59 AM
FPGA環境がありませんが、以下のような方法があります。
100の配列を初期化して、ループ内部で配列[1]~[99]をまとめて抜き出し、配列連結追加で新しいデータを追加し配列サイズ100とします。
以下の例の注意点は以下です。
「1」でデータの幅を増やしています。下流の「2」で配列を全部足し合わせますが、データ幅が同じなので100個も足すとオーバーフローしてしまう可能性があるからです。増やすデータ幅は元のデータの幅、足し合わせる配列要素の数により異なります。
FPGAでの割り算はかなりのリソースを使用するだけでなく、シングルサイクルタイミングループの中で行う場合はループが高速すぎるとコンパイルできなくなる原因になりますのでご注意ください。またデータ幅が増えるとその影響も増えます。割る数を100にこだわらず、たとえば128(2の階乗)でもよければ、「2」の部分でビットシフト(10ビットずらす)を使えますので一応触れておきます。その場合、配列の初期化の数を128とし、部分配列を127にする必要があります。ビットシフトで使用するリソースはゼロです。
06-04-2016 05:24 AM
返信ありがとうございます。
アドバイス頂いた方法についてですが、がFPGAでは「Σ」がサポートされていないため、コンパイルできませんでした。
別の方法として、以下のようなプログラム(reference1,2はsmoothing.vi。reference3はFPGA.vi。)を構築してコンパイルしました。
現状、コンパイルはできるのですが、FPGA.viにある'Rawdata' FIFOの'time out?' ブール値にランプがつき、タイムアウトになってしまうため、host側で正常に波形が表示されません。
smoothing.vi がない場合は正常に入力信号である正弦波を表示できるため、smoothing.vi に欠陥があると思われます。
何が欠陥なのか教えて頂けると幸いです。
以上になりますが、ご教授宜しくお願い致します。
06-04-2016 05:53 AM
reference3 についてですが、私のミスで前のバージョンのものを添付してしまいました。
再度、アップロードさせて頂きます。
アルゴリズムとしては、直近100点の移動平均を常時行うために、
最も古いデータ(100点前のサンプル点)を引き、そして最も新しいデータを足すといったプログラムになっています。
以上になりますが、宜しくお願い致します。
06-05-2016 09:45 PM
reference3.png VIにおきまして幾つか気づいた点がありましたのでお伝えします。
1. While ループにFalse定数が渡っていますがこれでは無限ループになってしまいます。データがホスト側に渡されないのはそのせいではないでしょうか。True定数を渡すのが正しいはずです。
2. シフトレジスタをゼロで初期化してしまっているので、このVIが呼び出されるたびにシフトレジスタが0になってしまいます。ここではシフトレジスタを初期化しない方が思った通りの動きをするはずです。
06-07-2016 08:51 PM
返信が遅れてしまい、申し訳ございません。
ご指摘頂いた内容を踏まえて、プログラムを再度構築したところ、
想定通りの結果になりました。
ご指導ありがとうございました。
06-07-2016 10:16 PM
今後の参考のためにプログラムの画像をアップロードしておきます。