いまさらながらZYBO Z7-20を引っ張り出してきました
今ではかなり値上がりしていて、気軽には手を出しづらくなったZYBO。
自分が購入した1年ほど前は2万円くらいでしたが、今では6万円近くすることもあります。
買った当時は少し触っただけで、そのまま眠らせていましたが、最近あらためてZynqの基礎を学びたくなり、久しぶりに引っ張り出してきました。
まずはZYBOで、PS(ARM)とPL(FPGA)の基本や、Vivado/Vitisを使った開発の流れを一通り確認していく予定です。
最終的には、最近よく見かける格安Zynqボードの EBAZ4205 でも動かしてみたいと思っています。
開発環境
- vivado vitis ともに24.02を使用します
- 特にvitisの24.02はclassic(eclipseベース)がある最後のバージョンです
※今回はvscodeベースで開発します
Zynq基礎知識
- Zynq-7000 は、ARM CPUとFPGAを1チップに統合したSoC FPGAです。
- 一般的なマイコンやFPGAと違い、ソフトウェアとハードウェアを密接に連携させられるのが大きな特徴です。
PS(Processing System)
- PSはARM CPU側です。
- Zynq-7000では、ARM Cortex-A9が搭載されています。
- ultrascale+では、Cortex-A53とR5が搭載されています
- Linuxを動かしたり、C言語でRTOSやベアメタルなプログラムを書いたりするのはこちら側です。
- UART、SPI、I2C、Ethernet、USBなど、多くの周辺機能もPS側に搭載されています。
- いわゆる「普通のCPU」に近い領域です。
PL(Programmable Logic)
- PLはFPGA側です。
- RTL(verilogなど)で自由に回路を作成できます。
- かなり自由度が高く、例えば独自通信回路、高速GPIO制御、画像処理、Ethernetアクセラレータなどをハードウェアとして実装できます。
- CPUでは難しい高速並列処理を実現できるのが強みです。
Zynqの強み
-
Zynq最大の特徴は、「CPUとFPGAを高速接続できる」という点だと思っています・
-
PSとPLはAXIバスで接続されており、ARM側からFPGAレジスタを直接操作したりFPGA側からDDRアクセスやDMA転送したりと、高速大容量な通信が可能です。
-
例えば、PS側でネットワーク通信しつつ、PL側で高速データ処理のような柔軟な分担が可能です。
-
ソフトウェアだけでもなく、FPGAだけでもない、中間的な設計ができるのが非常に面白いところです。
-
※FPGA内にCPUを構成するソフトコアCPU(MicroBlaze や Nios II など)という選択肢もありますが、ZynqではARMがハードマクロとして搭載されているため、性能・安定性・開発効率の面で有利です。
ソフトコアCPUはFPGAリソースを消費し、動作周波数も低めですが、ZynqのPSは専用回路として実装されているため、高速かつ安定して動作します。さらに、DDRコントローラやEthernet、USBなどの周辺機能もPS側に統合されているため、PL側を純粋なアクセラレータや専用回路として使いやすいのが大きな強みです。
Boot Mode(起動モード)
JTAG Boot
- 開発時に最もよく使うモードです。PCからVivado/Vitis経由で直接書き込みを行います。
特徴として、書き込みが速い 失敗しても復旧しやすい 毎回PC接続が必要 電源OFFで内容は消える という点があります。 - FPGAのbitstreamやELFファイルを、その場でロードして動作確認する用途に向いています。
- 最初の開発では、ほぼこのモードを使います。
- zyboではJ13を使用します(回路図ではJ12でしたが、シルクはJ13...なぜ?)
- zyboではmicroUSBにもつながっており、JTAGデバッガが無くても書き込めます
Quad SPI Boot
- QSPIフラッシュから起動するモードです。
- 基板上のSPI Flashに書き込まれたデータを使って、自動起動します。
- 特徴は、電源投入だけで起動でPC不要 組み込み機器っぽい運用が可能です。
- 完成品に近い運用をするときはこちらを使用します。
- ただし、Flash書き込みに失敗すると起動しなくなる場合もあるため、緊急時は次に紹介するSDカードでのBOOTを併用することが多いです
- 試すとわかりますが、quadでも書き込みが長いです。(ultrascale+となるとさらに長い)
SD Card Boot
- SDカードから起動するモードです。
- 緊急BOOT以外にも、Linuxを動かす場合にもよく使用されます。
- フォーマット済のSDカードにBOOT.binを配置し、起動させます。
- QSPIと比べると書き換えが簡単です。
BOOT.binとは?
- Zynqでは、単純にbitファイルを書き込むだけでは起動できません。
- 起動用に「BOOT.bin」を作成する必要があります。
- これは複数ファイルをまとめたブートイメージです。
- 一般的には、FSBL,FPGA bitstream,アプリケーション(ELF)の3つを含みます
FSBL(First Stage Boot Loader)
- 最初に実行されるプログラムです。
- Zynq起動直後に動作し、DDR初期化、クロック設定、FPGAコンフィグなどを行います。
bitstream(.bit)
- PL側の回路データです。
- FPGAへどんな回路を書き込むかを定義しています。
- Vivadoで生成されます。
ELFファイル
- ARM側で実行されるソフトウェアです。
- Vitisでビルドしたアプリケーションが入ります。
Zynq開発では、「BOOT.bin」という考え方がかなり重要になります。
Zynq PL 基礎IP
- Vivado のBlock Designでは、多数のIP(Intellectual Property)を組み合わせることで、比較的簡単に高機能なシステムを構築できます。
- 特に Zynqでは、PS(ARM)とPL(FPGA)をAXIバスで接続する構成が基本となるため、AXI関連IPを理解しておくことがかなり重要です。
- ここでは、個人的によく使用する基本IPを整理してみます。
1.Processing System(zynqのPS)
・VivadoのBlock DesignでPS(Processing System)を追加すると、
AXIインターフェース(GP / HP / ACPなど)が自動で生成されます
・主なポート
- M_AXI_GP(PS → PLへのマスタアクセス)
- S_AXI_GP(PL → PSへのスレーブアクセス)
- S_AXI_HP(PS DDRへPLから高速アクセス)
- ACP(キャッシュコヒーレントアクセス)
・特徴
- AXI4 / AXI4-Lite / AXI-Streamが用途別に使い分けられる
- レジスタ制御はAXI4-Liteが基本
2. AXI SmartConnect(interconnect)
・複数のAXIマスタ/スレーブを自動で接続するインターコネクトIP
・役割
- AXI信号の接続自動化
- アドレスデコード
- バス幅変換(32bit ↔ 64bitなど)
- クロックドメイン変換
- プロトコル変換(Lite ⇔ Full など)
・特徴
- 従来の「AXI Interconnect」の後継がsmartconnect
- 接続数に応じて最適構成を自動生成(interconが選ばれる場合もある)
- 高性能(パイプライン最適化あり)
・使用場面
- 複数IP(DMA・GPIO・自作IP)をPSと接続する場合
- 高速データパス設計
3. Processor System Reset
4. AXI GPIO
・最も基本的な入出力IPです
・用途としては、LED制御、スイッチ入力など
・特徴 AXI4-Liteで制御 入出力方向を設定可能 割り込み対応あり
5. 各種インタフェース(AXI UART Lite、AXI IIC、AXI Quad SPI、AXI CAN)
-
シリアル通信IPです。PSの機能として実装することもできます(その場合は1のProcessing Systemの設定にて変更する)
-
用途 PCとの通信、各デバイスとの通信
-
すべてAXI4-Lite経由でレジスタ制御(低帯域・制御用途向け)
-
AXI UART Lite
・軽量なUART(FIFOあり)
・最低限のシリアル通信機能に特化(デバッグ用途に最適) -
AXI IIC
・I2Cマスタ/スレーブ対応
・センサ・EEPROMなど低速デバイスとの接続に使用
・マルチマスタ環境も考慮 -
AXI Quad SPI
・SPIフラッシュや高速シリアルデバイス接続
・シングル/デュアル/クワッド転送対応
・XIP(Execute In Place)構成に対応可能 -
AXI CAN
・CAN通信プロトコル対応(車載・産業用途)
・メッセージフィルタ・バッファ内蔵
・リアルタイム性の高い通信に適する
-
6. AXI Timer
・タイマ/カウンタIP
・用途
- 周期処理
- 割り込み生成
- 時間測定
・特徴
- 32bit/64bitカウンタ
- PWM生成も可能
7. AXI Direct Memory Access
・メモリとストリーム間の高速転送に使用します
・用途
- 画像処理
- ADC/DACデータ転送
- 大量データ転送
・特徴
- CPU介在なしで転送(高効率)
- AXI4(メモリ)⇔ AXI-Stream(ストリーム)の橋渡しを行う
- SG(Scatter-Gather)対応あり(高度な転送制御)
▼ インタフェース構成
■ 制御系(レジスタ設定)
- S_AXI_LITE
→ CPU(PS)からDMA設定用
→ 転送サイズ・開始・状態取得など
■ メモリ側(AXI4 Full)
- M_AXI_MM2S
→ メモリ → ストリーム(読み出し) - M_AXI_S2MM
→ ストリーム → メモリ(書き込み) - M_AXI_SG
→ Scatter-Gather用ディスクリプタアクセス
■ ストリーム側(AXI-Stream)
- M_AXIS_MM2S
→ ストリーム出力(Memory to Stream) - S_AXIS_S2MM
→ ストリーム入力(Stream to Memory)
・信号の意味の整理
-
「M_AXI_*」=メモリバス(AXI4 Full)
-
「AXIS」=ストリームバス(AXI-Stream)
-
「S_AXI_LITE」=CPU制御用
-
データの流れイメージ
Memory → (M_AXI_MM2S) → DMA → (M_AXIS_MM2S) → Stream IP
Stream IP → (S_AXIS_S2MM) → DMA → (M_AXI_S2MM) → MemoryG(Scatter-Gather)対応あり
まとめ
- ZYBO Z7-20 を使いながら、Zynq-7000 の基本的な構成や開発の流れを整理してみました。
- zynqは普通のマイコン開発とも、純粋なFPGA開発とも違う独特の面白さがあります。
- VivadoのBlock Designは最初こそ少し複雑に見えますが、AXI SmartConnectやDMAなどの役割が分かってくると、システム全体の構造もかなり理解しやすくなると思います。
- 今後は、IICを使ったセンシングデバイスとの通信、Ethernet(PS側のGEM)、Ehernet(TOE)などを試していけたらと思います。
- 最終的にはEBAZ4205 のような安価で手が出やすいZynqボードでも同様の構成を動かしてみたいところです。








