タグ別アーカイブ: zybo

ZyboをTutorialで試す 番外編3 Debian起動

前回作成したmicroSDからDebianを起動します。

  1. J4にmicroSDを挿入
  2. JP5を "SD" に変更
  3. J11にmicroUSBケーブルを接続、もう片方の端をPCに接続
  4. J3にLANケーブルを接続
  5. J15に5V 3AのACアダプタを接続
  6. SW4で電源ON
  7. PCでTera Term等を立ち上げ、COMポートを指定して接続
  8. ブートメッセージが表示され、rootユーザで自動ログインすることを確認

となれば成功です。COMポート番号はWindowsのデバイスマネージャで確認できます。ifconfigコマンドを見るとDHCPからIPアドレスを取得できていることが分かります。

ただ、このまま使うにはいくつか課題が残っています;

  • 起動時の立ち上げに失敗しているデーモンがあるっぽい
    • acpidの起動後、一時的にメッセージが文字化けを起こしてた?
  • 時計が狂っている (要NTPクライアント)
  • /etc/resolv.confがない
  • rootユーザで自動ログインしたくない

/etc/resolv.confについては(乱暴ですが)手動でnameserver 8.8.8.8とか設定してしまえば解決します。DNSが引けるようになったらapt-getで最新のパッケージに更新できます。まずはNTPクライアント(ntpdate等)を入れておきましょう。不要なデーモンはパッケージごと削除してよいと思います。その次に日本語化でしょうか。この辺の作業はまた別途整理します。

ZyboをTutorialで試す 番外編2 microSDの作成

前回の続きです。チュートリアルはまだこの先がありますが、ここから脱線します。チュートリアルではram diskを使うようにしていますが、microSDのパーティションを切って、Debianを入れてみようと思います。

参考にするのは、今回もFPGAの部屋です。

まずmicroSDカードを用意します。class 10で8GBもあれば十分だと思いますが、32GBのが手元にあったのでこれを使います。gpartedやcfdisk等を使って、ブート用の基本パーティションに1GB割り当て、残りをrootfs用の基本パーティションに割り当てました。私の環境ではそれぞれ/dev/sdb1と/dev/sdb2になりました。

ブート用のパーティションはWindowsからも読み書きできる必要があるのでFAT32、rootfsはLinuxから読めれば問題ないのでext4でフォーマットします。ラベルは前者をZYBO_BOOT, 後者をrootfsとしました。

これまでの作業で作成済みのuImageBOOT.binをZYBO_BOOTパーティションにコピーします。

Linux KernelソースのあるLinux-Digilent-Devの下、arch/arm/boot/dtsにあるデバイスツリーのソースファイルzynq-zybo.dtsを修正します。bootargsはLinuxブート時のカーネルオプション、operating-pointsは動作周波数とコア電圧の組み合わせだそうで、この値を修正しない時計が狂うとのこと。修正が済んだらscripts/dtc/dtcコマンドで変換します。

$ cd arm/boot/dts
$ cp zynq-zybo.dts zynq-zybo.dts.orig
$ vi zynq-zybo.dts
...
 /* bootargs = "console=ttyPS0,115200 root=/dev/ram rw earlyprintk"; 下記のように変更 */
 bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfs=ext4 rootwait devtmpfs.mount-1";
...
 /* operating-points = <666667 1000000 333334 1000000 222223 1000000>; 下記のように変更 */
 operating-points = <650000 1000000>;
...
$ ../../../../scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb zynq-zybo.dts

生成されたdevicetree.dtbはmicroSDのZYBO_BOOTパーティションにコピーします。さらに、u-bootの設定ファイルuEnv.txtを作成します。

$ vi uEnv.txt
uenvcmd=fatload mmc 0 0x03000000 uImage && fatload mmc 0 0x02A00000 devicetree.dtb && bootm 0x03000000 - 0x02A00000

これもmicroSDのZYBO_BOOTパーティションにコピーします。この時点でZYBO_BOOTパーティションには以下のファイルが配置されているはずです;

  • BOOT.bin
  • uImage
  • devicetree.dtd
  • uEnv.txt

以上でブートのための準備は完了です。次にrootfsを用意します。rootfsには選択肢がいくつかあります;

  • どこの配布物を使うか? Linaro / ARMhf / etc...
  • どのディストリビューションにするか? Debian / Ubuntu / etc...
  • どのイメージ(パッケージ)を使うか? nano / developer / alip / etc...

