前回はPL(Programmable Logic)部分のみを用いてLチカを行いました。
今回はPS(Processing System)部のCPUからPL部のIP(AXI GPIO)を制御してLチカさせてみようと思います。
ブロックデザインを作成
まずはVivadoプロジェクトを新規作成します。(作成手順は前回までの記事参照)
その後Flow NavigatorのIP IntegratorのCreate Block Designをクリックし、新規のブロックデザインを作成します。
Diagram上で右クリックしAdd IPをクリック(もしくはDiagramウィンドウの+マークをクリック)して、ZYNQ7 Processing Systemを追加します。
IPが追加されました。
Run Block Automationをクリックして自動でポートの作成と、ボード情報を設定します。
デフォルトのままでOKをクリックします。
Add IPでAXI GPIOを追加します。
ちなみに、Search欄にワードをいれることでIPの絞り込みができます。
AXI GPIOのシンボルをダブルクリックしてIPの設定を変更します。
IP ConfigrationタブをクリックしてGPIOのポート数と入出力方向を設定します。
All Outputsにチェックを入れて、GPIO Widthを4にします。(せっかくなので4つのLEDを光らせます。)
Run Connection Automationをクリックして、Vivadoに配線を自動でやってもらいます。
S_AXIだけにチェックを入れて、OKを押します。(GPIOポートは自分で接続するので)
自動でProcessor System ResetとAXI Interconnectも追加され配線されています。
AXI GPIOのGPIOの+マークをクリックしてgpio_io_o[3:0]を出現させて、gpio_io_o[3:0]を右クリックしてMake Externalをクリックして外部ポートを作成します。External Port Propertiesでポート名をわかりやすく変えてもいいです。
Diagram上で右クリックして、Validate Designをクリックします。配線がおかしくないかチェックしてくれます。
問題なければsuccessfulと出ます。
Ctrl+Sかセーブマークをクリックしてブロックデザインを保存したら、ラッパーファイルを作ります。Sourcesタブのdesign_1(design_1.bd)を右クリックしてCreate
HDL Wrapperをクリックし、Let Vivado~にチェックを入れてOKをクリックします。
design_1_wrapperが生成されたら、Flow Navigator のRTL ANALYSISのOpen Elaborated Designをクリックし実行します。結構時間がかかります。(僕は10分位かかりました)
I/O PortsからGPIOのピンを設定します。GPIO以外のピンはボード設定によって自動で設定されています。I/O StdはLVCMOS33に設定し、GPIOのピンはZYBO上のLED(D18、G14、M15、M14)に設定します。設定後制約ファイルを保存します。
ピン制約を保存したら、Generate BitstreamでBitstreamファイルを生成します。(かなり時間がかかります)
終了したらCancelをクリックします。
VivadoのFileのExportのExport Hardwareをクリックします。
Include bitstreamにチェックを入れて(これを忘れると後々上手くいきません)OKをクリックします。すぐに処理は終わります。
再びVivadoのFileをクリックし、その中のLaunch SDKをクリックします。
デフォルトのままでOKをクリックします。
自動でXilinx SDKが起動します。
Xilinx SDKでアプリケーションプロジェクトを作成
FileのNewのApplication Projectをクリックして新規のアプリケーションプロジェクトを作成します。
project nameに任意の名前を付けてあとはデフォルトのままでNextをクリックします。
Empty Applicationを選択してFinishをクリックします。
SDKのProject Explorerにプロジェクト(BSPプロジェクトも自動生成される)が追加されました。
Project Explorerのアプリケーションプロジェクト(ここではPS_Lchika)のsrcフォルダを右クリックしてNew→Source Fileをクリックします。
Source fileにファイル名と拡張子まで入力してFinishをクリックします。
ソースファイルが追加されました。
ソースファイルにmain関数を作って、アプリケーションプロジェクトを完成させていきます。
GPIOなどのベースアドレスはBSPプロジェクト(ここではPS_Lchika_bsp)のps7_cortexa9_0のinclude内の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で保存したらビルドしましょう。メニューのProject→CleanをクリックしてデフォルトのままでOKをクリックします。
デバッグでLチカ
無事ビルドできたら(できてなかったら修正して保存した後再度ビルドしてください)ZYBOのJP5がJTAGになってるのを確認して、PCと接続し、電源をONにします。
メニュー下あたりにあるProgram FPGAをクリックします。
OKをクリックすると、ZYBOにVivadoで作成してあったBitファイルが書き込まれます。
Project Explorerのアプリケーションプロジェクトを選択した状態で右クリック→Debug As→Debug Configrstionsをクリックします。
Xinlinx C/C++ applicaton(System Debugger)をダブルクリックします。
ダブルリックで作成されたSystem Debugger using Debug
PS_Lchika/elf on Localを選択し、Debugをクリックします。
デバッグ用画面に切り替えてよいか聞かれているのでYesをクリックします。
再生マークをクリックすると、作成しビルドしたアプリケーションプログラムが動き出します。
ZYBO上のLEDがLD0→LD1→LD2→LD3という順番で0.5秒ごとに切り替わってで光ると思います。
プログラムを修正したいときは、アルファベッドのZを90度回転させたようなマーク(Disconnect)をクリックして一旦ZYBOとの通信を切った後、修正&ビルドしてProgram FPGAから同様の手順で動作させてください。
0 件のコメント:
コメントを投稿