EZ-USB FX3の転送速度が207MB/secまで行った
EZ-USB FX3とFPGAをつないで、転送速度が207MB/secまでいきました。
実験に使ったボードは特電のFX3評価ボードです。
といっても、この速度を出すにはいろいろ条件があるのですが・・
最初に、前の記事で皆様にコメントいただいたようなepCfg.burstLen=15や、ディスクリプタの変更を行ってみたのですが、それだけでは速度が出ませんでした。なんでだろうと思って、Cypressのアプリケーションノート「AN65974」の中にあるファームウェアをためしてみると、FPGAとつなぐSlaveFIFOで207MB/secでました。
ただ、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が出るようになりました。
たぶん、
#define CY_FX_SLFIFO_DMA_BUF_COUNT (2)
を
#define CY_FX_SLFIFO_DMA_BUF_COUNT (4)
にすることが効いたのだと思います。
このときのデータバスの波形を次の写真に示します。
こんな感じで間欠動作しています。1回のバーストが82μ秒なので、おそらく8192バイトのデータが入っていると思われます。このような感じで、82μ秒バーストして、40μ秒ほど休んで、バーストして、休んでを繰り返しているので、データバスの使用率は67%程度になります。データバスは16bitにしているので、130MB/secくらいになります。
で、この67%というのがある意味「FX3の結構いい数値」なんじゃないかなと思います。
たとえば、githubにnoritanさんが作ってくださったDMA MultiChannelのサンプルがあります。これはFX3内部で何らかのデータを発生させてBulkInでとってくるものなのですが、速度は270MB/secでした。このサンプルはチップ内部で完結しているのでバス幅は32bitと考えると、やはり使用率は65%です。
やりかたをまとめると、まず、SlaveFIFOSyncをもってきて、
- cyfxslfifosync.hにある #define CY_FX_SLFIFO_DMA_BUF_COUNT が2になっているので、4にする。
- cyfxslfifosync.cにある、dmaCfg.sizeとepCfg.burstLenを変更する。
・ epCfg.burstLen = 16;
・ dmaCfg.size = size * 16; - 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評価ボードは在庫残りわずかになってきました。次のロットは年明けになると思いますので、ご興味をお持ちの方はおはやめにお願いします。
| 固定リンク
コメント
なるほど、この方法ならUSB3.0からGbitEに変換すれば遠方のPCに大容量の計測データを送れそうですね。
最近はSiTCP
http://e-sys.kek.jp/tech/sitcp/
を利用しており、ボード開発がたいへんでしたが、ブレッドボードの組合せ+ユーザーサブボードの接続にすれば、内作ができそうです。
ありがとうございます。
投稿: tube-polisher | 2012.12.13 13:43