2021年4月9日金曜日

PYNQ V2.6でDMA転送をする話(ビットストリーム生成)



絶賛就活中,中の人です.気晴らしがてら進めていた研究の方でPYNQのDMAを使うことがあったのですが,その際に得た知見をまとめようと思います.
ビットストリームはこちらに上げてあります.  



1.環境



ボード:PYNQ-Z2(TUL製,xc7z020clg400-1搭載)
Vivado : Vivado 2020.1
PYNQ : V2.6
OS Ubuntu 20.04LTS

特に変哲のない感じですが,PYNQ V2.6はVivado 2020.1でビルドされているので,それに合わせてバージョンを決めた感じです.

2.どんな回路を作るか



CPUにぶら下がっているDDR3メモリとPL部をつなぎ,メモリ->FIFO(PL部)->メモリというような簡単な回路で動作確認を行います.

3.PS部とPL部の橋渡し.


PYNQ-Z2で使用されているZYNQ 7000シリーズでは,FPGA(PL)とCPU(PS)に接続されたDDR3メモリをAXIバスを介して接続することができます.この機能はZYNQ内に存在するポートを使うことで使用できます.
このポートいくつか存在しており,32b GP AXI Master Ports(M_AXI_GPx),32b GP AXI Slave Ports(S_AXI_GPx),AXI High Performance 32b/64b Slave Ports(S_AXI_HPx),64b AXI ACP Slave Portのように通信の種類に応じて分けられています.


4.AXIバスの通信規格

AXIバスの通信規格にはいくつかの種類があります(AXI4だとAXI4(-Full),AXI-Lite,AXI-Stream).
今回使用するDMAのIPの制約で,FIFOとDMAコントローラ間はAXI-Stream,PS(S_AXI_HP)とDMAコントローラ間はAXI-Fullを使用します.またいくつかのIPでAXI-Liteによる制御が必要なので,そちらも使用します.

参考

5.ブロックダイアグラムを作る

ここからブロックダイアグラムを作っていきます.

5-1.PSの設定



PSとして,Zynq7 Processing System(5.5)を使います.
DDRメモリやFIXIOへの接続ポートを先に生成しておきます。


ここではメモリとPLを接続するため,ポート(M AXI GP0とS AXI HP0)の設定を行います.Vivado 2020.1ではM AXI GP0の方は最初から有効化されているようで,有効化されていないS_AXI_HP0は手動で有効化します.この際に,S_AXI_HP0のデータ幅は64bitにしておきます.

5-2.DMAコントローラの設定



今回使うIPはXilinx提供のAXI Direct Memory Access(7.1)です.
PYNQのv2.6からScatter Gather Engineをサポートするようになったのですが,今回はシンプルモードで試すのでチェックを外しておきましょう.
また,バッファ長を設定するレジスタ(Width of Buffer Length Register)は最大値の26まで引き上げておきましょう.
ここではAddress Widthを32bitとしておきます.
DMAのIPを二つ配置し,それぞれRead-Only, Write-Onlyにすることも可能ですが,今回はR/Wの双方を使えるようにしておきます.
今回の回路ではint16のデータを流すので,Read Channel側のMemory Map Data Widthを32bit,Stream Data Widthを16bitに設定しておきます.

5-3.FIFOの設定



FIFOとして,Xilinx提供のAXI4-Stream Data FIFO(2.0)を使用します.特段設定をかえる必要はないと思います.

5-4.IPの配置と配線



PSのブロックをDiagramに追加し,DDRとFIXED_IOの自動配線を終えたのち,DMAコントローラとFIFOを追加します.
そして,DMAコントローラとFIFOのAXI Streamのバスをつなぎます.
DMAコントローラとPSのS_AXI_HP0との接続にはAXI SmartConnectをかませました(Vivado2020.1の自動配線だと,別のIPが出てきました).
その後、自動接続を使い、他の配線を行いました。

6. 合成とファイルの生成


先程のブロック図をValidate Designにかけると、アドレスが振られていない警告が出てくるので、アドレスエディタでアサインしておきましょう。もう一度チェックを走らせると、CriticalWarningは消えているはずです。

Generate Output Products,Generate HDL Wrapperをし,ビットストリームを生成しました.
PYNQ上で実行する際には,.bit及び.hwhが必要になります(V2.6では.tclは不要みたいです).
以下の二つのフォルダから.bit及び.hwhを探します.

プロジェクト名.runs/impl_1/デザイン名_wrapper.bit
プロジェクト名.src/source_1/bd/デザイン名/hw_handoff/デザイン名.hwh

これらのファイルをPYNQ上のフォルダに投げ込めば,Vivado上での操作は完了です.
(プロジェクト名.src/source_1/bd/デザイン名/hw_handoff/デザイン名.tcl は無くても動くみたいです。)

7.まとめ


ビットストリームの生成まで完成しました.次はPYNQ上での操作に移っていきます



©2021 shts All Right Reserved.

0 件のコメント:

コメントを投稿