今回は、Linaroの配布するDebian 8.3のdeveloperイメージの最新版を利用することにしました。普通にtarで展開するとbinaryディレクトリが生成されるので、これを削除するために "--strip-components=1" を渡します。展開先のmicroSDのrootfsパーティション (ここでは/media/USERNAME/rootfs) は環境に合わせて適宜変更して下さい。

$ wget https://releases.linaro.org/debian/images/developer-armhf/latest/linaro-jessie-developer-20160126-11.tar.gz
$ sudo tar --strip-components=1 -C /media/USERNAME/rootfs -xzvpf linaro-jessie-developer-20160126-11.tar.gz
...

これでmicroSDから起動する準備が完了しました。

ZyboをTutorialで試す その7 uImageの生成

前回の続きです。引き続きTutorialFPGAの部屋を参考にします。

ここからまたLinuxに戻り、Linux Kernelをリビルドします。まずはkernel sourceをgit gloneしてきます。ここでもmaster-nextブランチです。また、ほぼ1GBあるので時間が掛かるのでご注意下さい。DLが済んだらmakeしていきます

$ git clone -b master-next https://github.com/DigilentInc/Linux-Digilent-Dev.git
...
$ cd Linux-Digilent-Dev
$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- xilinx_zynq_defconfig
...
$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-
...

ビルドに足りないツールがあった場合はコンパイルエラーになります。私の環境では bc コマンドを追加でインストールしました。Debianであれば事前にkernel-packageを入れておけば無難かも知れません。

$ sudo apt-get update
$ sudo apt-get install bc
...
$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-
...

インストール後に再度makeを実行しましょう。私の手元の環境では約20分でビルドが完了しました。ビルドしたイメージは arch/arm/boot/zImage として生成されています。

次にuImageを生成しますが、それにはmkimageコマンドが必要です。mkimageが見つからない場合は、以前u-bootをコンパイルしたディレクトリ内のtoolsディレクトリにPATHを通します (ディレクトリは環境に合わせて適宜変更して下さい)。

$ export PATH=$PATH:~/zynq/u-boot-Digilent-Dev/tools
$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- UIMAGE_LOADADDR=0x8000 uImage

arch/arm/boot/uImageが生成されました。

ZyboをTutorialで試す その6 BOOT.binの生成

続きです。引き続きTutorialFPGAの部屋を参考にします。

ここからまたWindowsに戻ります。Vivadoでzybo_bsd.xprを開きます。FileメニューからExport→Export Hardwareを選択するとExport Hardwareダイアログが表示されます。Include bitstreamにチェックを入れてOKをクリックします。

続いてFileメニューからLaunch SDKを選択します。Launch SDKダイアログが表示されるので、デフォルトのままOKをクリックします。しばし待つとEclipseベースらしきSDKのIDE (GUI)が立ち上がります。セキュリティの確認ダイアログが表示された時はプライベートネットワークのアクセスを許可して下さい。

SDKの真ん中のペインにsystem.hdfが表示されていると思います。Address Mapの一覧にmyLed_0があることが確認できます。

FileメニューからNew→Application Projectと選択すると、Application Projectダイアログが表示されます。Project Nameに "FSBL" と入力し、他の項目はデフォルトのままNextで次へ進みます。Template一覧からZynq_FSBLを選択し、Finishをクリックします。しばらく待つとSDKの真ん中のペインに system.mss タブが追加されます。

さて、ここで、電源on/offの前後でもZyboのMACアドレスが変わならいようにするため、ファイルを一つ差し替えます。Zynq Base Systemのsource/vivado/SDK/fsbl/fsbl_hooks.cを適当なエディタで開いて全体をクリップボードにコピーします。続いてSDKの左側ペインからFSBL→src→fsbl_hooks.cと選択してファイルを開き、全体を選択して丸々ペーストして保存します。

編集後の保存時に自動でリビルドされますが、気になるようであればProjectメニューからClean...を選択し、表示されたダイアログのOKをクリックするとクリーン後に自動ビルドされます。ビルドされたファイルは source\vivado\hw\zybo_bsd\zybo_bsd.sdk\FSBL\Debug\FSBL.elf として出力されています。

