立命館大学 大学院 講義資料
(C) by T.IZUMI @ Ritsumeikan U, Sep 2016 - 無断複製・再配布を禁ず
プログラマブルロジックとプロセッサの連携
ターゲットボードとFPGA
開発環境
- Xilinx Vivado 2015.4
- Xilinx SDK 2015.4
実行環境
演習用ファイル
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]する。
※Vivado にボード定義ファイルをインストールした際、
古いボード定義ファイルを削除していないと以下の設定がうまくされない。
- 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のチェックは外し、OK。
- 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
- 何か問題があったら警告が出るので対処する
- 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 をチェックしてOK。
5. ソフトウェア開発プロジェクトの設定(SDK)
Xilinx SDK 上でのソフトウェア開発環境をセットアップする。
SDK の起動
- Vivado の上端メインメニュー File から Launch SDK する。
- (次以降に SDK を立ち上げる時も Vivado のプロジェクトから Launch するのが無難)
- Vivado からHardwareをexport(再export)した直後は、起動後もバックグラウンドで処理をしているのでしばらく待つこと。
プロジェクトの生成
- (A)上端メインメニュー File から New → Application Project
- Target Hardware Platform がZYBO_top_hw_platform_0になっていることを確認する。
- Project name: testgpio に設定し、
[Finish]ではなく   [Next]する。
- Hello World の Template を選択し、[Finish]する。
6. ソフトウェアの動作確認(Hello World)(SDK)
ZYBO と PC の接続
- ZYBO の JP5 を JTAG 側に挿す。
- ZYBO の PROG UART に micro USB ケーブルを接続。電源投入。ドライバ類の認識を確認。
ZYBOシリアルコンソールのUART接続
- UART接続のPC上でのポート番号を確認する。
PCを右クリック、プロパティからデバイスマネージャを起動し、
ポート(COMとLPT)を開いて USB Serial Port の(COM番号)を確認する。
- 端末(ターミナルエミュレータ、ここでは TeraTerm)を起動する。
- 「新しい接続」でシリアルを選択、上記で確認したポート番号を設定する。
- 「設定」→「シリアルポート」で以下のように設定する。
Port | 上記確認ポート |
Baud Rate | 115200bps |
Data Bits | 8bit |
Parity | none |
Stop Bits | 1bit |
Flow Control | none |
FPGAの書き込み
- SDK (A)上端メインメニュー Xilinx Tools から、Program FPGA を実行。
- LD10 DONEの点灯を確認。
コンパイル
- (B) Project Explorer ウィンドウで testgpio の下の src の下の helloworld.c をダブルクリックして開く。
- (C)メインウィンドウでソースコードを確認する。必要なら編集して保存する。
- (A)上端メインメニュー Project から Build All する。
- (B) Project Explorer ウィンドウで testgpio の下 Debug の下に
実行型式testgpio.elfが生成されていることを確認。
実行
- (B) Project Explorer で testgpioを右クリックし、
Run As → Launch on Hardware (System Debugger)を実行。
- 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の連携動作確認(SDK)
7-1. ソースコードの登録
- (B) Project Explorerのtestgpio/srcの下の helloworld.cを右クリックし、Delete する。
- Windows の Explorer から testgpio.c をドラッグし、SDK の Project Explorer ウィンドウ内のtestgpio/srcにドロップする。
(*)Copy files にチェックし、OK。
- Project Explorer から /testgpio/src/testgpio.c の内容を確認する。
- Project Explorer から /testgpio_bsp/ps7_cortexa9_0/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
:
|
- Project Explorer から /testgpio_bsp/ps7_cortexa9_0/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. コンパイルと実行(SDK)
- リセット等の場合は必要に応じて Program FPGA を実行する。
- 必要に応じて TeraTermを起動しZYBOと接続しておく。
- (A)上端メインメニュー Project から Build All する。
- (B) Project Explorer で testgpioを右クリックし、
Run As → Launch on Hardware (System Debugger)を実行。
- このサンプルは次のように構成されている。
- LD MIO7, BTN MIO50, BTN MIO51 はPS側に接続されている。
- LD[3:0], SW[3:0], BTN[3:0] はPL側に接続されている。
- TeraTermは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側)が光る。
- TeraTermに 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. 不揮発メモリからの起動(SDK)
上記では、開発用PCから直接JTAG経由でFPGAに書き込んだ(下図(1)の方法)。
頻繁に書き換える開発途中や
状態を設定・観測するデバッグ中はこの方法が便利である。
しかし、最終的には開発用PCに接続せず、機器が単独で起動しなければならない。
ここでは、
micro SD card から起動する方法(下図(3)の方法)と
ボード上の QSPI flash memory から起動する方法(下図(2)の方法)を
実行する。
起動ファイルの作成(SDK)
まず、起動のためのファイルを作成する。SDK上で作業する。
- 起動プログラム(FSBL, First Stage Boot Loader)のプロジェクトを作成
- [File], [New], [Application Project]
- Project name: fsbl, OS Platform: standalone,
([Finish]ではなく)[Next]
- Zynq FSBL, [Finish]
- [Project], [Build All]
- Project Explorer:/fsbl/Debug/fsbl.elf が生成されていることを確認
- Project Explorer:/fsblを右クリック、[Create Boot Image]
- 下部 Boot image partitions に
起動プログラムfsbl.elf(Partition type: bootloader)、
PL部の回路構成ZYBO_top.bit、
PS部のプログラムtestgpio.elfをこの順で登録する。
無ければ[Add] [Browse]して探して登録する。
- [Create Image]して、
Project Explorer:/fsbl/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の電源を入れる
- SDKの上部メインメニューから [Xilinx Tools], [Program Flash]
- Image File に上記で作成したBOOT.binを指定、
Flash Type: qspi_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 する
- SDK で Run As, 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
- 必要に応じて、デバイスドライバを再インストールする。
SDK インストール状況の確認と追加インストール
- Xilinxのホームページでエラーコードを検索
(AR#55559)
- Helpにある「Add Design Tools or Devices 2015.2」から「Software Development kit」を選択し追加する。
- SDK をインストールしたら、コマンドプロンプトにて
- C:\Xilinx\Vivado\2015.2\settings64.batを実行
- C:\Xilinx\SDK\2015.2\settings64.batを実行
- C:\Xilinx\Vivado\2015.2\bin\Vivado.batを実行
- 注意:実行前にプロジェクトは閉じておく
泉 知論
@
立命館大学
理工学部
電子情報工学科
その他の講義&演習資料はこちら