勉強しないとな~blog

ちゃんと勉強せねば…な電気設計エンジニアです。

ZYBOを進める - 9. Xilinx SDKで試しのプログラム

前回までで、Zynq PS部の設定とPL部の回路構成情報を含んだビットストリームの生成を行いました。
Zynq上に乗せるLinuxのビルドに進みたいところですが、一回ベアメタルでARMコア上のプログラムを作成して動かしてみたいと思います。

Vivado プロジェクト ブロックデザインの再確認

Vivadoで作成したブロックデザインですが、PS部から FIXED_IO というポートが出ていて、これがデバイス外部に出ています。

f:id:nokixa:20190607014113p:plain

上の画像では、FIXED_IOを展開してみていますが、この中の MIO[53:0] が大事なところ。
PS部(Zynq 7 Processing System)をダブルクリックしてカスタマイズ画面を出してみると、

f:id:nokixa:20190607015226p:plain

こんな感じで、まずZynq Block DesignタブでMIOに出せるペリフェラルが確認できます。

さらに、Peripheral I/O Pinsタブで、ペリフェラルごとのピン割り当てが設定されます。

f:id:nokixa:20190607015814p:plain

ある程度設定できる範囲は決められているみたいですが、選択肢はあるようです。

ここで、一回ZYBOの回路図を見てみます。

https://reference.digilentinc.com/_media/reference/programmable-logic/zybo/zybo_sch.pdf

f:id:nokixa:20190607020132p:plain

実はリファレンスマニュアルを見たほうがいいかもしれません。 reference.digilentinc.com

この回路図p9に、PS部MIOの接続先が記載されています。
今回、UARTとLEDを試しに使ってみたいと考えていますが、これらは

  • UART → MIO48 (UART_RXD_OUT), MIO49 (UART_TXD_IN)
  • LED →MIO7

につながっています。
再度PS部設定を見ると、

f:id:nokixa:20190607021608p:plain f:id:nokixa:20190607021622p:plain

というわけで、GPIOとUART1が期待のピンに割り当てられていました。

Xilinx SDKでプログラム作成

前回ハードウェアのエクスポートはやってあるので、SDKを立ち上げます。

File > Launch SDK を選んで、

Exported Location :
Workspace :

で前回ハードウェアエクスポートを行ったフォルダを指定してOKを押します。
すると、Xilinx SDK (eclipseベースの開発環境 この名前が紛らわしいようです…)が立ち上がります。



ここでZynq ARMコアで動かすプログラムを作っていきます。
まず、File > New > Application Project を選びます。



プロジェクト名を入力します。 ここでは、zybo_testにしました。 一緒にBoard Support Package (zybo_test_bsp)も作成されます。



プロジェクトのテンプレートを選びます。
ここでは、Hello Worldテンプレートにしました。



Finishを押すと、デフォルトでは自動ビルドの設定になっているので、ビルドが進みます。
少し時間がかかります。

f:id:nokixa:20190608101837p:plain:w600

実機動作

このHello Worldプロジェクトを実機で動かしてみます。

まず、ボードの接続を行います。
5V電源、USB (to PC)を接続します。
電源スイッチを上側にスライドすると、ZYBOに電源が入って起動します。

f:id:nokixa:20190617003536p:plain:w600

電源が入るとまずPGOOD LEDが光ります。
電源が入ってますよ、ということを示しています。

f:id:nokixa:20190617004608j:plain:w600

ここで、Xilinx SDKに戻って、"Program FPGA"のボタンをクリックし、 "Program FPGA"ウィンドウの"Program"ボタンをクリックします。 USB接続されたZYBOを自動認識して、コンフィグレーションデータ(Vivadoブロックデザインで作成したデータ)の書き込みが行われます。

f:id:nokixa:20190617010623p:plain:w600

f:id:nokixa:20190617010705p:plain:w600

※ZYBOが認識されない場合、FTDI社のサイトから、Virtual COM Port (VCP)ドライバをインストールする必要があります。

Virtual COM Port Drivers

コンフィグレーションデータが書き込まれると、ZYBOのDONE LEDが光ります。

f:id:nokixa:20190617012212j:plain

今回のデザインでは、UARTに"Hello World"が表示されるようになっています。
COMポート操作アプリケーションとしてTeratermを行い、ここに表示するようにしたいと思います。
PCへのインストール、もしくはexeのダウンロードが必要です。

Tera Term (テラターム) プロジェクト日本語トップページ - OSDN

Teratermを立ち上げて、COMポートに接続します。

f:id:nokixa:20190617014257p:plain:w600

※ZYBOのJ11のUSBポートは、JTAGとUART兼用になっています。
TeratermからCOMポートに接続する際、2つのCOMポートが現れますが、 どちらかがUART側のCOMポートです。
JTAG側は、上の手順を踏めばXilinx SDKが占有するので、接続しようとしてもエラーになるはずです。
エラーになったら、もう一方のCOMポートに再度接続を行います。

※設定 > シリアルポート から、ボーレートを115200に設定する必要もあります。

Xilinx SDKで、"Debug"ボタンを押して、zybo_testプロジェクトを実行してみたいと思います。

f:id:nokixa:20190617015439p:plain:w600

初めての場合は、まだデバッグ構成が設定されていないので、”Debug As”ウィンドウが出ると思います。
"Launch on Hardware (System Debugger)"を選んで"OK"を押します。

[f:id:nokixa:20190617015510p:plainw300]

初めての場合は、これも出ると思います。 "Remember my decision"にチェックを入れて、"Yes"を押します。

f:id:nokixa:20190617015645p:plain:w400

これらが済むと、ZYBOへのプログラムの書き込みとデバッグ実行が行われます。
デフォルトでは、main()関数の最初のところでプログラムが一時停止する設定になっています。

f:id:nokixa:20190617020525p:plain:w600

"Resume"ボタンをクリックすると、プログラムの実行が再開されます。
このプログラムは、"Hello World"を表示したらすぐmain()関数を抜けてしまうようなものなので、 アセンブラ上で_exitのところまで行って止まります。

f:id:nokixa:20190617020615p:plain:w600

このとき、Teratermを見てみると、"Hello World"が表示されているはずです。

f:id:nokixa:20190617021020p:plain:w600

今回はここまで

思ったより長くなってしまいました。
更新も遅くなってしまった…