SDK左側ペインのProject ExplorerからFSBLを右クリックし、Create Boot Imageを選択すると、Create Zynq Boot Imageダイアログが表示されます。Boot image partitions一覧にデフォルトでFSBL.elfとsystem_wrapper.bitは入っていますので、右側のAddボタンでAdd partitionダイアログを開き、LinuxでビルドしてWindowsにコピーしてきたu-boot.elfを選択します。Partition Typeが(デフォルトの)datafileになっていることを確認してOKでダイアログを閉じ、Boot image partitions一覧にu-boot.elfが追加されたことを確認します。

Output pathのBrowseボタンをクリックして出力先をZybo Base Systemのsd_image/BOOT.binに変更し、"Create Image"ボタンでBOOT.binを生成します。

ZyboをTutorialで試す その5 U-Bootのビルド

前々回の続きです。引き続きTutorialFPGAの部屋を参考にします。

LinuxへのSDKのインストールが完了したら、環境変数の設定をしておきます。SDKを使う都度、設定してもよいのですが、 面倒なので ~/.bashrc の末尾に追記しておきます。

$ vi ~/.bashrc
...
source /opt/Xilinx/SDK/2015.4/settings64.sh

2016/02/08追記: この設定を行うと、LD_LIBRARY_PATHも変更されます。その影響で、apt-get等の一部のコマンド実行時にリンカのエラーが表示されるようになります。ご注意下さい。

続いて、ビルドに必要なコマンド, パッケージ類をインストールしましょう。ビルドに必要なmakeの他に、64bit環境で32bitアプリを動かすためのライブラリも必要です (SDK同梱のバイナリは64bit版ではなく32bit版のようです)。これをしないと、クロスコンパイラはインストールされてあるのに "no such file or directory" のようなエラーが吐き出されます。

$ sudo apt-get update
$ sudo apt-get install make
...
$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get install libc6:i386

では、U-Bootのコンパイルを行います。チュートリアルのセクション名にもあるように、master-nextブランチからgit cloneしてくるのがポイントです。

$ git clone -b master-next https://github.com/DigilentInc/u-boot-Digilent-Dev.git
...
$ cd u-boot-Digilent-Dev
$ make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_zybo_config
...
$ make CROSS_COMPILE=arm-xilinx-linux-gnueabi-
...

特にエラー等が表示されずにmakeが終了されたらu-bootのコンパイルに成功しています。makeを実行したディレクトリ内にu-bootが生成されていると思います。これをZybo Base Systemの中のsd_imageディレクトリに u-boot.elf というファイル名でコピーしておきます。

ZyboをTutorialで試す 番外編1 Vivadoセットアップ(Debian)

番外編(?)です。

前回、ビットストリームを生成できましたので、次はU-Bootのコンパイルなのですが、ここからはLinuxのクロス環境で作業します。Debian testing環境上にVivado WebPACKをインストールしようとしたところ、64bit環境なのが正しく検出されずインストールできません。

これに対応するには、インストーラの起動オプションに--confirmを付けて、展開されたインストールスクリプトを手動で編集する必要があります。詳細はXilinxのフォーラムを参照して下さい。

2016/02/07追記: sudoでrootとしてインストールするとMATEのアプリケーション一覧に登録されないので、sudoを使わず一般ユーザ権限でインストールするように変更しました;

$ chmod +x ./Xilinx_Vivado_SDK_2015.4_1118_2_Lin64.bin
$ sudo chmod 777 /opt
$ ./Xilinx_Vivado_SDK_2015.4_1118_2_Lin64.bin
...
ERROR: This installation is not supported on 32 bit platforms.
$ ./Xilinx_Vivado_SDK_2015.4_1118_2_Lin64.bin --confirm
...
About to extract 19 KB in /tmp/xxxxxxxxxx ... Proceed ? [Y/n]
...
OK to execute: ./xsetup   ? [Y/n]

最初の確認メッセージで、インストーラの展開先が分かります。二つ目の確認メッセージでエンターを押して先に進める前に、別のターミナルを開くあるいはCtrl-Zでインストーラを中断して、インストールスクリプトを編集します。

$ vi /tmp/xxxxxxxxxx/xsetup
...
# ERROR out if this installation is running on 32 bit OS
# and does not support 32 bit installation
if [ "$(uname -m)" != "x86_64" ]; then
...

