zFIFO is 何†
zFIFO は Zynq / ZynqMP SoC むけの AXI Scatter-Gather DMA ドライバです。
こういう気持ちで作りました:
- Vivado HLS でアクセラレータを作りたい。AXI Lite とかよくわからないので AXI-Stream にしたい
- SDSoC とか Vitis とかよくわからないし、アクセラレータ以外に RTL とか書いて PL の I/O ピン (Pmod) とかも好きに使いたい
- PetaLinux はなんだかよくわからないしできれば使いたくない
- AXI-Stream は Linux から FIFO っぽく使いたい
- Linux 側に固定サイズのバッファを確保しておくのはいやだ、ふつうに malloc() した領域を read() と write() っぽく転送したい
- デバイスツリーとかよくわからない、DMAコントローラのレジスタのアドレスだけ覚えておけばよくない?
- uio はうっかりやってしまいそうで、なんか怖い
こういう人はきっと他にもいると思います。
動作環境とか†
- デバイス: Zynq-7000 (Zynq Soc) および Zynq Ultrascale+ (Zynq MPSoC)
- PL 側に実装した AXI DMA を動かすためのドライバです
- ZYBO (無印および Z7-20), Eclypse Z7 と Ultra96 (無印および v2) 用のデモを用意しています。ほかのボードでも動きます
- OS: Xilinx 提供の Linux kernel (ここのところしばらく 4.19.0だけど、Linux kernel 4.15.0 くらいから後なら動きそう)
- Root filesystem (ユーザランド) はなんでも大丈夫です。開発には Ubuntu 18 を使っています
- AXI DMAコアについて
- Scatter & Gather モードに設定されていなければなりません
- 基本的に Read と Write の両方のチャネルが必要です
- Buffer Length Register のビット幅はドライバのコンパイル時に設定した値と一致しなければなりません (ドライバの規定値は20)
- PS との AXI インタフェイスとかが変わる場合には FSBL も作り直さないといけないのかもしれません (よくわかっていません、すみません)
- ユーザのPL側ロジックについて
- AXI DMAと接続するAXI StreamインタフェイスにはTLAST信号が必要です
- ソフトウェアについて
- ソフトウェアからみた書き込み、読み出し操作はそれぞれ1つずつであれば別スレッドから行っても構いません
- 複数のスレッドから同時に書き込んだり、同じく読み込んだりすると予期せぬ結果につながります
- ソフトウェア・ハードウェア共通
- AXI DMAを使って PS 側へ送信するデータの (送信開始からTLASTまでの) サイズは PS 側のプログラムにとって既知である必要があります
- AXI DMAで一度に転送するサイズは scatter & gather descriptor table のサイズの制約を受け、最悪の場合は 64MB までです
- ドライバ側ではサイズのチェックはしていないので、大きいデータ転送をするアプリケーションの場合には注意してください
とりあえず使ってみる†
更新履歴†
- 2021.1.7
- Kernel 5.6以降でも動作するように修正しました (trunk rev.9)
- 2020.12.31
- Ultra96v2 用の Vitis platform を Download に追加しました。zFIFO とは関係ありませんが、ご利用ください
- 2020.10.5
- Digilent Eclypse Z7 で使うための一式を Download に追加しました
- 2020.6.2
- Ultra96v2 用の起動パーティションのファイル (.zip) を更新しました: WiFi がちゃんと使えるようになりました
- Ultra96v1/v2 用の root filesystem のファイル (.tar.xz) を更新しました: XRT と zocl などが入りました (Vitis 対応の準備工事です)
- 2020.3.12
- 2020.3.9: