06-11-2018 01:51 AM
FPGA側で2つの周期の異なる三角波を作成し、その値をDMA FIFOでHOAT側へ送ります。その際に、その瞬間でのアナログ入力の電圧値も同時にDMA FIFOでHOST側に送ります。
HOST側では、三角波1と三角波2とアナログ入力モジュールの電圧値を読み出して、3列の行列をどんどん記録していくシステムを構築したいと考えております。
三角波1 | 三角波2 | A-IN
1050 | -1450 | 4
1051 | -1449 | 8
1052 | -1448 | 0
1053 | -1447 | 2
のようなリストデータを取得したいのです。試しに三角波1の信号をアナログ出力モジュールから出力して、そのままアナログ入力モジュールに接続してみました。1ループ分(40us)くらいのディレイはあるとは思うのですが、2ms程の時間差が生じておりました。
しかもアナログ入力モジュールの方が早く、三角波の信号のほうが遅くなっておりました。
このズレはどこからくるのでしょうか。
HOST側では、2000要素ずつ取り出しています。ちょうどFIFOで2000要素溜まる時間で取り出すようにしているので、タイムアウトは起きません。
また、このように複数のFIFOを同期を取りながらHOST側で取得したい際に適した方法などがありましたらご教授お願い致します。
解決済! 解決策の投稿を見る。
06-14-2018 06:56 PM
FIFOを3つお使いですが、それを1つにまとめてしまう方法はどうでしょう?
三角波1/三角波2/A-INを3要素の配列にまとめて1つのFIFOで転送します。
イメージとしては以下のヘルプ「Interleaving Data on the FPGA Target」です。
Transferring Multi-Channel Data in DMA Applications (FPGA Module)
受け取りは上記ヘルプの「Decimating Data on the Host Computer」のようにすればよいです。
今回は"Samples to read per channel"は2000になりますね。
この方法を使う場合、転送するデータタイプがすべて同一である必要があるので、
SBLか何かに型変換する必要があります。
06-15-2018 10:49 PM
返信有難うございます。
貴重な情報ありがとうございました。
FPGA側で3つの情報をインターリーブし、HOST側でデシメートするシステムに変えましたところ、遅延は数msから900us弱まで小さくすることができました。
しかし、依然として840usの遅延があります。FPGA側は1ループ40usで回しているので21ループ分遅れています。
この遅れは一体どこから来るのでしょうか。VIの構造上1ループは遅れることはわかりますが、ここまで遅れるのは不思議です。
AOから出力するまでのラグ?現在考えているシステムでは900us程度のラグは許容できません。
なにか原因として思い当たるところは無いでしょうか。
よろしくお願い致します。
06-17-2018 07:00 PM - 編集済み 06-17-2018 07:02 PM
FPGAクロックの周波数はどれほどでしょう。
LabVIEW FPGAにおいては「有効チェーン」が存在しますので、
Single-Cycle Timed Loop (SCTL)外の処理は各関数の実行に1tick以上かかります。
Dataflow and the Enable Chain in FPGA VIs (FPGA Module)
FPGA VIを拝見すると、AI0から信号を集録してから実際に信号が出力されるまで、
数tickは遅延があるように見受けられます。
使用できる箇所にはSCTLを用いて遅延を減らすなど、SCTLを積極的に使ってみてはいかがでしょう?
06-18-2018 04:13 AM
40MHzで動いています。アナログ入出力や各処理にかかるティックカウントを計測したり、SCTLを使ってティックカウントを節約したりしてみましたが変化ありません。
800usも遅れているので、クロックとかの話ではないような気がします。
AOに出力指示を出してから実際に出力されるまでにそれくらい時間があるのかなあ、と思えてきました。
これはまた別の記事で質問したいと思います。
ありがとうございました。