2019年1月15日火曜日

ZYBO Z7-20 (zynq-7020)でPSからPL部のIPを制御してLチカ


前回はPLProgrammable Logic)部分のみを用いてLチカを行いました。
今回はPSProcessing System)部のCPUからPL部のIP(AXI GPIO)を制御してLチカさせてみようと思います。



 ブロックデザインを作成

まずはVivadoプロジェクトを新規作成します。(作成手順は前回までの記事参照)
その後Flow NavigatorIP IntegratorCreate Block Designをクリックし、新規のブロックデザインを作成します。

Diagram上で右クリックしAdd  IPをクリック(もしくはDiagramウィンドウの+マークをクリック)して、ZYNQ7 Processing Systemを追加します。

IPが追加されました。
Run Block Automationをクリックして自動でポートの作成と、ボード情報を設定します。

デフォルトのままでOKをクリックします。

Add IPAXI GPIOを追加します。
ちなみに、Search欄にワードをいれることでIPの絞り込みができます。

AXI GPIOのシンボルをダブルクリックしてIPの設定を変更します。
IP ConfigrationタブをクリックしてGPIOのポート数と入出力方向を設定します。
All Outputsにチェックを入れて、GPIO Width4にします。(せっかくなので4つのLEDを光らせます。)

Run Connection Automationをクリックして、Vivadoに配線を自動でやってもらいます。

S_AXIだけにチェックを入れて、OKを押します。(GPIOポートは自分で接続するので)

自動でProcessor System ResetAXI Interconnectも追加され配線されています。
AXI GPIOGPIO+マークをクリックしてgpio_io_o[3:0]を出現させて、gpio_io_o[3:0]を右クリックしてMake Externalをクリックして外部ポートを作成します。External Port Propertiesでポート名をわかりやすく変えてもいいです。

Diagram上で右クリックして、Validate Designをクリックします。配線がおかしくないかチェックしてくれます。

問題なければsuccessfulと出ます。

CtrlSかセーブマークをクリックしてブロックデザインを保存したら、ラッパーファイルを作ります。Sourcesタブのdesign_1design_1.bd)を右クリックしてCreate HDL  Wrapperをクリックし、Let Vivado~にチェックを入れてOKをクリックします。

design_1_wrapperが生成されたら、Flow Navigator RTL ANALYSISOpen Elaborated Designをクリックし実行します。結構時間がかかります。(僕は10分位かかりました)
I/O PortsからGPIOのピンを設定します。GPIO以外のピンはボード設定によって自動で設定されています。I/O StdLVCMOS33に設定し、GPIOのピンはZYBO上のLEDD18G14M15M14)に設定します。設定後制約ファイルを保存します。

ピン制約を保存したら、Generate BitstreamBitstreamファイルを生成します。(かなり時間がかかります)
終了したらCancelをクリックします。

VivadoFileExportExport Hardwareをクリックします。

Include bitstreamにチェックを入れて(これを忘れると後々上手くいきません)OKをクリックします。すぐに処理は終わります。

再びVivadoFileをクリックし、その中のLaunch SDKをクリックします。

デフォルトのままでOKをクリックします。

自動でXilinx SDKが起動します。


Xilinx SDKでアプリケーションプロジェクトを作成

FileNewApplication Projectをクリックして新規のアプリケーションプロジェクトを作成します。

project nameに任意の名前を付けてあとはデフォルトのままでNextをクリックします。

Empty Applicationを選択してFinishをクリックします。

SDKProject Explorerにプロジェクト(BSPプロジェクトも自動生成される)が追加されました。

Project Explorerのアプリケーションプロジェクト(ここではPS_Lchika)のsrcフォルダを右クリックしてNewSource Fileをクリックします。

Source fileにファイル名と拡張子まで入力してFinishをクリックします。

ソースファイルが追加されました。

ソースファイルにmain関数を作って、アプリケーションプロジェクトを完成させていきます。
GPIOなどのベースアドレスはBSPプロジェクト(ここではPS_Lchika_bsp)のps7_cortexa9_0include内のxparameters.h内に記述されています。

AXI GPIOのレジスタマップ(ベースアドレスからのオフセット)は(https://www.xilinx.com/support/documentation/ip_documentation/axi_gpio/v2_0/pg144-axi-gpio.pdf)に書いてあります。(以下の図参照)


以下にソース例を示します。

#include"xparameters.h"
#include <unistd.h>

#define GPIO_0_DATA *((volatile unsigned int*)XPAR_GPIO_0_BASEADDR)
#define GPIO_0_TRI *((volatile unsigned int*)(XPAR_GPIO_0_BASEADDR + 0x04))

int main(){
        GPIO_0_TRI = 0x00;
        while(1){
                for(int i=0; i<4; i++){
                        GPIO_0_DATA = 0x01 << i;
                        usleep(500000);
                }
        }
        return 0;
}

#include <unistd.h>は、usleepを使うためにインクルードしてます。usleep()で指定した時間(単位はμ秒)待ちます。
GPIO_0_TRI = 0x00;AXI GPIOのポートを出力に設定しています。(0が出力1が入力)
GPIO_0_DATA = 0x01 << i;ではポートの出力をHIGHにしています。ビットシフトさせて隣のLEDに流れるように光ります。

Ctrl+Sで保存したらビルドしましょう。メニューのProjectCleanをクリックしてデフォルトのままでOKをクリックします。


デバッグでLチカ

無事ビルドできたら(できてなかったら修正して保存した後再度ビルドしてください)ZYBOJP5JTAGになってるのを確認して、PCと接続し、電源をONにします。

メニュー下あたりにあるProgram FPGAをクリックします。

OKをクリックすると、ZYBOVivadoで作成してあったBitファイルが書き込まれます。

Project Explorerのアプリケーションプロジェクトを選択した状態で右クリック→Debug AsDebug Configrstionsをクリックします。

Xinlinx C/C++ applicaton(System Debugger)をダブルクリックします。

ダブルリックで作成されたSystem Debugger using Debug PS_Lchika/elf on Localを選択し、Debugをクリックします。

デバッグ用画面に切り替えてよいか聞かれているのでYesをクリックします。

再生マークをクリックすると、作成しビルドしたアプリケーションプログラムが動き出します。

ZYBO上のLEDLD0LD1LD2LD3という順番で0.5秒ごとに切り替わってで光ると思います。


プログラムを修正したいときは、アルファベッドのZ90度回転させたようなマーク(Disconnect)をクリックして一旦ZYBOとの通信を切った後、修正&ビルドしてProgram FPGAから同様の手順で動作させてください。


0 件のコメント:

コメントを投稿