前回までで、Zynq PS部の設定とPL部の回路構成情報を含んだビットストリームの生成を行いました。
Zynq上に乗せるLinuxのビルドに進みたいところですが、一回ベアメタルでARMコア上のプログラムを作成して動かしてみたいと思います。
Vivado プロジェクト ブロックデザインの再確認
Vivadoで作成したブロックデザインですが、PS部から FIXED_IO というポートが出ていて、これがデバイス外部に出ています。
上の画像では、FIXED_IOを展開してみていますが、この中の MIO[53:0] が大事なところ。
PS部(Zynq 7 Processing System)をダブルクリックしてカスタマイズ画面を出してみると、
こんな感じで、まずZynq Block DesignタブでMIOに出せるペリフェラルが確認できます。
- SPI
- I2C
- CAN
- UART
- GPIO
- SD
- USB
- Ethernet
さらに、Peripheral I/O Pinsタブで、ペリフェラルごとのピン割り当てが設定されます。
ある程度設定できる範囲は決められているみたいですが、選択肢はあるようです。
ここで、一回ZYBOの回路図を見てみます。
https://reference.digilentinc.com/_media/reference/programmable-logic/zybo/zybo_sch.pdf
実はリファレンスマニュアルを見たほうがいいかもしれません。 reference.digilentinc.com
この回路図p9に、PS部MIOの接続先が記載されています。
今回、UARTとLEDを試しに使ってみたいと考えていますが、これらは
- UART → MIO48 (UART_RXD_OUT), MIO49 (UART_TXD_IN)
- LED →MIO7
につながっています。
再度PS部設定を見ると、
というわけで、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を押すと、デフォルトでは自動ビルドの設定になっているので、ビルドが進みます。
少し時間がかかります。
実機動作
このHello Worldプロジェクトを実機で動かしてみます。
まず、ボードの接続を行います。
5V電源、USB (to PC)を接続します。
電源スイッチを上側にスライドすると、ZYBOに電源が入って起動します。
電源が入るとまずPGOOD LEDが光ります。
電源が入ってますよ、ということを示しています。
ここで、Xilinx SDKに戻って、"Program FPGA"のボタンをクリックし、 "Program FPGA"ウィンドウの"Program"ボタンをクリックします。 USB接続されたZYBOを自動認識して、コンフィグレーションデータ(Vivadoブロックデザインで作成したデータ)の書き込みが行われます。
※ZYBOが認識されない場合、FTDI社のサイトから、Virtual COM Port (VCP)ドライバをインストールする必要があります。
コンフィグレーションデータが書き込まれると、ZYBOのDONE LEDが光ります。
今回のデザインでは、UARTに"Hello World"が表示されるようになっています。
COMポート操作アプリケーションとしてTeratermを行い、ここに表示するようにしたいと思います。
PCへのインストール、もしくはexeのダウンロードが必要です。
Tera Term (テラターム) プロジェクト日本語トップページ - OSDN
Teratermを立ち上げて、COMポートに接続します。
※ZYBOのJ11のUSBポートは、JTAGとUART兼用になっています。
TeratermからCOMポートに接続する際、2つのCOMポートが現れますが、
どちらかがUART側のCOMポートです。
JTAG側は、上の手順を踏めばXilinx SDKが占有するので、接続しようとしてもエラーになるはずです。
エラーになったら、もう一方のCOMポートに再度接続を行います。
※設定 > シリアルポート から、ボーレートを115200に設定する必要もあります。
Xilinx SDKで、"Debug"ボタンを押して、zybo_testプロジェクトを実行してみたいと思います。
初めての場合は、まだデバッグ構成が設定されていないので、”Debug As”ウィンドウが出ると思います。
"Launch on Hardware (System Debugger)"を選んで"OK"を押します。
[w300]
初めての場合は、これも出ると思います。 "Remember my decision"にチェックを入れて、"Yes"を押します。
これらが済むと、ZYBOへのプログラムの書き込みとデバッグ実行が行われます。
デフォルトでは、main()関数の最初のところでプログラムが一時停止する設定になっています。
"Resume"ボタンをクリックすると、プログラムの実行が再開されます。
このプログラムは、"Hello World"を表示したらすぐmain()関数を抜けてしまうようなものなので、
アセンブラ上で_exitのところまで行って止まります。
このとき、Teratermを見てみると、"Hello World"が表示されているはずです。
今回はここまで
思ったより長くなってしまいました。
更新も遅くなってしまった…