09-09-2010 07:22 AM
いつも大変お世話になっております。
「計測ファイルへ書き込み」関数に関する質問です。
画像を添付いたしますが、
①FPGA VI(SCTLを使用)で0から65535までの数字をループさせ、FIFOに出力(depthは16383に設定)
②Host VIでFIFOに格納されたデータをそのまま計測ファイルへ書き込み関数に出力
上記①②の行程により、lvmファイルには0-65535の数字が繰り返し書き込まれているのが所望の動作ですが、添付画像③のように、初めから65535の数字しか出てきません。また、Elements Remainingの値は16382で飽和します。
FIFOのConfigureやStartを外した場合も同様に65535の値で飽和します。
Depthを16838より大きくした場合には、フロントパネルの表示器(Numbers)は0となり、lvmファイルは出力されませんでした。
他にも色々とFIFOの設定を変えたりして原因を追究しましたが上手くいきません。
lvmファイルに書き込まれる値が飽和する原因をご教授いただけますでしょうか。
また、Elements Remainingに残っているデータを、VIを動作させる前に消去する方法があるかどうかについても教えていただけると助かります。
よろしくお願い申し上げます。
解決済! 解決策の投稿を見る。
09-12-2010 07:52 PM
Medphys_ST 様
平素より弊社ディスカッションフォーラムをご利用頂きまして誠に有難うございます。
日本ナショナルインスツルメンツ黒須と申します。
FPGA側のFIFOのサイズはどの様になっておりますでしょうか?
もしこれが添付イメージのように小さい場合、すぐに上書きされてしまいFPGAのFalseのケースから配線されたデータがホストで読み取られる可能性はあります。
これはFPGA側が高速で実行され(25nsec)FIFOに値がアップされているのに対して、ホスト側が遅い速度で読み取っている為に(CPUにより異なるが数ミリ~数十ミリ秒)、
FIFOのデータがすぐに上書きされてしまっているために、ホスト側からは値がすぐに65535に達している様に見えるのではないかと思います。
もしよろしければ、FPGAのVI、HostのVI、プロジェクトファイル、ビットファイルなど一式を添付していただければこちらで確認してみます。
よろしくお願いいたします。
09-13-2010 11:21 PM
黒須様
ご回答くださりありがとうございます。
VI一式を添付いたしました。確認していただけると幸いです。
よろしくお願い申し上げます。
09-14-2010 03:03 AM
Medphys_ST 様
平素より弊社ディスカッションフォーラムをご利用頂きまして誠に有難うございます。
日本ナショナルインスツルメンツ黒須と申します。
まずFPGAのVIについてですが、こちらは作成いただいた際にウィンドウで開発したものなどをコピーしていただいたのではないかと思うのですが、
FPGAのVIでタイミングループを使用した場合、デフォルトでシングルサイクルタイミングループとなりループをFPGA上の1クロック(25usec)で実行を行ないます。
したがってFPGAのプログラムは25usecで実行されていることになります。
もしFPGAのループを制御する際には下図の様にタイミング関数を用いてループを制御してください。
Windowsホストの方で65535しか出力されない理由ですが、
考えられる原因としましてはFPGAのVIをコンパイルの際に実行させてその後Windowsホストを走らせた場合、
FPGA側は25usecで超高速でループを処理しておりますので、ループカウント端子の"i"の値が50数秒でI32の最大値の"2,147,483,647"に飽和してしまいます。
もし"i"の値が飽和すれば16ビットに変換処理をした値もすべてが1のビットとして出力されるため"65535"しか出力されない原因として考えられます。
Windowsホストから実行する場合には下図のように最後にFPGAリファレンスを閉じることを行わないとFPGAがそのまま動き続けてしまいます。
そのため次回実行した際には"i"のカウントが最大値に飽和していて、帰ってくる値が"65535"ということにも十分なるかと思います。
一度これらをご確認してみてください。
よろしくお願いします。
09-14-2010 03:57 AM - 編集済み 09-14-2010 04:00 AM
Medphys_ST 様
日本ナショナルインスツルメンツ黒須です。
シングルサイクルタイミングループのデフォルトは25usecではなく25nsecです。
書き間違えておりました。
また1つ目の添付画像も訂正させていただきます。
正しい添付画像は以下の通りです。
失礼いたしました、取り急ぎ訂正させていただきます。
よろしくお願いします。
09-14-2010 04:22 AM
黒須 様
ご回答くださりありがとうございます。
ご指摘いただいた部分について確認後、再度ご連絡させていただきます。
よろしくお願いいたします。
09-16-2010 06:13 AM
黒須様
確認いたしましたが、やはり前回と同様に値は65535で飽和してしまいました。
先日ご回答をいただいた際に添付していただいたFPGA FIFOのプロパティ画像を拝見しましたが、私が使用しておりますバージョンが8.2.1のためNumber of Elementsの設定ができません。(プロパティ画面を添付させていただきます)
また、申し遅れましたがFPGA VIは25nsより実行速度を下げたくないためにSCTLを使用いたしております。
そのためタイミング関数を使用できません。
再度質問させていただきたいのですが、、
<もし、"i"の値が飽和すれば16ビットに変換処理をした値もすべてが1のビットとして出力されるため”65535”しか出力されない....
FPGA VIでiの値が飽和した場合に再度0から処理させることはできるのでしょうか。
FPGA VIの実行速度を落とすことなくlvmファイルに0-65535の数字が正確に繰り返し書き込まれるためにはHost側(あるいはFPGA側)で新たな関数が必要なのかについてご教授いただけると幸いです。
よろしくお願いいたします。
09-16-2010 06:37 PM - 編集済み 09-16-2010 06:38 PM
横槍で恐縮です。
常に0~65535の数を繰返し得るのであれば、添付のようではダメですか?
whileのカウンタ i を使うと 2^31-1 で飽和してしまうので、これを使わずに、初めからU16で
シフトレジスタで回し、1を加算し続けます。この場合、飽和せず、65535の次は0に戻ります。
(FPGAは使ったことがないので、ごく普通のviのごとく記述でき動作するとして、ですが)
あと、オリジナルのviで、カウント値が65536以上のときに、16ビット左シフトして16ビット右シフトする、
という操作は、カウント値の下16ビットを取り出す(U16へキャストする、又は65535(=0xFFFF)とANDする)と
同じ意図で良いでしょうか?
宜しくご参考下さい。
09-21-2010 02:57 AM
Medphys_ST 様
M.Shiraishi 様
日本ナショナルインスツルメンツ黒須です。いつもお世話になっております。
M.Shiraishi 様の仰る通りもし0~65535の連続的な数値を出力するだけであればU16を確保してインクリメントしていくという方法でも実装可能かと思われます。
Medphys様の場合FPGA側のFIFOプロパティのDepthがFPGA側で確保されるFIFOバッファになります。
また、ホストVI側のFPGAFIFOのプロパティノードで設定される深度がホスト側のバッファになります。
FPGA側でFIFOに入れられたデータがDMA転送されてホスト側のバッファに入ります。
FPGA側のFIFOバッファはホスト側のバッファがいっぱいであるときもしくは、DMA転送が遅れてしまっている様なケースにデータの取りこぼしなどを防ぐために使用されます。
ホスト側はFPGAから送られてきたデータがバッファに溜りループのタイミングで読み取るサンプル数分データを取ってくる形になります。
例えば25nsecでデータが飛ばされてきているの対して、10msecおきにデータをホスト側で読み取った場合単純に400000個以上のデータを配列としてまとめて取り出さないと10msecでは追いつかずにどんどんバッファにデータが溜まっていってしまいます。
もしFPGA側を25nsecで高速に処理をさせてFIFOに書き込むのであれば、ホスト側のバッファサイズとFPGA側のバッファサイズとを調整する必要があります。
ホスト側、FPGA側のバッファサイズやホスト側のループレートなど色々と設定を行ってご確認いただければと思います。
よろしくお願いします。