(C) by T.IZUMI, Sep 2015
Ver. 2015.10.06.a
組込みシステム開発トレーニング課題
Xilinx Zynq による DMA - Stream 接続のサンプル Vivado版
ソースコードを含むアーカイブ一式はこちら:
http://www.ritsumei.ac.jp/se/re/izumilab/lecture/15ZedboardDmaVivado.zip
- ターゲットボード
- ZedBoard   (or ZYBO)
- ターゲットFPGA
- XC7Z020-1CLG484C (or XC7Z010-1CLG400C for ZYBO)
-
ZYBOで実行する場合はボード定義ファイルをインストールしておくこと。
https://reference.digilentinc.com/vivado:boardfiles
-
それ以外のボードでトライする場合は、ボードの仕様に合わせてxdcファイルとトップ記述、およびIP Integrator でのProcessor Systemの設定を書き換えるべし。
- 開発環境
- Xilinx Vivado 2015.2
- Xilinx SDK 2015.2
- この課題の習得項目は次の通り。
- Vivado IP Integrator によるZynq PL+PS 組込みシステムの構築
- Xilinx SDK によるソフトウェア開発
- PSのDRAMからPL上のStreamへのDMA転送
- PL上のStreamからPSのDRAMへのDMA転送
- (PL上のモジュールはダミーのFIFO)
- ZedBoard (or ZYBO) による実機動作確認
- この課題は次の項目を習得済みの者を対象とする。
- 計算機アーキテクチャ(基本+割込み、cache, MMU, DMA などの応用を含む)
- Cプログラミング, OS, コンパイラ
- FPGAボードの基本的な取扱い
- PCとボードのUART接続
- Vivado による RTL 設計の基礎(→推奨)
- Vivado IP Integrator, SDKの基本操作(→推奨)
- Zynqを用いた設計の基礎(→推奨)
- この課題終了後には次の課題を推奨する。
- 以下、特に指定の無い項目は規定値(デフォルト、最初から入っている値)を設定する。
- Vivado は深くフォルダを掘ってトラブルを起こすので、
課題を実行するフォルダにドライブ文字を割り当てておくとよい。
subst_dir.bat のフォルダ名を変更して実行すると良い。
1. システムの構築(Vivado)
- Vivado を起動する。
既存のプロジェクトが開いていたら [File] -> [Close Project] する。
1-1. プロジェクト生成
1-2. ブロック設計 (Vivado - IP Integrator)
- IP Integrator で Create Block Design する、Design name = Zynq_PS とする
- Add IP で Zynq PS を追加
- Zynq PS を Re-customize IP する
- Presets で ZedBoard を設定
(or Import XPS Settings からZYBO_zynq_def.xml をインポート)
-
UART1 (MIO48,49), LED(MIO7), Push Button(MIO50,51)
にチェックが入り設定されていることを確認する。
(設定されていなければマニュアル設定)
- PS-PL Configration でS AXI HP0 Interface
を追加
- Run Block Automation を実行、このときApply Board Presetのチェックを外す
- Add IP で AXI4-Stream Data FIFOを追加(ハードウェアアクセラレータのかわり)
- FIFO を Re-customize IP する
- FIFO Depth: 1024,
TDATA Width (bytes): 4にする。
- FIFO の M_AXIS を右クリックし Make Connection して PS の S_AXI_HP0 に接続
- Processor System Reset, AXI Inteconnect, AXI Direct Memory Accessが自動で入る
- 何故か FIFO の S_AXIS も自動で接続されている
- Run Connection Automation して DMA の S_AXI_LITE と PS の M_AXI_GPO を接続
- AXI Interconnect が自動で入る
- DMA を Re-customize IP する
- Enable Scatter Gather Engine がチェック無しになっていることを確認
- Allow Unaligned Transfers (Read,Write共)がチェックになっていることを確認
- Add IP で AXI GPIO を追加(デバグ用)
- GPIO を Re-customize IP する
- Enable Dual Channel にする
- ポートを二つとも All Inputs にする
- GPIO の gpio_io_i[31:0] と FIFO のaxis_wr_data_count[31:0]を接続
- GPIO の gpio2_io_i[31:0] と FIFO のaxis_rd_data_count[31:0]を接続
- Run Connection Automation して GPIO の S_AXI と PS の M_AXI_GP0を接続
- Validate Design する
- Generate Block Design する
1-3. システム生成、コンパイル、エクスポート
- Flow Navigator で Project Manager を選択
- Souces ウィンドウ内でZynq_PS.bdを右クリックしCreate HDL wrapperする
- Generate Bitstream する
- Export Hardware (Include Bitstream) する
2. プログラムのコンパイルと実行(SDK)
2-1. SDK の起動とプロジェクト設定
2-2. 実行
- (ZYBO では JP5 が JTAG 側に刺さっていることを確認。)
- 念のためボード上の BTN7 PS-RST (BTN7 PS-SRST for ZYBO)を押下
- Program FPGA
- Terminal を Serial 115200bps, 8bit, no parity, no flowctrl で接続
- Build All
2-3. 動作確認
- dmatest を Run As -> Launch on Hardware (System Debugger)
- 動作が始まるとランプLD9 MIO7が点滅(LD4 MIO7 for ZYBO)
- UART経由でTerminalに動作状況を表示
- 進行カウンタ、送出/受取ブロック数、送出/受取ビジー状態、FIFOのデータカウンタ
- PB1 MIO50 / PB2 MIO51 を押下するとDMAの送出/受取のリクエストが出される。
(BTN4 MIO50 / BTN5 MIO51 for ZYBO)
- FIFO(恐らくDMA内部のFIFOも含めて)2つ分のデータが格納可能
- ボタンを押して動作の様子を確認
- MIO51 受取リクエスト1回目 (rxbusy->1)
- MIO50 送出リクエスト1回目 (一度 txbusy->1 になって、両busy->0)
- MIO50 送出リクエスト2回目 (一度 txbusy->1 になって ->0, FIFO カウンタが進む)
- MIO50 送出リクエスト3回目 (一度 txbusy->1 になって ->0)
- MIO50 送出リクエスト4回目 (txbusy->1)
- MIO51 受取リクエスト2回目 (一度 rxbusy->1 になって、両busy->0)
- 以下、送出/受取リクエストを繰り返す
- どちらも8回になったら終了
- テスト終了
学習
- Block Design の構成、各IPの役割を理解すること
- dmatest.c を読んで、DMA の使い方を理解すること
- ポイント…XAxiDma_SimpleTransfer(), XAxiDma_Busy()の使い方
- 注意…volatile宣言, バッファ変数の memory alignment, キャッシュの flush と invalidate, DMA busy の初期状態
- この方法で次が可能となる
- ARM プログラムからデータをAXI Data Streamでハードウェアアクセラレータに送る
- ハードウェアアクセラレータからデータをAXI Data StreamでARM プログラムに送る