【Zynq】ZYBOでPSのMIOを使用してLチカしてみた

前回はZYBOのPLブロックだけを使用してLEDを点滅させました。

【Zynq】ZyboでPLのみ使用してLチカしてみた

今回はPS(Processing System)を使用してLチカしてみます。PSから制御する場合には幾つか方法があるようですが、今回はMIOピンを使用します。

使用OS Windows 10
Vivado 2016.3

MIOとは?

MIOはMultiplexed I/Oの略で、複数機能ブロックのI/Oを共有した外部ピンです。例えば今回使用するピンはSRAM/NOR FlashやNAND FlashブロックのI/Oと共用なので、これらの機能を使用する場合には汎用I/Oとしては使えません。

また折角のFPGAですが、これらの信号をPL内部で使用することも出来ません。その場合はEMIO I/Fを使用して、PL側にアクセスする必要があるようです。下図はPSと外部I/Oの接続関係図です(Xilinx j_ug585_Zynq-7000-TRM.pdf (v1.10) 2015年2月23日より抜粋)。

Xilinx ug585 Zynq

VivadoでProcessing System実装

今回のプロジェクト設定です。

項目 設定
Project Name
  Project name led_mio
  Project location C:/fpga/zybo/led_mio/2016.3
Project Type RTL Project
Add Sources デフォルト
Add Existing IP(optional) デフォルト
Add Constraints(optional) デフォルト
Default Part
  Select Boards
  Display Name Zybo

今回はPSを使用するため、Block Designを使用して実装します。起動画面左側から、”Project Manager”→”Create Block Design”をクリック。
Create Block Design

表示ダイアログで”Design name”を”led_mio_bd”としてOK。
Create Block Design dialog

メイン画面に”Diagram”タブが表示されます。”Diagram”タブ左側の”Add IP”アイコンを押下。
Vivado Diagram
Diagram Add IP

表示ダイアログで”ZYNQ7 Processing System”を選択。
Add IP ZYNQ7 Processing System

“Diagram”にPSが追加されます。今回は”FIXED_IO”の”MIO”を使用します。”FIXED_IO”の”+”を押下、”MIO[53:0]”を右クリックして、”Make External”を選択します。Diagram ZYNQ7 Processing System
Diagrram ZYNQ7 Processing System Make External
Diagram ZYNQ7 Processing System Make External

“processing_system7_0″をダブルクリックすると設定ダイアログが開きます。今回はGPIOを使用したいので、”Peripheral I/O Pins”→”GPIO MIO”にチェックをつけてOKを押します。
Recusmize IP dialog GPIO MIO

“processing_system7_0″のAXIバスで使用するクロックは、PSが出力するクロックをそのまま入力します。”FCLK_CLK0″にマウスポインタを近づけると鉛筆マークになるので、ドラッグして”M_AXI_GP0_ACLK”に繋ぎます。最終的に以下のような状態になりました。
Block Design ZYNQ7 Processing System

“Diagram”タブ左の”Validate Design”アイコンをクリックするとBlock Designに問題がないかをチェックしてくれます。下のダイアログが表示されればOKです。
Block Design Validate Design
Validate Design Result Dialog

“Source”ビューの”Design Sources”下に”led_mio_bd”が表示されているので、右クリックして”Create HDL Wrapper…”を選択。これでBlock DesignをラップしたHDLファイルが生成されます。
Create HDL Wrapper

表示されるダイアログではBlock Design変更時に自動でラッパーファイル更新するかを聞かれるので、自動更新にしておきます。
Create HDL Wrapper Let auto-update

以上でPSの実装は終了です。画面左側”Generate Bitstream”を選択し、bitファイルを生成します。終了したら以下ダイアログが表示されるので、Open Implemented Designを選択してOK。
Bitstream Generation Completed

後でSDKにて使用するために、ハードウェア情報をエクスポートします。”File”→”Export”→”Export Hardware”をクリック。”Include bitstream”にチェックしてOK。
Export Hardware
Export Hardware Include bitstream

今回はSDKをVivadoから起動します。”File”→”Launch SDK”で起動可能です。
Launch SDK

