(C) by T.IZUMI, Sep.2025 - 無断複製・再配布を禁ず
Ver. 2025.10.05.a


組込みシステム開発トレーニング課題

Xilinx Zynq による周辺回路とプログラムの連携 Vitis 2025.1版

学習項目

前提とする学習項目

ターゲットボード

ボードの見分け方: 表面にZ7と書いていないのが旧ZYBO。 発光ダイオードLD4,LD5とコネクタJ14が搭載されているのが Z7-20。 発光ダイオードLD4だけでLD5とコネクタJ14が搭載されていないのが Z7-10。 リビジョン記号(Rev.)は裏面バーコードシールの傍に記載。

開発環境

Vitis IDE が2025にかなりリニューアルされ、 2024以前と2025以降では様子がかなり異なる。 2024以前は こちら または こちら を参照ください。

その他の使用ツール

演習用ファイル

発展

この課題終了後には次の課題を推奨する。


0. 概要

この演習では Zynq の Programmable Logic (PL) と Processing System (PS) を memory mapped I/O 経由で連携させる。 PS側に接続されたボタン(MIO50,51)の操作でPL側に接続されたLED(LD[3:0])を変化させ、 またPL側に接続されたボタン(BTN[3:0])の操作でPL側に接続されたLED(MIO7)を変化させる。 このPS⇔PLの情報の伝達を実機で動作確認する。

そのために、まずハードウェア設計ツール Vivado で Zynq 内全体のシステム構成を設計し、 Programmable Logic 上の回路を記述・コンパイルする。 次にソフトウェア開発ツール Vitis IDE でソフトウェアプログラムを記述・コンパイルする。 最後に設計した回路構成およびプログラムをZynqに転送して実行し、動作を確認する。 全体の流れは次のようなものである。


以下、特に指定の無い項目は規定値(デフォルト、最初から入っている値)を設定する。

1-1. プロジェクトの生成(Vivado)

1-1-1. プロジェクト生成

1-1-2. 画面の確認

1-1-3. ソースファイルの登録


1-2. Vivado IP Integrator によるシステム構築 (Vivado)

1-2-1. Block Design の生成と登録

1-2-2. Zynq PS(ARM) の配置と設定

1-2-3. 基本モジュールの配置

1-2-4. プロセッサのクロック、リセットを出力

1-2-5. GPIO の設定

ポイント: このブロックデザインを組み込む Verilog 記述と入出力信号名を一致させる。 Zybo_top.v の Zynq_PS のインスタンス化の部分を確認すること。

1-2-6. アドレス空間の設定

1-2-7. システム生成


1-3. ロジックのコンパイル (Vivado)


1-4. 動作確認 (Vivado)

このサンプルは部分的にハードウェアのみで(ソフトウェア実行なしでも)動作する。 この段階でハードウェア部分の動作を確認する。

1-4-1. ボードの接続

1-4-2. 回路の書き込み

1-4-3. 実行

1-4-4. 理解のために


1-5. プロセッサシステム情報のエクスポート (Vivado)

ソフトウェア開発には、その前提となるプロセッサシステム(プロセッサ、 インターフェースや周辺のハードウェア)の情報が必要である。 ソフトウェア開発ツールのためにそれら設定情報をエクスポートする。


2-1. ソフトウェア開発プロジェクトの設定 (Vitis IDE)

Vitis IDE 上のソフトウェア開発環境をセットアップする。

2-1-1. Vitis IDE の起動

2-1-2. 作業フォルダの設定

2-1-3. ハードウェア環境の生成


2-2. ソフトウェアの動作確認(Hello World) (Vitis IDE)

2-2-1. サンプル アプリケーション環境の生成

2-2-2. プログラムのビルド

2-2-3. ZYBO と PC の接続

2-2-4. ZYBOシリアルコンソールのUART接続

2-2-5. 実行

2-2-6. 理解のために


2-3. PSとPLの連携動作確認 (Vitis IDE)

2-3-1. アプリケーション環境の生成

2-3-2. ソースコードの登録

2-3-3. プログラムのビルド

2-3-4. 実行

2-3-5. 理解のために


2-4. 不揮発メモリからの起動 (Vitis IDE)

上記では、開発用PCから直接JTAG経由でFPGAに書き込んだ(下図(1)の方法)。 頻繁に書き換える開発途中や 状態を設定・観測するデバッグ中はこの方法が便利である。 しかし、最終的には開発用PCに接続せず、機器が単独で起動しなければならない。 ここでは、 ボード上の QSPI flash memory から起動する方法(下図(2)の方法)と micro SD card から起動する方法(下図(3)の方法)を 実行する。

2-4-1. 起動イメージファイルの作成 (Vitis IDE)

2-4-2. flash memoryからの起動

2-4-3. micro SD card からの起動


3. HDLコードなしで設計する方法

前の例(zynqbasic)では、チップ全体を記述するHDLコード(Zybo_top.v)を用いた。 ここではトップ記述のHDLコードなしで、ブロックデザインだけで設計する方法を示す。 この方法では、トップ記述に相当するVerilogコードを自動で生成する。 これはwrapperと呼ばれ、ブロックデザインの入出力とXDCに記述されたFPGAピン設定を直接接続するだけの記述になっている。

以下では基本的に前の例と同様に進める。

Vivado でのハードウェアシステム設計

ポイント: ブロックデザインの入出力信号名を制約ファイルのピン定義の信号名と一致させる。 Zybo.xdc(または Zybo-Z7.xdc) の当該部分を確認すること。

Vitis でのソフトウェア開発と実行

理解のために


99. その他

Verilog デバグ〜埋もれたタイプミスを見つける

Verilog では、信号を宣言せずに使用してもよい。 なので、タイプミスをしてもエラーにならない。 そのようなバグを見つけるためには、 Messages から次のような Warning を検索して確認するとよい。

Verilog デバグ〜埋もれたタイプミスを見つける〜その2

Verilog では、信号を宣言せずに使用してもよい。 なので、タイプミスをしてもエラーにならない。 Verilog code中に `default_nettype none を明示するとエラーにしてくれる。 ただしinput, output, inout の信号もすべて wire, regの宣言をしなければならない。 ライブラリやIPのコードでエラーが出ると逆に困るので 自コード終了時に `default_nettype wire と改めて宣言する。

Zynq のクロックについて

クロック信号やリセット信号をPS側から供給する場合、 PS上のプログラムが動作していないとPLも動作しない。 プログラムを起動(Run)するとPLも動作する。

Zynq の実機での再実行について

実行中のプログラムが残っている(直前のmain()が終了していない)と 再実行がうまくいかないことがある。 まず終了させてから次の作業に入る方がよい。 再実行がうまくいかないとき、経験的に成功率の高い対処方法は…

Zynq の実機デバッグ時の実行

PL側に回路をコンフィグしただけではデバッグモジュール(ILA)が認識されないかもしれない。PS側でソフトウェアを実行すると認識される。

Windows の COM ポート番号について

Windows は接続したことのあるデバイスを覚えていて、 COM ポート番号を使いまわす。 そのため、新しいデバイスを接続するたびにポート番号が増えていく。 ツールによっては COM ポートの番号が一桁でなければ正常動作しないものがある。 番号を振り直すには、不使用ポートを削除して接続し直す。

COMポートが認識できない

いちど削除して、ドライバをインストールしなおすと認識することがあるかもしれなくもない…。


泉 知論立命館大学 理工学部 電子情報工学科     その他の講義&演習資料はこちら