ZYNQのPLからPSへ大規模DMA
PLからPSへ大きなサイズのDMAができるようにしました。
AXIバスは最大で256ビートのバースト転送(32bit幅なら1024バイト)ができます。AXIのマスターとなる回路をユーザロジックに作り、ZYNQのPSにAXIでパケットを送ればメインメモリに書き込まれます。
しかし、AXIバスは最大256ビートまでなので、より長いサイズのDMAを行いたい場合は、このバースト転送を細切れにして発行するしかありません。
そこで、そういうステートマシンを作りました。
上の図は64ビートのバーストライトを4回繰り返しています。書き込んでいるデータは乱数(XorShift)です。
実際に67108864ビート(256MByte)のDMAを行ってみて、その時の端子の状態をMITOUJTAGのバウンダリスキャンで見てみたところ、約0.77秒の間、DDR3 SDRAMの端子が激しく動いていました。
256Mバイトを0.77秒で書くわけなので348MByte/secということになります。
たしか、ZYNQのメモリは32bit幅で、周波数は1066MHzくらいだったと思うので、メモリ帯域幅は4Gバイト/秒はあるはずです。
したがって、AXIのマスターポートから100MHzのバスクロックでデータを入れても10%も使っていない計算になります。まだまだ余裕ですね。
| 固定リンク
コメント
やはり、BVALIDが来るのは遅れますね。なひたふさんの回路だと関係ないみたいですが。AXI INTERCONNECTの設定はデフォルトですか?
投稿: marsee | 2013.11.27 08:19
私はまだAXIのことをよくわかっていないので、デフォルトの設定から変更していません。
BVALIDが遅れるのは、実際にDDR3 SDRAMに書き込まれた後だからじゃないかなと思います。
投稿: なひたふ | 2013.11.27 09:31
了解しました。お返事ありがとうございました。
AXI INTERCONNECTをバッファリング・モードにした時にどうなるか興味深いです。後でやってみようと思っています。
投稿: marsee | 2013.11.27 09:57
つまりAXIの中のFIFOを有効にするということですね?
あのオプションは気になっていたのですが、どんなバグが潜んでいるかと思うと、怖くて使えませんでした。

ちゃんと動くならよさそうですが・・
投稿: なひたふ | 2013.11.27 12:18