unameコマンドのオプションを -i から -m に変更して保存し、インストーラに戻ってxsetupを実行します。インストーラを進めていくと、インストールするコンポーネントの選択画面が表示されます。どうやらデフォルトでは "Software Development Kit" (SDK)が選択されていませんので、これにチェックを忘れず入れて、インストールを進めましょう。

続きを読む

ZyboをTutorialで試す その4 ビットストリームの生成

前回の続きです。引き続きTutorialFPGAの部屋を参考にします。

zybo_bsd.xprを開いているVivadoの画面に戻り、"Flow Navigator"の"IP Integrator"から"Open Block Design"を選択してダイアグラムを開きます。適当に空いている箇所を右クリックして"Add IP..."を選択するとダイアログが表示されます。検索窓に"my"と入力すると、先ほど作成したmyLed_v1.0が表示されますのでこれを選択し、エンターを押すとダイアグラム上にmyLed_0が追加されます。

先の手順でLEDを削除したあたりにドラッグします。チュートリアルでは "Run connection automation" が表示されるとありますが、表示されませんので、"myLed_0"の"S_AXI"を右クリックして"Make Connection..."を選択します。表示されたダイアログで "M00_AXI" を選択して"OK"をクリックすると、ダイアログ上でも結線されます。

"myLed_0"の"s_axi_aclk"と"s_axi_aresetn"も結線します。ダイアログ上の"myLed_0"のそれぞれから出ている横線の上にカーソルを移動すると鉛筆アイコンになるので、その状態でそれぞれ他のIPのaclkとaresetnが接続されている配線までドラッグして結線します。

ダイアグラム上に残っている"LEDs_4Bits"を右クリック→"Delete"で削除します。

"myLed_0"の"led[3:0]"を右クリックし、"Create Port..."を選択します。デフォルトの入力値のまま"OK"をクリックするとダイアグラムに"led[3:0]"というポートが作成され、"myLed_0"の同名のポートに自動的に接続されます。

※ここの記述はチュートリアルにはありません。この時点で、"myLed_0"にアドレスが割り当てられていないそうです。ダイアグラムのペインの"Address Editor"タブを開いてみますと、確かに"Unmapped Slaves"に表示されています。この"myLed_0"を右クリックして "Auto Assign Address" を選択すると自動でアドレスが割り当てられ、割り当て完了のダイアログが表示されますので"OK"で閉じます。

ここで一旦保存します。

続いて、"Sources"ペインの"Sources"タブを選択して"Constraints"→"constrs_1"→"base.xdc (target)"と選択してbase.xdcをダブルクリックして開きます。右側のペインにソースコードが表示されますので、7行目から11行目の"leds_4bits_tri_o"を"led"に置換します。

set_property PACKAGE_PIN M14 [get_ports {led[0]}]
set_property PACKAGE_PIN M15 [get_ports {led[1]}]
set_property PACKAGE_PIN G14 [get_ports {led[2]}]
set_property PACKAGE_PIN D18 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}]

編集を終えたら保存し、ビットストリームを生成します。"Flow Navigation"ペインの"Program and Debug"にある"Generate Bitstream"を選択します。"No Implementation Results Available"ダイアログが表示されますので"Yes"を選択すると、"Generate Bitstream"ダイアログが表示されてビットストリームの生成が始まります。

少し待つと"Launch Run Critical Messages"ダイアログが表示されますが、気にせず"OK"で閉じます。ここからしばらく時間が掛かります。動いているか分からないと不安な時は、下部ペインの"Log"タブを開いてログを眺めてみましょう。

ビットストリームの生成に成功すると、"Bitstream Generation Completed"ダイアログが表示されます。"Open Implemented Design"にチェックを入れて"OK"をクリックして内容を確認してみます。

ZyboをTutorialで試す その3 IPコアの作成2

前回の続きです。引き続きTutorialFPGAの部屋を参考にします。

edit_myLed_v1_0プロジェクトを開いた状態で Sourcesペインで myLed_v1_0_S_AXI_inst - myLed_v1_0_S-AXI (myLed_v1_0_S_AXI.v) をダブルクリックするとエディタで、myLed_v1_0_S_AXI.vが開かれます。

