解決 : USRP-RIOで受信データ落ちしてもエラーが表示されない場合がある。その現象とは?

clip_image005

ドルフィンシステム福島です。

2017/11/06の「USRP-RIOで受信データ落ちしてもエラーが表示されない場合がある。その現象とは?」ですが、ナショナルインスツルメンツ内部では既知の問題だったようで、ナショナルインスツルメンツ稲毛様から解決方法を教えてもらう事により解決しました。

今回は、解決方法をお知らせいたします。

■ 現象のおさらい

前回報告した結果は、

「USRP-RIOでバス幅を超えるIQレートを設定しても、オーバーフローエラーが発生しない」

というものでした。

確認した現象

  • 1chでIQレート 200M収録→オーバーフロー発生せず。これは正しい現象です。
  • 2chでIQレート 200M収録→オーバーフロー発生せず。本来は発生すべきです。

    ■ 原因は?

    では原因です。

    前回はデバイスドライバが原因では?と推測しましたが、実はサンプルの不具合でした。

    サンプルの中で、オーバーフローカウンタをアップしている箇所があるのですが、その実装は、

    「2チャンネル有効時に片チャンネルだけOverflowしても、オーバーフローカウンタが上がらない」

    というものでした。

    つまりオーバーフローが発生していても、両方のチャンネルが同一タイミングでオーバーフローしないとオーバーフローカウンタが上がっていきません

    1chで収録している場合は、問題なくオーバーフローカウンタが上がっていきますが、2chの場合は、オーバーフロー発生する時もあればしないときもあるというものです。

    ■ 対応策

    今回不具合を確認したサンプルは、NI-USRP 16.1に含まれている"NI-USRP Simple Streaming"ですが、他2つのサンプルも同じ実装なので同じ不具合を抱えていると思いますので、注意が必要です。

    以下に紹介する対応策で不具合修正可能と思います。

    今回不具合確認

    NI-USRP Simple Streaming

    同じ不具合有り

    NI-USRP Simple Streaming with Time

    同じ不具合有り

    NI-USRP Multi-device Synchronized Simple Streaming

    clip_image001

    ■ FPGA側の修正

    カウンタ周りの論理条件を修正することで、両方のチャンネルで別々にオーバーフローが発生してもオーバーフローカウンタがアップするようにします。

    Write FIFO (Multi-Channel).vi

    このVIの修正点は、Write U32 FIFOから出力されている"Ready for Input"にNotを入れます。

    2カ所ありますので2カ所入れます。

    修正前
    clip_image002

    修正後
    clip_image003

    Rx Core.vi

    このVIの修正点は、Write FIFO (Multi Channel)の"Ready for Input"がInput Stream Control.viに接続されています。この間にnotが入っていますが削除します。

    修正前
    clip_image004

    修正後
    clip_image005

    ビルド

    ここまで修正したらFPGAをビルドしておきます。

    ■ ホスト側の修正

    次にホスト側の修正を行います。

    片方のチャネルしか使用していない場合でも、両方のチャンネルを使用するようにフラグを立ててしまっているので修正します。

    Initiate Stream.vi

    まず使用しているチャネルのフラグを設定するブール配列制御器(名称 Ch Enable)を配置します。外のVIからCh Enableを設定できるように、コネクタペーンの適当なところに接続します。

    で、このブール配列をそれぞれをFPGAのrx 0.stream enableとrx 1.stream enableに接続します。

    clip_image006

    修正前
    clip_image007

    修正後
    clip_image008

    Initiate and Trigger.vi

    上記と同じようにブール配列制御器を配置して、コネクタペーンに接続します。

    で修正したInitiate Stream.viにCh Enableを接続します。

    clip_image009

    clip_image010

    Rx Streaming(Host).vi

    最後に設定画面で設定された、チャネルの有効無効の設定値をブール配列の形でInitiate and Trigger.viに接続します。

    clip_image011

    まとめ

    本日のまとめです。

    USRP-RIOサンプルでオーバーフローエラーを観測するためには、2chが同時にオーバーフロー発生する必要がある。これは不具合で、FPGAやホスト側ソースコードを修正することで、解決可能である。

    というわけで解決は可能です。

    修正したソースコードを公開しようと思いましたが、LabVIEWのバージョンを合わせるなど色々面倒だったので公開は致しませんが、ご入り用なら個別にご連絡ください

    さて次回予告です。

    今回の不具合はナショナルインスツルメンツさん内部では既知の問題でした。

    ではこのような問題が既知の不具合なのか、未知の不具合なのか?どうやって不具合情報を確認すれば良いのか?

    来週はこのあたりをお知らせいたします。

    以上、ドルフィンシステム福島がお送りしました。

    コメント