ビットストリームはこちらに上げてあります.
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のように通信の種類に応じて分けられています.
参考
なひたふJTAG日記,"ZYNQでFPGA(PL)からARM(PS)のDDR3メモリへDMA転送"
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による制御が必要なので,そちらも使用します.
参考
武内 修,"HDL/VivadoでAXIバスを利用"
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.