(C) by T.IZUMI, Sep.2025 - 無断複製・再配布を禁ず
Ver. 2025.10.05.a
組込みシステム開発トレーニング課題
Xilinx Zynq による周辺回路とプログラムの連携 Vitis 2025.1版
学習項目
- Vivado IP Integrator によるZynq PL+PS 組込みシステムの構築
- PL と PL の単純な連携
- Vitis IDE によるソフトウェア開発
- ボードによる実機動作確認
前提とする学習項目
- 計算機アーキテクチャの基本(プロセッサ、バス、メモリ、レジスタ、I/O)
- Verilog 記述、シミュレーション
- C言語
- OS, コンパイラの基本
- Vivado による RTL 設計の基礎
- LED/SW の取扱い
- UART の取扱い
ターゲットボード
ボードの見分け方:
表面にZ7と書いていないのが旧ZYBO。
発光ダイオードLD4,LD5とコネクタJ14が搭載されているのが Z7-20。
発光ダイオードLD4だけでLD5とコネクタJ14が搭載されていないのが Z7-10。
リビジョン記号(Rev.)は裏面バーコードシールの傍に記載。
開発環境
- Xilinx(AMD) Vivado 2025.1
- Xilinx(AMD) Vitis IDE 2025.1
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に転送して実行し、動作を確認する。
全体の流れは次のようなものである。
- MENU
- 1. Vivado によるハードウェア設計
- 1-1. プロジェクトの生成
- 1-2. プロセッサシステムの構築
- 1-3. ロジックのコンパイル
- 1-4. ロジックの動作確認
- 1-5. プロセッサシステム情報のエクスポート
- 2. Vitis によるソフトウェア開発
- 2-1. プロジェクトの生成
- 2-2. ソフトウェアの開発実行例 (Hello World)
- 2-3. プロセッサとロジックの連係
- 2-4. 不揮発メモリからの起動
- 3. HDLコードなしで設計する方法
以下、特に指定の無い項目は規定値(デフォルト、最初から入っている値)を設定する。
1-1. プロジェクトの生成(Vivado)
- Vivado を起動する。既存のプロジェクトが開いていたら閉じる。
1-1-1. プロジェクト生成
- [File]→[Project]→[New]して New Project Wizard を起動する。
- プロジェクト名と場所を次のように設定する。
Project name: | zynqbasic |
Project location: | 例 C:/home/t-izumi |
※Vivado はフォルダ階層が深いとトラブルを起こす。
できるだけ浅いフォルダを用意するか、
subst で課題を実行するフォルダにドライブ文字を割り当てておくとよい。
- プロジェクトタイプを「RTL Project」に設定する。
ここでは「Do not specify sources at this time」にチェックする。
- タブで[Boards] を指定し Zybo または Zybo Z7-20, Zybo Z7-10 を探して選択。
(Rev.は多少ちがっても大丈夫なようだ。)
(注意:選択して行がブルーになった状態で[Next]すること。
Zybo が見つからないならボード定義ファイルをインストールしてVivadoを起動しなおす。
https://reference.digilentinc.com/vivado:boardfiles )
- Finish
1-1-2. 画面の確認
- [Flow Navigator] (B) で、大まかに何をするか指定する。
- (C)で、各種設定、操作指示、ファイル編集、などを行う。
- (D)で、ログや状況の確認を行う。
- 見たい画面が行方不明なときのチェックリスト
- それぞれの領域のタブで切り替える
- [Flow Navigator] (B) で対象手順を選択
- (E)対象のファイル、モジュール、信号などを選択
- (D)で対象のオブジェクトを選択
- (A)メインメニューの Window で選択
1-1-3. ソースファイルの登録
- (A)メインメニュー [File]→[Add Sources]を選択する。
- (*) Add or create constraints を選択する。
- +を押下、Add Files を実行、Zybo.xdc (ZYBO Z7 の場合は Zybo-Z7.xdc)を登録する。
- もう一度+を押下、Create Files を実行、debug.xdc という名前のファイルを作成し、Finish する。
- 同様に、上端メインメニュー [File]→[Add Sources]を選択する。
- (*) Add or create design sources を選択する。
- +を押下、Add Files を実行、Zybo_top.v, uart.v, hex2oled.v を登録し、Finishする。
- (C)ウィンドウで Sources タブを選ぶ。
- Design Sources の中に登録したモジュールがあることを確認する。
- Zybo_top がトップ(太字)になっていることを確認する。(トップになっていなければ、Zybo_top を右クリックして [Set as Top] する。)
- Constraints の中に Zybo.xdc, debug.xdc があることを確認する。
- debug.xdc を右クリックして [Set as Target Constraint File] する。
- それぞれのモジュールやファイルをダブルクリックすると
(E)ウィンドウにファイルが表示される。
内容を確認する。
1-2. Vivado IP Integrator によるシステム構築 (Vivado)
1-2-1. Block Design の生成と登録
- [Flow Navigator] (B) → [IP Integrator] → [Create Block Design] を実行する。
- 「Design name = Zynq_PS」 として生成する。
- Block Design のウィンドウ群が現れる。
1-2-2. Zynq PS(ARM) の配置と設定
- [Diagram] ウィンドウ(E)の上側 [+] ボタンを押下して ZYNQ7 Processing System を追加する。
(注:board選択で選択のクリックを忘れると出てこない)
- [Diagram] の下地を右クリックして [Run Block Automation] を選択、
[Apply Board Preset] にチェックして、[OK] する。
- Procesing System のオブジェクトを右クリックし Customize Block を実行する。
- 左側 MIO Configuration を選択し、設定を確認する。特に UART1 とGPIO MIO 7, 50, 51 を確認しておく。注意:ボード定義ファイルが間違っている可能性がある。 MIO 50, 51の Pullup を“disabled”に設定すること。こちら↓はZYBOの例。
- 左側 Clock Configuration を選択し、設定を確認する。こちら↓はZYBOの例。
- PL Fabric Clocks の FCL_CLK0 を 100 MHz に設定する。
- 左側 Zynq Block Design を選択し、プロセッサ部の構成を確認する。
- Customize Block を終了する。
1-2-3. 基本モジュールの配置
- Diagram ウィンドウ(E)の左側+ボタンを押下してAXI GPIOを追加する。
- Diagram ウィンドウ内の下地で右クリック、Run Connection Automation を実行する。
axi_gpio_0 の GPIOのチェックは外し S_AXI にチェックを入れる。
- Diagram ウィンドウ内に Processor System Reset, AXI SmartConnect が配置され接続されていることを確認する。
- Diagram ウィンドウ内の下地で右クリック、Regenerate Layout を実行すると
図の配置を自動で調整してくれる。
1-2-4. プロセッサのクロック、リセットを出力
- Processing System の FCLK_CLK0 を右クリックし、Create Port を実行する。
Port name: clko とする。
- Processor System Reset の peripheral_aresetn[0:0] を右クリックし、Create Port を実行する。
Port name: rstno とする。
1-2-5. GPIO の設定
- axi_gpio_0 を右クリックしCustomize Block を実行。IP Configuration タブで[*]Enable Dual Channel をチェックして[OK]する。
- axi_gpio_0 モジュールの GPIO インターフェースの+をクリックして展開する。
- gpio_io_i[31:0] を右クリックし、Create Portを実行。Port name: gpi01 とする。
- 以下同様に、ポートを作成する。
axi_gpio_0 | gpio_io_i[31:0] | gpi01 |
axi_gpio_0 | gpio_io_o[31:0] | gpo01 |
axi_gpio_0 | gpio2_io_i[31:0] | gpi02 |
axi_gpio_0 | gpio2_io_o[31:0] | gpo02 |
- Block Design を確認する。
ポイント:
このブロックデザインを組み込む Verilog 記述と入出力信号名を一致させる。
Zybo_top.v の Zynq_PS のインスタンス化の部分を確認すること。
1-2-6. アドレス空間の設定
- ウィンドウ(E)上部 [Address Editor] タブを開く。
- axi_gpio_0が割り当てられているアドレスを確認し、メモしておく。
Unmapped Slaves があれば右クリックし Auto Assign Address する。
1-2-7. システム生成
- ウィンドウ(E)上部 [Diagram] タブを開く。
- Diagram 下地で右クリック、Validate Design を実行する。
- 何か問題があったら警告が出るので対処する。
(注:“PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_? has negative value ...”
の Critical warning は無視しておいて下さい)
- [Flow Navigator] (B) → [IP Integrator] → [Generate Block Design] を実行する。
- [Flow Navigator] (B) → [Project Manager] を選択する。
- [Souces] (C) → [Design Sources] の [Zynq_PS] を展開し、
設計結果が組み込まれていることを確認する。
1-3. ロジックのコンパイル (Vivado)
- [Flow Navigator] (B) → [Synthesis] → [Run Syntehsis] を実行する。
- [Flow Navigator] (B) → [Implementation] → [Run Implementation] を実行する。
- [Flow Navigator] (B) → [Program and Debug] → [Generate Bitstream] を実行する。
- 終了を待ち 「View Reports」 で結果を確認する。
- ここでは、多少の(コンパイルを中断しない程度の) Warning や Violation は無視して進める。
- 各段階で下段(F) [Messages], [Log], [Reports], [Design Runs] などを確認する。項目をダブルクリックすると詳細が主ウインドウ(E)で確認できる。
- 必要に応じて、ファイルを編集し再実行する。[Sources] (C) でソースファイルを選択し開いて、主ウィンドウ(E)で編集・保存する。
- 最後まで実行できたら主ウィンドウ(E)の Project Summary で LUTなどの資源の使用率や、信号到着タイミングや消費電力の見積もりを確認する。
- Vivado で最初に設定した Project の下(例 C:/home/t-izumi/zynqbasic/zynqbasic.runs/impl_1)に“Zybo_top.bit”というファイルが生成されたことを確認する。
1-4. 動作確認 (Vivado)
このサンプルは部分的にハードウェアのみで(ソフトウェア実行なしでも)動作する。
この段階でハードウェア部分の動作を確認する。
1-4-1. ボードの接続
- ZYBO ボードの JP5 を JTAG 側に挿す。
- (あれば)いずみ研的Serial文字表示器OLEDをPmodコネクタJBの下段に接続する。10番ピンがシリアル出力なのでこれを表示器のシリアル入力に接続する。11番がGND、12番が3.3V VCC である。
- ZYBO ボードの PROG UART に micro USB ケーブルを接続。電源投入。ドライバ類の認識を確認する。
1-4-2. 回路の書き込み
- [Flow Navigator] (B) → [Open Hardware Manager] で実機管理画面を開く。
- 主ウインドウ(E) → [Open Target] → [Auto Connect] でボードに接続する。
- 主ウインドウ(E) → [Program Device] でボードに回路を書き込む。
- 「Bitstream file:」に生成したビットストリームを指定し、[Program] する。
1-4-3. 実行
- ボード上 SW0~3, BTN0, BTN1 を操作し、LD0〜3の点滅を確認する。
押下 | LD[3:0] 表示 | 備考 |
BTN0 | SW[3:0] | クロック信号なしで動作する |
BTN1 | counter0[27:24] | ロジック側クロック信号で動作する |
BTN2 | counter[27:24] | プロセッサ側クロック信号で動作する |
BTN3 | GPO2[3:0] | ソフトウェアによるGPIO2への書き込みで動作する |
解放 | GPO1[3:0] | ソフトウェアによるGPIO1への書き込みで動作する |
- 注意:プロセッサが動作していないとBTN2,BTN3,解放では機能しない。
1-4-4. 理解のために
- Verilogソースコード Zybo_top.v を読んでみよう。
- Zybo.xdc(またはZybo-Z7)を読んでみよう。
1-5. プロセッサシステム情報のエクスポート (Vivado)
ソフトウェア開発には、その前提となるプロセッサシステム(プロセッサ、
インターフェースや周辺のハードウェア)の情報が必要である。
ソフトウェア開発ツールのためにそれら設定情報をエクスポートする。
- 上端メインメニューの [File] から、[Export] → [Export Hardware] を実行する。
- 「Pre-synthesis」 を選択し、実行する。
- Vivado で最初に設定した Project の場所(例 C:/home/t-izumi/zynqbasic)に“Zybo_top.xsa”というファイルが生成されたことを確認する。
2-1. ソフトウェア開発プロジェクトの設定 (Vitis IDE)
Vitis IDE 上のソフトウェア開発環境をセットアップする。
2-1-1. Vitis IDE の起動
- Vitis IDE (vitis.bat) を起動する。
2-1-2. 作業フォルダの設定
- 上端メニュー [File] → [Set Workspace] を実行し、作業フォルダを設定する。
ここでは Vivado で設計したハードウェアと紐付けるので、
そのプロジェクト内がよいだろう。
「例 C:/home/t-izumi/zynqbasic/VitisIDE」
注意:先に空のフォルダを作成しておくこと。
注意:このパスに '_' (下線) を入れないこと。
Vitis_IDE のように下線を入れると VITIS EXPLORER の COMPONENTS が
見えなくなるようだ。
- 二度目以降は 上端メニュー [File] → [Open Recent Workspace] で開
くことができる。
2-1-3. ハードウェア環境の生成
- 上端メニュー [File] → [New Component] → [Platform] を実行する。
- [Name and Location] を次のように設定する。
Component name: | zynqbasic_pf |
Component location: | 例 C:/home/t-izumi/zynqbasic/VitisIDE |
- [Select Platform Creation Flow] で「Hardware Design」にチェックし、
「Hardware Design (XSA) For Implementation」を [Browse] で
エクスポートした XSA ファイル
(例 C:/home/t-izumi/zynqbasic/Zybo_top.xsa)に設定する。
- [Select Operating System and Processor] の設定は規定値とする。
- [Finish] し、Platform 生成の終了を待つ。少し時間がかかる。
- [Flow]の[Component]で「zynqbasic_pf」を選び、[Build]する。少し時間がかかる。
2-2. ソフトウェアの動作確認(Hello World) (Vitis IDE)
2-2-1. サンプル アプリケーション環境の生成
- 上端メニュー [File] → [New Example] を実行する。
- [Embedded Software Examples] → [Hello World] を選択し、右の[+]をクリックする。
- [Name and Location] を次のように設定する。
Component name: | hello_world |
Component location: | 例 C:/home/t-izumi/zynqbasic/VitisIDE |
- [Select Platform] では先に生成した「zynqbasic_pf」を選択する。
- [Select Domain] は規定値のとおり。
- [Finish] し、Application 生成の終了を待つ。
2-2-2. プログラムのビルド
- [FLOW] 内の [Component] に「hello_world」 を選択し、Build を実行する。
2-2-3. ZYBO と PC の接続
- ZYBO ボードの JP5 を JTAG 側に挿す。
- ZYBO ボードの PROG UART に micro USB ケーブルを接続。電源投入。ドライバ類の認識を確認する。
注意:挿すUSBポートによっては書込時にエラーが出る。
USB HUB経由ではなく、直接PCに挿した方がよさそう。
(Memory write error at 0xF8000748. Invalid DAP IDCODE 00000000. Invalid DAP ACK value: 0)
2-2-4. ZYBOシリアルコンソールのUART接続
- UART接続のPC上でのポート番号を確認する。
Windows のデバイスマネージャを起動し、
ポート(COMとLPT)を開いて USB Serial Port の(COM番号)を確認する。
- 端末(ターミナルエミュレータ、ここでは MobaXterm)を起動する。
- [Session] で [Serial] を選択し、上記で確認したポート番号に接続する。
設定の詳細は以下の通り。 [advanced serial settings] で確認・設定できる。
Port | 上記確認ポート |
Baud Rate | 115200bps |
Data Bits | 8bit |
Parity | none |
Stop Bits | 1bit |
Flow Control | none |
2-2-5. 実行
- [FLOW] 内の [Component] に「hello_world」 を選択し、[Run] にマウスカーソルをあてて右の歯車マークをクリックする。
- 主ウィンドウの[launch.json]で「Bitstream File:」に回路構成情報(1-3 で確認した“Zybo_top.bit”)を指定する。
- [FLOW]内の[Run]を実行する。2度目以降、前のプログラムが実行中に[Run]を実行すると警告がでる。ボード上の PS-SRST ボタンでリセットをかけてから再実行するとよい。
- 端末上で、Hello Wolrd の出力を確認する。
2-2-6. 理解のために
- [VITISIDE-VITIS COMPONENTS] → [hello_world] → [Sources] → [src] 内のソースコードを読んでみよう。
- helloworld.c を改造してビルド&実行してみよう。
2-3. PSとPLの連携動作確認 (Vitis IDE)
2-3-1. アプリケーション環境の生成
- 上端メニュー [File] → [New Component] → [Application] を実行する。
- [Name and Location] を次のように設定する。
Component name: | testgpio_app |
Component location: | 例 C:/home/t-izumi/zynqbasic/VitisIDE |
- [Select Platform] では先に生成した「zynqbasic_pf」を選択する。
- [Select Domain] は規定値のとおり。
- [Add Source Files]はここでは登録せずに進む。
- [Finish] し、Application の生成を待つ。
2-3-2. ソースコードの登録
- [VITISIDE-VITIS COMPONENTS] → [testgpio_app] → [Sources] → [src] を右クリックし、[Import] → [Files] を選択する。配布の testgpio.c を選択する。
- サンプルプログラムを確認する。インポートした testgpio.c を開き、内容を確認する。
- ハードウェア(1-2-5 で置いた GPIO)の設定を確認する。
[VITISIDE-VITIS COMPONENTS] → [zynqbasic_pf] → [Sources] → [ps7_cortexa9_0] → [standalone_ps7_cortexa7_0] → [bsp] → [include] → [xparameters.h] を開き、内容を確認する。
:
/* Definitions for peripheral AXI_GPIO_0 */
#define XPAR_AXI_GPIO_0_COMPATIBLE "xlnx,axi-gpio-2.0"
#define XPAR_AXI_GPIO_0_BASEADDR 0x41200000
#define XPAR_AXI_GPIO_0_HIGHADDR 0x4120ffff
#define XPAR_AXI_GPIO_0_INTERRUPT_PRESENT 0x0
#define XPAR_AXI_GPIO_0_IS_DUAL 0x1
#define XPAR_AXI_GPIO_0_GPIO_WIDTH 0x20
:
|
- 同じ場所にある [xgpio_l.h] を開き、内容を確認する。
:
#define XGPIO_DATA_OFFSET 0x0 /**< Data register for 1st channel */
#define XGPIO_TRI_OFFSET 0x4 /**< I/O direction reg for 1st channel */
#define XGPIO_DATA2_OFFSET 0x8 /**< Data register for 2nd channel */
#define XGPIO_TRI2_OFFSET 0xC /**< I/O direction reg for 2nd channel */
#define XGPIO_GIE_OFFSET 0x11C /**< Glogal interrupt enable register */
#define XGPIO_ISR_OFFSET 0x120 /**< Interrupt status register */
#define XGPIO_IER_OFFSET 0x128 /**< Interrupt enable register */
:
|
2-3-3. プログラムのビルド
- [FLOW] 内の [Component] に「testgpio_app」 を選択し、Build を実行する。
2-3-4. 実行
- ZYBO を接続し、端末(MobaXterm)を起動しておく。
- [FLOW]内の[Component]に「testgpio_app」を指定する。
- 2-2-5 と同様に回路構成情報“Zybo_top.bit”を登録する。
- [FLOW]内の[Run]を実行する。
- このサンプルは次のように構成されている。
- LD MIO7, BTN MIO50, BTN MIO51 は PS側 に接続されている。
- LD[3:0], SW[3:0], BTN[3:0] は PL側 に接続されている。
- MobaXtermは PS側 に接続されている。
- 文字表示器は PL側 に接続されている。
- 次の動作を確認する。これらが PS入力⇒PS出力、PL入力⇒PL出力、PS入力⇒PL出力、PL入力⇒PS出力 のすべての組合せを含むことを理解する。
- BTN MIO51 ,50 (PS側) を押すと
LD[3], LD[2] (PL側) が光る。
- BTN[3:0] (PL側) を押すと
LD MIO7 (PS側) が光る。
- MobaXtermに BTN MIO50, 51 (pb50, pb51),
SW[3:0], BTN[3:0] (gpi01),
PL側 (Zybo_top.v) の counter値 (gpi02) が表示されていることを確認する。
- (あれば)いずみ研的Serial文字表示器OLEDの左上に LD[3:0] の発光パタン (gpo01)、
右上に PS側 (testgpio.c) の counter値 (gpo02)、
左下に PL側の SW[3:0] と BTN[3:0]、
右下に PL側の counter値が表示されていることを確認する。
- BTN MIO51, 50 を両方とも押すとプログラムが終了する。
;
- MIO 50, 51 ボタンの入力が常に1だとしたら、
Vivado の Block Design の Processing System の設定で MIO50, 51 の PULLUP の設定が enabled になっている可能性がある。disabled にすること。
2-3-5. 理解のために
- C ソースコード testgpio.c を読んでみよう。
- Verilogトップ記述 Zybo_top.v, ブロックデザイン Zynq_PS, Cコード testgpio.c などを改造してみよう。
2-4. 不揮発メモリからの起動 (Vitis IDE)
上記では、開発用PCから直接JTAG経由でFPGAに書き込んだ(下図(1)の方法)。
頻繁に書き換える開発途中や
状態を設定・観測するデバッグ中はこの方法が便利である。
しかし、最終的には開発用PCに接続せず、機器が単独で起動しなければならない。
ここでは、
ボード上の QSPI flash memory から起動する方法(下図(2)の方法)と
micro SD card から起動する方法(下図(3)の方法)を
実行する。
2-4-1. 起動イメージファイルの作成 (Vitis IDE)
- [FLOW] → Component: [testgpio_app] を選択し、[Create Boot Image] を実行する。
- [Create a new BIF file]にチェックし、
起動プログラム fsbl.elf, ハードウェア構成情報 Zybo_top.bit,
対象プログラム testgpio_app.elf をこの順で登録する。
fsbl.elf と testgpio_app.elf は既に登録されている。
Zybo_top.bit は[+]をクリックしてType: datafileとして追加する。[↑][↓]で順番を調整する。
起動イメージの中身の例 |
① C:\home\t-izumi\zynqbasic\VitisIDE\zynqbasic_pf\export\zynqbasic_pf\sw\boot\fsbl.elf
② C:\home\t-izumi\zynqbasic\zynqbasic.runs\impl_1\Zybo_top.bit
③ C:\home\t-izumi\zynqbasic\VitisIDE\testgpio_app\build\testgpio_app.elf
|
- 出力先 Output BIF File Path, Output Image を設定する。ここでは testgpio_app コンポーネントのフォルダにする。
起動イメージ出力先の設定例 |
Output BIF File Path: C:\home\t-izumi\zynqbasic\VitisIDE\testgpio_app\testgpio_app.bif
Output Image: C:\home\t-izumi\zynqbasic\VitisIDE\testgpio_app\BOOT.bin
|
- [Create Image]を実行する。
2-4-2. flash memoryからの起動
- ZYBO の電源を切ってから、起動モード (JP5) を JTAG にして、電源を入れる。
- 上端メインメニューから [Vitis] → [Program Flash]する。
- Image File に作成した BOOT.bin を指定、Flash Type: qspi-x4-single を選択し [Program] する。
- ZYBO の電源を切ってから、起動モード (JP5) を QSPI にして、電源を入れる。
- 起動と動作を確認する。
- 以後、電源を投入したりリセットをかけたりすれば自動で起動する。
- (PCからボードへの書き込み時には電源を切って起動モード (JP5) を JTAG に戻す。)
2-4-3. micro SD card からの起動
- 適当な micro SD card を用意する。
- FATでフォーマットする。
複数パーティションある場合は最初のパーティションを使う。
凝ったパーティション切りは避けた方がよい。
- 上記 BOOT.bin を micro SD カードのトップにコピーする。
- ZYBO の電源を切る。
- 作成した micro SD card を ZYBO に挿入する。
- ボードの起動モード (JP5) を SD にして、電源を入れる。
- 起動と動作を確認する。
- 以後、電源を投入したりリセットをかけたりすれば自動で起動する。
- (PCからボードへの書き込み時には電源を切って起動モード (JP5) を JTAG に戻す。)
3. HDLコードなしで設計する方法
前の例(zynqbasic)では、チップ全体を記述するHDLコード(Zybo_top.v)を用いた。
ここではトップ記述のHDLコードなしで、ブロックデザインだけで設計する方法を示す。
この方法では、トップ記述に相当するVerilogコードを自動で生成する。
これはwrapperと呼ばれ、ブロックデザインの入出力とXDCに記述されたFPGAピン設定を直接接続するだけの記述になっている。
以下では基本的に前の例と同様に進める。
Vivado でのハードウェアシステム設計
- プロジェクト生成
Project name: | zynqbasicnv |
Project location: | 例 C:/home/t-izumi |
- xdc ファイルを登録する。
- Verilog コードは登録しない。
- ブロックデザイン生成
Design name: Zynq_BD とする。
- Zynq Processing System を置く。[Run Block Automation]を実行する。(FCL_CLKOの設定は不要。MIO50,51は要確認。)
- GPIO を3つ置く。
| 名前 | 方向 | ビット幅 | ポート名 |
ひとつめ | axi_gpio_led | Output | 4 | led |
ふたつめ | axi_gpio_btn | Input | 4 | btn |
みっつめ | axi_gpio_sw | Input | 4 | sw |
[Run Connection Automation]し、S_AXIを接続する。
モジュールのインスタンス名を設定する。
各モジュールを右クリックし [Block Properties]を選択→Block Properties のウィンドウ内 [Name: ]で上の表のとおり設定する。
方向とビット幅を設定する。
各モジュールを右クリックし [Customize Block]を選択→ [IP Configuration]タブ内で、
All Inputs/Outputs, GPIO Width を上の表のとおり設定する。Enable Dual Channel はチェックしない。
各GPIOの入出力 gpio_io_o または _i を選択し[Create Port]を実行する。[Port name:]は上の表の通り設定する。
- クロックやリセットのポートは作成しない。
- [Validate Design]を実行する。
- [Create Block Design]は実行しない。
- Wrapperを生成する。
ウィンドウ (C) の[Sources]タブ内、[Design Sources]→[Zynq_BD] を右クリックし、[Create HDL Wrapper]を実行する。
- ビルド(Synthesys, Implementation, Generate Bitstream)する。
- この段階では実機動作テストはしない。ハードだけ(ソフトなし)では動かないので。
- システム情報をエクスポートする。[Export Hardware]して、Zynq_BD_wrapper.xsa が生成されていることを確認する。
ポイント:
ブロックデザインの入出力信号名を制約ファイルのピン定義の信号名と一致させる。
Zybo.xdc(または Zybo-Z7.xdc) の当該部分を確認すること。
Vitis でのソフトウェア開発と実行
- 作業フォルダを設定する。例 C:/home/t-izumi/zynqbasicnv/VitisIDE
- ハードウェア環境を生成する。上端メニュー [File] → [New Component] → [Platform] を実行する。
Component name: | zynqbasicnv_pf |
Component location: | 例 C:/home/t-izumi/zynqbasicnv/VitisIDE |
XSA: | 例 C:/home/t-izumi/zynqbasicnv/Zynq_BD_wrapper.xsa |
- hello world は実施しなくてもよい。
- アプリケーション環境を生成する。
上端メニュー [File] → [New Component] → [Application] を実行する。
- [Name and Location] を次のように設定する。
Component name: | testgpio_app |
Component location: | 例 C:/home/t-izumi/zynqbasicnv/VitisIDE |
- ソースコードtestgpio.cを登録する。
- [Build]する。
- Zynq_BD_wrapper.bit を登録し[Run]する。
- 実機の動作を確認する。動作内容はtestgpio.cを参照のこと。
理解のために
- testgpio.c, Zybo.xdc(またはZybo-Z7.xdc)を読んでみよう。
- Zybo Z7でLD5を光らせてみよう。
99. その他
Verilog デバグ〜埋もれたタイプミスを見つける
Verilog では、信号を宣言せずに使用してもよい。
なので、タイプミスをしてもエラーにならない。
そのようなバグを見つけるためには、
Messages から次のような Warning を検索して確認するとよい。
- unconnected port
- does not have driver
- tying undriven pin to constant
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()が終了していない)と
再実行がうまくいかないことがある。
まず終了させてから次の作業に入る方がよい。
再実行がうまくいかないとき、経験的に成功率の高い対処方法は…
- プロセッサをリセット(PS-SRSTボタン)する。
- ボードの電源をいったん切って入れなおす。
Zynq の実機デバッグ時の実行
PL側に回路をコンフィグしただけではデバッグモジュール(ILA)が認識されないかもしれない。PS側でソフトウェアを実行すると認識される。
- Vitis IDE で Run する。
- Vivado の Hardware Manager で Reflesh Device する。
Windows の COM ポート番号について
Windows は接続したことのあるデバイスを覚えていて、
COM ポート番号を使いまわす。
そのため、新しいデバイスを接続するたびにポート番号が増えていく。
ツールによっては COM ポートの番号が一桁でなければ正常動作しないものがある。
番号を振り直すには、不使用ポートを削除して接続し直す。
- コンピュータのプロパティから詳細設定、環境変数の設定で DEVMGR_SHOW_NONPRESENT_DEVICES を 1 に設定する。
- デバイスマネージャを起動、表示→非表示のデバイスを表示
不要なポートを削除する。
COMポートが認識できない
いちど削除して、ドライバをインストールしなおすと認識することがあるかもしれなくもない…。
- PCの電源を切る、ボードをPCから外す、再起動する。
- デバイスマネージャで当該ポートや未使用COMポートを探して削除する。
探し方:Windows のデバイスマネージャーから、表示→デバイス(種類別)して当該デバイスを探す。
- PCの電源を切る、ボードをPCに接続する、再起動する。
- 認識するかどうか確認する(しばらく時間がかかる)→認識すればそれでOK
- 必要に応じて、デバイスドライバを再インストールする。
泉 知論
@
立命館大学
理工学部
電子情報工学科
その他の講義&演習資料はこちら