立命館大学 大学院 講義資料
(C) by T.IZUMI @ Ritsumeikan U, Apr 2021 - 無断複製・再配布を禁ず
プログラマブルロジックとプロセッサの連携
ターゲットボードとFPGA
開発環境
- Xilinx Vivado 2020.2
- Xilinx Vitis IDE 2020.2
注:以下、ツール画面キャプチャの画像は Vivado 2015.4, SDK 2015.4 のものです。
Vivado 2020.2, Vitis IDE 2020.2 でもおよその配置はほぼ同様です。
実行環境
演習用ファイル
0. 概要
1. プロジェクトの生成 (Vivado)
- Vivado を起動する。
既存のプロジェクトが開いていたら [File] -> [Close Project] する。
1-1. プロジェクト生成
1-2. 画面の確認
- 左側 Flow Navigator (B)で、大まかに何をするか指定する。
- 右側 (C)で、各種設定、操作指示、ファイル編集、などを行う。
- 下側 (D)で、ログや状況の確認を行う。
- 見たい画面が行方不明なときのチェックリスト
- それぞれの領域のタブで切り替える
- (B)Flow Navigator で対象手順を選択
- (E)対象のファイル、モジュール、信号などを選択
- (D)で対象のオブジェクトを選択
- (A)メインメニューの Window で選択
1-3. ソースファイルの登録
- (A)メインメニュー [File]→[Add Sources]を選択する。
- (*) Add or create constraints を選択する。
- +を押下、Add Files を実行、zybo.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)ウィンドウにファイルが表示される。
内容を確認する。
2. Vivado IP Integrator によるシステム構築 (Vivado)
2-1. Block Design の生成と登録
- (B) Flow Navigator の IP Integrator から Create Block Design を実行する。
- Design name = Zynq_PS として生成する。
- 右側にBlock Design のウィンドウ群が現れる。
2-2. Zynq PS(ARM) の配置と設定
- [Diagram] ウィンドウ(E)の上側 [+] ボタンを押下して ZYNQ7 Processing System を追加する。
- [Diagram] の下地を右クリックして [Run Block Automation] を選択、
[Apply Board Preset] にチェックして、[OK] する。
(注:ボード定義ファイルをインストールした際、
古いボード定義ファイルを削除していないと以下の設定がうまくできない)
- Procesing System のオブジェクトを右クリックし Customize Block を実行する。
- 左側 MIO Configuration を選択する。
- 設定を確認し必要に応じて変更する。詳細は
ZYBO Reference Manual, Page 7-8 の Table3: MIO Pinoutと
ZYBO Schematic, Sheet #9 を参照のこと。特に、次に注意するのは…
- Bank1 I/O Voltage は LVCMOS1.8V にする。
- UART1とGPIO MIO 7, 50, 51 を使うように設定し、次のように設定する。
MIO Pin | Peripheral | Signal | IO Type | Speed | Pullup | Direction |
UART1(シリアルコンソール) |
MIO 48 | UART 1 | tx | LVCMOS 1.8V | slow | disabled | out |
MIO 49 | UART 1 | rx | LVCMOS 1.8V | slow | disabled | in |
GPIO MIO7(発光ダイオード) |
MIO 7 | GPIO | gpio[7] | LVCMOS 3.3V | slow | disabled | out |
GPIO MIO51, 50 (プッシュボタン) |
MIO 50 | GPIO | gpio[50] | LVCMOS 1.8V | slow | disabled | inout |
MIO 51 | GPIO | gpio[51] | LVCMOS 1.8V | slow | disabled | inout |
- 左側 Clock Configuration を選択する。
- 設定を確認し、必要に応じて設定変更する。特に次を確認すること。
詳細は
ZYBO Reference Manual, Page 21 の"12 Clock Sources"を参照のこと。
Clock Configuration |
Input Frequency 50MHz CPU Clock Ratio 6:2:1
+ Processor/Memory Clocks
+ CPU ARM PLL, 650
+ DDR DDR PLL, 525
+ PL Fabric Clocks
+[*] FCLK_CLK0 IO PLL, 100
|
- 左側 Zynq Block Design を選択し、プロセッサ部の構成を確認する。
- Customize Block を終了する。
2-3. 基本モジュールの配置
- Diagram ウィンドウ(E)の左側+ボタンを押下してAXI GPIOを追加する。
- Diagram ウィンドウ内の下地で右クリック、Run Connection Automation を実行する。
axi_gpio_0 の S_AXI にチェックし、GPIOのチェックは外す。
- Diagram ウィンドウ内に Processor System Reset, AXI Interconnect が配置され接続されていることを確認する。
- Diagram ウィンドウ内の下地で右クリック、Regenerate Layout を実行すると
図の配置を自動で調整してくれる。
2-4. プロセッサのクロック、リセットを出力
- Processing System の FCLK_CLK0 を右クリックし、Create Port を実行する。
Port name: clko とする。
- Processor System Reset の peripheral_aresetn[0:0] を右クリックし、Create Port を実行する。
Port name: rstno とする。
2-5. GPIO の設定
- axi_gpio_0 を右クリックしCustomize Block を実行。IP Configuration タブで[*]Enable Dual Channel をチェックする。
- 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 |
2-6. アドレス空間の設定
- ウィンドウ(E)上部 [Address Editor] タブを開く。
- axi_gpio_0が割り当てられているアドレスを確認し、メモしておく。
- Unmapped Slaves があれば右クリックし Auto Assign Address する。
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 を展開し、
設計結果が組み込まれていることを確認する。
3. ロジックのコンパイル (Vivado)
- Flow Navigator領域内、Synthesis の Run Syntehsis を選択、実行する。
- Flow Navigator領域内、Implementation の Run Implementation を選択、実行する。
- Flow Navigator領域内、Program and Debug の Generate Bitstream を選択、実行する。
- 各段階でProject Navigator 領域の右上 Project Summary, 下 Messages, Log, Reports などを確認する。
- 必要に応じて、ファイルを編集し再実行。Flow Navigator 領域内左上 Sources でソースファイルを選択し開いて、左上で編集・保存する。
4. プロセッサシステム情報のエクスポート (Vivado)
ソフトウェア開発のためにプロセッサシステムの情報をエクスポートする。
- 上端メインメニューのFileから、Export → Export Hardware を実行する。
- [*] Include bitstream をチェックする。
5. ソフトウェア開発プロジェクトの設定 (Vitis IDE)
Xilinx Vitis IDE 上でのソフトウェア開発環境をセットアップする。
Vitis IDE の起動
- Vivado の上端メインメニュー [Tools] から [Launch Vitis IDE] する。
(次以降に Vitis IDE を立ち上げる時も Vivado のプロジェクトから Launch するのが無難)
- Workspaceに作業フォルダを設定する。Vivado の隣に作成するのが良いだろう。演習では教員の指示に従うこと。
- Vivado からHardwareをexport(再export)した直後は、起動後もバックグラウンドで処理をしているのでしばらく待つこと。
プロジェクトの生成
- (A)上端メインメニュー [File] から [New] → [Application Project] する。
- Platform 設定の項目で
[Create a new platform from hardware (XSA)]
→ [Browse] して Vivado で export したハードウェア
(例:G:\zynqbasic\ZYBO_top.xsa)を選択する。
- Application Project Details 設定の項目で
Application project name: testgpio
に設定する。
- Domain 設定の項目は既定値で進む。。
- Templates 設定の項目で Hello World を選択する。
6. ソフトウェアの動作確認(Hello World) (Vitis IDE)
ZYBO と PC の接続
- ZYBO ボードの JP5 を JTAG 側に挿す。
- ZYBO ボードの PROG UART に micro USB ケーブルを接続。電源投入。ドライバ類の認識を確認する。
ZYBOシリアルコンソールのUART接続
- UART接続のPC上でのポート番号を確認する。
スタートメニューを右クリックしてデバイスマネージャを起動し、
ポート(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 |
FPGAの書き込み
- (A) 上端メインメニュー [Xilinx] から、[Program Device] で [Program] する。
- ボード上 LD10 DONEの点灯を確認する。
コンパイル
- (B) [Explorer] ウィンドウで testgpio-system / testgpio / src の下の helloworld.c をダブルクリックして開く。
- (C)メインウィンドウでソースコードを確認する。必要なら編集して保存する。
- (A)上端メインメニュー [Project] から [Build Project] (または [Build All])する。
- (B) [Explorer] ウィンドウで testgpio-system / testgpio / Debug の下に
実行型式 testgpio.elf が生成されていることを確認する。
実行
- (B) [Explorer] で testgpio を右クリックし、
[Run As] → [Launch on Hardware (Single Application Debug)] を実行する。
- ボード上 BTN0〜3を押下し、LD0〜3の点滅を確認する。
(PSのクロックによるPLのハードウェア動作確認)
押下 | LD[3:0]表示 |
BTN3 | counter[31:28] |
BTN2 | counter[27:24] |
BTN1 | counter[23:20] |
BTN0 | SW[3:0] |
- 端末上で、Hello Wolrd の出力を確認する。(PSのソフトウェア動作確認)
7. PSとPLの連携動作確認 (Vitis IDE)
7-1. ソースコードの登録
- (B) [Explorer] ウインドウ内の testgpio-system / testgpio / src の下の helloworld.c を右クリック→ Delete する。
- Windows の Explorer で配布された testgpio.c を右クリック→ Copy して、Vitis IDE の [Explorer] ウインドウ内の testgpio-system / testgpio / src で右クリック→ Paste する。
- (B) [Explorer] から testgpio-system / testgpio / src / testgpio.c を開き、内容を確認する。
- (B) [Explorer] から ZYBO_TOP / ps7_cortexa9_0 / standalone_ps7_cortexa9_0 / bsp / include / xparameters.h を開き、内容を確認する。
:
/* Definitions for peripheral AXI_GPIO_0 */
#define XPAR_AXI_GPIO_0_BASEADDR 0x41200000
#define XPAR_AXI_GPIO_0_HIGHADDR 0x4120FFFF
#define XPAR_AXI_GPIO_0_DEVICE_ID 0
#define XPAR_AXI_GPIO_0_INTERRUPT_PRESENT 0
#define XPAR_AXI_GPIO_0_IS_DUAL 1
:
|
- (B) [Explorer] から ZYBO_TOP / ps7_cortexa9_0 / standalone_ps7_cortexa9_0 / bsp / include / 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 */
:
|
7-2. コンパイルと実行 (Vitis IDE)
- リセットした場合には [Program Device] を実行する。
- 必要に応じて MobaXterm を起動し ZYBO と接続しておく。
- (A)上端メインメニュー [Project] から [Build Project] する。
- (B) [Explorer] で testgpio を右クリックし、
[Run As] → [Launch on Hardware (Single Application Debug)] を実行する。
- このサンプルは次のように構成されている。
- 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) が表示されていることを確認する。
- 文字表示器の左上に LD[3:0] の発光パタン (gpo01)、
右上に PS側 (testgpio.c) の counter値 (gpo02)、
左下に PL側の SW[3:0] と BTN[3:0]、
右下に PL側の counter値が表示されていることを確認する。
- BTN MIO51, 50 を両方とも押すとプログラムが終了する。
8. 不揮発メモリからの起動 (Vitis IDE)
上記では、開発用PCから直接JTAG経由でFPGAに書き込んだ(下図(1)の方法)。
頻繁に書き換える開発途中や
状態を設定・観測するデバッグ中はこの方法が便利である。
しかし、最終的には開発用PCに接続せず、機器が単独で起動しなければならない。
ここでは、
micro SD card から起動する方法(下図(3)の方法)と
ボード上の QSPI flash memory から起動する方法(下図(2)の方法)を
実行する。
起動ファイルの作成 (Vitis IDE)
まず、起動のためのファイルを作成する。Vitis IDE上で作業する。
- 起動プログラム (FSBL, First Stage Boot Loader) のプロジェクトを作成する。
- [File] → [New] → [Application Project] する。
- Platform 設定で
[Create a new platform from hardware (XSA)]
→ [Browse] して Vivado で export したハードウェア
(例:G:\zynqbasic\ZYBO_top.xsa)を選択する。
- Application Project Details 設定の項目で
Application project name: fsbl
と設定する。
- Domain 設定で OS: standalone を選択する。
- Templates 設定の項目で Zynq FSBL を選択する。
- [Project] → [Build Project] する。
- [Explorer] で fsbl-system / fsbl / Debug / fsbl.elf が生成されていることを確認する。
- [Explorer] で fsbl-system を右クリックして [Create Boot Image] する。
- 下部 Boot image partitions に
起動プログラム fsbl.elf (Partition type: bootloader) 、
PL部の回路構成 ZYBO_top.bit、
PS部のプログラム testgpio.elf をこの順で登録する。
無ければ [Add] [Browse] して探して登録する。
- [Create Image]して、
[Explorer] で fsbl-system / _ide / bootimage / BOOT.bin が生成されていることを確認する。
micro SD card からの起動
- 適当な micro SD card を用意する。
- FATでフォーマットする。
(複数パーティションある場合は最初のパーティションを使う。
凝ったパーティション切りは避けた方がよい。)
- 上記 BOOT.bin を micro SD カードのトップにコピーする。
- ZYBO の電源を切る。
- 作成した micro SD card を ZYBO に挿入する。
- ボードの起動モード (JP5) を SD にする。
- ZYBO の電源を入れる。
- 起動と動作を確認する。
- 以後、電源を投入すれば自動で起動する。
QSPI flash memoryからの起動
- ZYBO の電源を切る。
- 起動モード (JP5) を JTAG にする。
- ZYBO の電源を入れる。
- Vitis IDE の上部メインメニューから [Xilinx] → [Program Flash]する。
- Image File に上記で作成した BOOT.bin を指定、
Flash Type: qspi-x4-single を選択し [Program] する。
- ZYBO の電源を切る。
- 起動モード (JP5) を QSPI にする。
- ZYBO の電源を入れる。
- 起動と動作を確認する。
- 以後、電源を投入すれば自動で起動する。
99. その他
Verilog デバグ〜埋もれたタイプミスを見つける
Verilog では、信号を宣言せずに使用してもよい。
なので、タイプミスをしてもエラーにならない。
そのようなバグを見つけるためには、
Messages から次の Warning を検索して確認するとよい。
- [Synth 8-3331] unconnected port
- [Synth 8-3848] does not have driver
- [Synth 8-3295] 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 As, Hardware)とPLも動作する。
Zynq の実機での再実行について
実行中のプログラムが残っている(直前のmain()が終了していない)と
再実行がうまくいかないようだ。まず終了させてから次の作業に入ること。
再実行うまくいかないとき、経験的に成功率の高い対処方法は…
- プロセッサをリセット(PS-SRSTボタン)してProgram FPGAする。
- ボードの電源をいったん切って入れなおしてProgram FPGAする。
Zynq の実機デバッグ時の実行
PL側に回路をコンフィグしただけではデバッグモジュール(ILA)が認識されない。
PS側でソフトウェアを実行すると認識される。
- Vivado の Hardware Manager で Program Device する。
- Vitis IDE で Run As, Launch on Hardware する。
- Vivado の Hardware Manager で Reflesh Device する。
ZYBO のボード定義ファイル
古いボード定義ファイルは消すこと。
Vivado インストールディレクトリの
data / boards / board_parts / zynq / zybo 以下。
Windows の COM ポート番号について
Windows は接続したことのあるデバイスを覚えていて、
COM ポート番号を使いまわす。
そのため、新しいデバイスを接続するたびにポート番号が増えていく。
ツールによっては COM ポートの番号が一桁でなければ正常動作しないものがある。
番号を振り直すには、不使用ポートを削除して接続し直す。
- コンピュータのプロパティから詳細設定、環境変数の設定で DEVMGR_SHOW_NONPRESENT_DEVICES を 1 に設定する。
- デバイスマネージャを起動、表示→非表示のデバイスを表示
不要なポートを削除する。
COMポートが認識できない
いちど削除して、ドライバをインストールしなおすと認識することがあるかもしれなくもない…。
- PCの電源を切る、ボードをPCから外す、再起動する。
- デバイスマネージャで当該ポートや未使用COMポートを探して削除する。
探し方:Windows のデバイスマネージャーから、表示→デバイス(種類別)して当該デバイスを探す。
- PCの電源を切る、ボードをPCに接続する、再起動する。
- 認識するかどうか確認する(しばらく時間がかかる)→認識すればそれでOK
- 必要に応じて、デバイスドライバを再インストールする。
泉 知論
@
立命館大学
理工学部
電子情報工学科
その他の講義&演習資料はこちら