1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Zynqの基本を理解する|ZYBO Z7-20ではじめるSoC開発

1
Posted at

いまさらながら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(起動モード)

  • Zynqは、どこから起動するかを設定できます。
  • ZYBO Z7-20 では、基板上の「JP5」でBoot Modeを変更できます。
    image.png

JTAG Boot

  • 開発時に最もよく使うモードです。PCからVivado/Vitis経由で直接書き込みを行います。
    特徴として、書き込みが速い 失敗しても復旧しやすい 毎回PC接続が必要 電源OFFで内容は消える という点があります。
  • FPGAのbitstreamやELFファイルを、その場でロードして動作確認する用途に向いています。
  • 最初の開発では、ほぼこのモードを使います。
  • zyboではJ13を使用します(回路図ではJ12でしたが、シルクはJ13...なぜ?)
  • zyboではmicroUSBにもつながっており、JTAGデバッガが無くても書き込めます
    image.png

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)

  • 必ず必要になるIPです
  • 設定がかなり多いので、別の記事で記載したいと思います
    {86CB674D-3F4D-495E-B716-F1E859CB0F4A}.png

・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)

  • これもほぼ必須で必要になります。auto-connectで自動で生成されることが多いです
    {6F211837-90A7-4536-BD4F-9F87B56429BE}.png

・複数のAXIマスタ/スレーブを自動で接続するインターコネクトIP

・役割

  • AXI信号の接続自動化
  • アドレスデコード
  • バス幅変換(32bit ↔ 64bitなど)
  • クロックドメイン変換
  • プロトコル変換(Lite ⇔ Full など)

・特徴

  • 従来の「AXI Interconnect」の後継がsmartconnect
  • 接続数に応じて最適構成を自動生成(interconが選ばれる場合もある)
  • 高性能(パイプライン最適化あり)

・使用場面

  • 複数IP(DMA・GPIO・自作IP)をPSと接続する場合
  • 高速データパス設計

3. Processor System Reset

  • こちらも自動で生成されることが多いです
    {22BA6610-904D-47B7-8BE9-7AC3C2A70D8C}.png

  • PSとPL全体のリセット制御を統合するIP

  • クロック安定後にリセット解除(安全な起動)

  • 非同期リセットを同期化

  • 各ブロックごとに適切なリセットを分配


4. AXI GPIO

{2EDE5C70-03CA-4194-B1C2-8AEC52B0A077}.png

・最も基本的な入出力IPです
・用途としては、LED制御、スイッチ入力など
・特徴 AXI4-Liteで制御 入出力方向を設定可能 割り込み対応あり


5. 各種インタフェース(AXI UART Lite、AXI IIC、AXI Quad SPI、AXI CAN)

{8F7ED6E8-73FF-4C32-A2F8-FCA37239E2EA}.png

  • シリアル通信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

{0732D62C-4B81-4DD8-BE1A-C2C6AE8F08C1}.png

・タイマ/カウンタIP

・用途

  • 周期処理
  • 割り込み生成
  • 時間測定

・特徴

  • 32bit/64bitカウンタ
  • PWM生成も可能

7. AXI Direct Memory Access

{30AD0D0F-78DA-40AF-BEC2-5F3B4AC9F222}.png

・メモリとストリーム間の高速転送に使用します

・用途

  • 画像処理
  • 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)対応あり


  • 全体の接続は以下のような形になります
  • {399C22E2-7C5A-4EF5-B099-A7D49697BC8E}.png

まとめ

  • ZYBO Z7-20 を使いながら、Zynq-7000 の基本的な構成や開発の流れを整理してみました。
  • zynqは普通のマイコン開発とも、純粋なFPGA開発とも違う独特の面白さがあります。
  • VivadoのBlock Designは最初こそ少し複雑に見えますが、AXI SmartConnectやDMAなどの役割が分かってくると、システム全体の構造もかなり理解しやすくなると思います。
  • 今後は、IICを使ったセンシングデバイスとの通信、Ethernet(PS側のGEM)、Ehernet(TOE)などを試していけたらと思います。
  • 最終的にはEBAZ4205 のような安価で手が出やすいZynqボードでも同様の構成を動かしてみたいところです。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?