LabVIEW FPGAで実装したFIFOの量をソフトウェアから取得する

こんにちはドルフィンシステム福島です。

今日は久しぶりにLabVIEWの話題です。


ソースコード(LabVIEW 2018) : 20210607-Get Info from lvbitx.zip

PCI ExpressバスのFIFO

LabVIEW FPGAでPCとUSRP(FPGA)間でのデータ転送は、PCI Expressバスで転送します。

このバスにはFIFOがあり、送受信にデータあふれを予防するバッファとして機能します。

USRPから高速にデータを転送する場合、例えば200Mspsの場合は、800MB/sのデータがUSRPから流れてきますので、データ落ちしないようにソフト側で受け取る必要があります。

この際に、ソフト側が一定間隔で確実に受け取れれば良いのですが、Real Time OSではないWindowsは多少ふらつきがあります。

ふらつきの時間がFIFO量よりも大きいとデータがあふれてしまうため、高速に転送する場合は、FIFO量を多めに実装しておきます。


FPGAには、FPGAリソースとタイミング制約があるためFIFO量は自ずから上限があります。

USRP IDLでの私の経験では32k~64kが上限で、それ以上になるとタイミングエラーが発生しFPGAのビルドが難しくなります。何をどこに実装しているのかでタイミングエラーの発生は変わるので、一概に言えませんが・・・


下図ではFIFO量 8kに設定しています。


実装されているFIFO量をソフトから取得・・・できない。

このFPGAのFIFO量ですが、ソフトウェアから取得しようと思っても実は取得できません。

そのような関数もプロパティも用意されていません。


下図のようにFPGA FIFO関連の関数を見ても、ありません。
ソフト側のFIFO量の指定はできますが、FPGA側FIFO量の取得はありません。


下図のように、FPGAの制御器にもありません。


ではどうやって取得するか。

「FPGA側でFIFO量の固定値を返すレジスタ」でも用意しようかと思いましたが、FIFO量変更後にレジスタ設定を忘れてて余計混乱しそうだったので止めました。

FPGA実行開始時にFIFOにダミーデータを入れてあふれた量をFIFO量として算出させようかとも思いましたが、なにやらやらかしそうな余計な実装になることが目に見えていたので、こちらも止めました。

で、思いついたのがビットファイルに書かれている情報。

LabVIEW FPGAのビットファイルはただのバイナリファイルでは無く、実は巨大なXMLファイルで、FPGAに含まれているレジスタやインターフェイスの情報がXMLで記述されており、ビットファイルの実態もファイルの最後の方にテキスト化されて記述されています。


これを思い出したので、さっそくエディタで開いて探してみると、ありました!

エレメント数が 64K。設定した値が書かれています。

どうもビットファイルをビルドしたときの情報が記述されているようで、これなら信頼性がありそうです。


ちなみに下図が、ビットファイルのバイナリデータ部分。


LabVIEWで取得してみる

LabVIEWにはXML関連の関数があり、これらを使用することで取得できます。

XPathが使えるので、以下の様に直接XMLノードから値を取得しクラスタにまとめます。


ソースコードは、ページ上部からダウンロードしてください。


これをLabVIEW FPGAのビットファイルを読み込ませてみると、ちゃんと取得できました。(突っ込み所満載のコードですが)



まとめ

  • ソフトウェアから、LabVIEW FPGAのFIFO量を取得できる関数や機能は存在していない。
  • LabVIEW FPGAのビットファイルはXML形式で情報が保存されている。
  • XMLの中にFIFO量が記録されているので、XMLとしてパースすればFIFO量が取得可能。

筆者の所属するドルフィンシステムでは、SDRを使用した開発サービスソフトウェア無線機を使用したRFキャプチャシステムフェージングシミュレーターの開発と販売を行っております。

以上、ドルフィンシステム福島でした。


コメント