Xilinx SDKでS/W作成

PSにて動作するソフトウェアはXilinx SDKを使用して作成します。デバッグ等もこのツール上から行えるようです(まだ使い方は分かりませんが…)。下が起動画面です。
Xilinx SDK Top

ソフトウェア用のプロジェクトを作成します。”File”→”New”→”Application Project”を選択。”Project Name”に”led_mio”を指定。”Next”を押すとソースコードのテンプレートが指定可能なようですが、今回は”Empty Application”を指定。
New Application Project
Application Project
Empty Application

“Project Explorer”でプロジェクトが追加されたのが分かります。”led_mio”を開くと”src”フォルダがあるので右クリック。”New”→”Source File”でソースファイルを追加します。
Project Explorer New Source File

表示されるダイアログでファイル名を指定。”Template”は今回は必要ないので、”None”を選択。
New Source File Dialog

追加ファイルにプログラムを記述していく訳ですが、どのように記述していけばよいかはXilinxが用意したサンプルを見るのが近道です。”system.mss”タブの”Peripheral Drivers”から、各モジュール用のドキュメントとサンプルが表示できるようになっています。今回は”Import Examples”から”xgpiops_polled_example.c”を参考にしました。
Peripheral Drivers
Examples for gpiops

今回記述したソースです。

#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"

XGpioPs Gpio;

int main (void)
{
	int status;
	u32 value = 0x0;
	XGpioPs_Config *ConfigPtr;

	// GPIOドライバ初期化
	ConfigPtr = XGpioPs_LookupConfig(XPAR_XGPIOPS_0_DEVICE_ID);
	status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
					ConfigPtr->BaseAddr);
	if (status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	XGpioPs_SetDirectionPin(&Gpio, 7, 1);		// MIO 7bit出力設定
	XGpioPs_SetOutputEnablePin(&Gpio, 7, 1);	// MIO 7bit出力有効
	// 1s毎に点滅
	while (1) {
		XGpioPs_WritePin(&Gpio, 7, value);	// MIO 7bit値設定
		sleep(1);							// 1s待機
		value = ~value;						// 値反転
	}

	return 0;
}

動かなかったので追加で試したこと

以上で終了のはずでしたが、このままだと動作しませんでした。幾つか試した結果動いたのですが、何が良かったのかよく分からなかったので全て記載しておきます。

  • PSのDDRアクセス機能を無効化
    これはあまり関係ないと思いますが、PSのDDRアクセスの機能を無効にしました。Block Designの設定画面の”DDR Configuration”にて”Enable DDR”のチェックを外しました。
    Re-customize IP DDR Configuration Enable DDR
  • Block Design関連ファイルを再生成
    Block Designの設定を変更したので、関連ファイルを削除、再生成しました。”Source”ビューの”led_mio_bd”を右クリック。”Reset Output Products…”をクリックして”Reset”。終了したら、同様に”Generate Output Products”をクリックして”Generate”。終了後、”Generate Bitstream”をクリックしてbitファイルを更新しました。
    Generate/Reset Output Products
    Reset Output Products
    Generate Output Products
  • sdkフォルダ削除
    個人的にはこれが一番効いたと思っているのですが、SDKを閉じた状態で、sdkフォルダを削除しました。その上でハードウェア情報を生成する手順(“File”→”Export”→”Export Hardware”)からやり直しました。
  • 実機動作確認

    初めにZYBOの基板設定を変更します。VGAコネクタの近くにジャンパがあるので、JTAG設定に変更します。
    ZYBO JTAG ジャンパ設定

    FPGAデータの書き込みとプログラムのロードはSDKから可能です。”Xilinx Tools”メニューから”Program FPGA”を選択してダイアログを表示。デフォルトのまま”Program”を選択します。
    Xilinx SDK Program FPGA
    Program FPGA

    “Run”アイコン右の▼から”Launch on Hardware(GDB)”を選択します。これでプログラムがロードされます。
    Run As Launch on Hardware(GDB)

    無事LD4が点滅しました。
    ZYBO LD4

    シェアする

    • このエントリーをはてなブックマークに追加

    フォローする