« E1とHEWで究極のRX62Nボードをデバッグする方法 | トップページ | EZ-USB FX3とFPGAの接続 »

2012.12.13

EZ-USB FX3の転送速度が207MB/secまで行った

EZ-USB FX3とFPGAをつないで、転送速度が207MB/secまでいきました。

実験に使ったボードは特電のFX3評価ボードです。

Fx3_fpga_1213

といっても、この速度を出すにはいろいろ条件があるのですが・・

最初に、前の記事で皆様にコメントいただいたようなepCfg.burstLen=15や、ディスクリプタの変更を行ってみたのですが、それだけでは速度が出ませんでした。なんでだろうと思って、Cypressのアプリケーションノート「AN65974」の中にあるファームウェアをためしてみると、FPGAとつなぐSlaveFIFOで207MB/secでました。

Fx3_210mb


ただ、AN65974 のファームウェアは、SlaveFIFOを32bit幅で扱います。すると、データバスの能力は400MB/secなのですが、その約半分しか出ていないことになります。またデータバスを32bitにしてしまうと、FPGAの利用可能なピンが減ってしまうので、できればやりたくありません。(カメラがつなげられないでしょ?)

そこで、なんとか16bit幅で高速にできないものかと考えました。

まず、AN65974にある

#define CY_FX_SLFIFO_GPIF_16_32BIT_CONF_SELECT (1) 

#define CY_FX_SLFIFO_GPIF_16_32BIT_CONF_SELECT (0) 

にしてみました。これはダメ。GPIFが32bit用にコンフィギュレーションされているのか、うんともすんともいいません。

よくわからないのですが、AN65974と見比べながらいろいろな部分を参考に変えていったら、16bit幅でも130MB/secが出るようになりました。

Fx3_130mb

たぶん、

#define CY_FX_SLFIFO_DMA_BUF_COUNT      (2)

#define CY_FX_SLFIFO_DMA_BUF_COUNT      (4)

にすることが効いたのだと思います。


このときのデータバスの波形を次の写真に示します。

Fx3_burst_wave

こんな感じで間欠動作しています。1回のバーストが82μ秒なので、おそらく8192バイトのデータが入っていると思われます。このような感じで、82μ秒バーストして、40μ秒ほど休んで、バーストして、休んでを繰り返しているので、データバスの使用率は67%程度になります。データバスは16bitにしているので、130MB/secくらいになります。

で、この67%というのがある意味「FX3の結構いい数値」なんじゃないかなと思います。

たとえば、githubにnoritanさんが作ってくださったDMA MultiChannelのサンプルがあります。これはFX3内部で何らかのデータを発生させてBulkInでとってくるものなのですが、速度は270MB/secでした。このサンプルはチップ内部で完結しているのでバス幅は32bitと考えると、やはり使用率は65%です。

Fx3_dmamul

やりかたをまとめると、まず、SlaveFIFOSyncをもってきて、

  1. cyfxslfifosync.hにある #define CY_FX_SLFIFO_DMA_BUF_COUNT が2になっているので、4にする。
  2. cyfxslfifosync.cにある、dmaCfg.sizeとepCfg.burstLenを変更する。
    ・ epCfg.burstLen = 16;
    ・ dmaCfg.size  = size * 16;
  3. cyfxslfifousbdscr.cにあるデスクリプタの定義、「CY_U3P_SS_EP_COMPN_DESCR」の中の
        0x00, /* Max no. of packets in a burst : 0: burst 1 packet at a time */
    という行を
        0x0f, /* Max no. of packets in a burst : 0: burst 1 packet at a time */
    に変更する。(2か所 153行目と168行目)

バスの帯域をMaxに使うことはできないけど、余裕で100MBを超えられることは確認できました。簡単にPCI Express x1の速度を超えられるのです。バスの帯域は最大値の67%くらいというのが現実的なラインなのかもしれません。

次はFPGA内部のロジックと正しくデータを受け渡しするための方法について考えてみたいと思います。

なお、特電のFX3評価ボードは在庫残りわずかになってきました。次のロットは年明けになると思いますので、ご興味をお持ちの方はおはやめにお願いします。

|

« E1とHEWで究極のRX62Nボードをデバッグする方法 | トップページ | EZ-USB FX3とFPGAの接続 »

コメント

なるほど、この方法ならUSB3.0からGbitEに変換すれば遠方のPCに大容量の計測データを送れそうですね。

最近はSiTCP
http://e-sys.kek.jp/tech/sitcp/
を利用しており、ボード開発がたいへんでしたが、ブレッドボードの組合せ+ユーザーサブボードの接続にすれば、内作ができそうです。
ありがとうございます。

投稿: tube-polisher | 2012.12.13 13:43

コメントを書く



(ウェブ上には掲載しません)




« E1とHEWで究極のRX62Nボードをデバッグする方法 | トップページ | EZ-USB FX3とFPGAの接続 »