18行目の "// Users to add ports here" に続けて "output wire [3:0] led, "を追記します。

 // Users to add ports here
 output wire [3:0] led, // 追記
 // User ports ends

393行目の "// Add user logic here" に続けて assign led = slv_reg0[3:0]; を追記します。

 // Add user logic here
 assign led = slv_reg0[3:0]; // 追記
 // User logic ends

上記の編集が終わったら、次はSourcesペインの myLed_v1_0 (myLed_v1_0.v) をダブルクリックしてエディタで開きます。同様に、18行目に追記します。

 // Users to add ports here
 output wire [3:0] led, // 追記
 // User ports ends

51行目に ".led(led)," を追記(挿入)します。

 ) myLed_v1_0_S_AXI_inst (
 .led(led), // 追記 (挿入)
 .S_AXI_ACLK(s_axi_aclk),

続いて、"Flow Manager"ペインの"Project Manager"から"Package IP"を選択します。"Packaging Steps"の"Customization Parameters"を選択して、右ペイン最上部に"Merge changes from Customization Parameters Wizard"というリンクが表示されますので、これをクリックしておきます。"Pack"Ports and Interfaces"を選択して右ペインに"led"があることを確認し、"Customization GUI"を選択して右ペインに今回作成中のIPのGUIが表示されることを確認します。

最後に"Review and Package"を選択します。右ペイン最下部の"Re-Package IP"ボタンを押してIPを作成します。"Finished packaging 'myLed_v1.0' successfully' というダイアログが出たらIPの作成に成功です。"OK"をクリックしてダイアログを閉じます。

ZyboをTutorialで試す その1 Vivadoセットアップ (Windows)

2016/02/08追記: このシリーズの表題を変更しました。

なぜかFarnellにある “Embedded Linux Hands-on Tutorial for the ZYBO”FPGAの部屋を参考に、Zynqをカスタマイズしてみたいと思います。

まずはVivadoをインストールします。インストールの詳細はDigilentのWikiを参考にして下さい。Voucherを使ってDesign Editionを利用する場合は秋月にあるFAQをどうぞ。次に、TutorialにはありませんがBoard Fileをインストールします。詳細は同じくDigilentのWikiを参考にして下さい。基本的にはzipを展開して上書きです。

準備が済んだら、Zybo Base System DesignをDLして(Windowsであれば)Cドライブに展開します。とりあえず今回はC:\local\zybo_base_systemとして配置します。

C:\local\zybo_base_system\source\vivado\hw\zybo_bsd\zybo_bsd.xprをダブルクリックすると、VivadoのOlder Project Versionダイアログが表示されます。"Automatically~" にチェックが入っているのを確認して "OK" をクリックすると、 "Open Project" ダイアログに続いて "Default Library"ダイアログが表示され、"OK" をクリックで今度は "Project Upgraded" ダイアログが表示されます。

"Report IP Status"ボタンをクリックすると、Vivadoに "IP Status" ペインがハイライトされて表示されます。ペインの下部にある "Upgrade Selected" ボタンをクリックすると "Upgrade IP" ダイアログが表示され "OK" をクリックします。 "Upgrade IP" ダイアログが表示されて進捗が表示された後に "Critical Messages" ダイアログに "There were six critical warning messages while Upgrade IP." とのメッセージと詳細が表示されます。ここでは "OK" をクリックしてダイアログを閉じておきます。特に問題はないようです。

一旦Vivado終了して、再度zybo_bsd.xprを開きます。

Zybo関連リソースのリンク切れ

Digilentのサイトが微妙に更新されており、いくつかのドキュメントが参照できなくなっていたり、URLが変わっていたりします。基本的にはZybo Resource Centerからリンクされています。

まず、Zybo Base System DesignがDLできなくなっていましたが、2016/02/05から上記リソースセンターから参照できるようになりました。Forumで指摘してくれた方に感謝。

"Embedded Linux Hands-on Tutorial for the ZYBO" は2016/02/05時点で参照できないままになっています。ドラフト版 (HTML版)がinstructables.comにありますが、PDF版のDLには有償のユーザ登録が必要です。最新版か分かりませんが、約1年前の2014/Dec版がfarnellからDLできます。

interface誌2016年2月号Zybo解説記事の配布物はリンク切れしていませんが、Data integrity errorが発生して解凍できないようです。