Kyoto Maker

Software & Hardware Laboratory Found In Kyoto, 2015.

Helioボード同梱のLED制御Webアプリを動かす

はじめに

前回は、HelioボードでLinuxをブートできるようにしました。 今回は、Helio SDイメージに同梱されている、LED制御Webアプリを動作させます。LED制御デモを動作させるのにGolden Hardware Reference Design (GHRD)が必要になるのですが、その理由を明らかにします。 Qsysを用いてGHRDでARMプロセッサとオンボードのLEDがどのようにインターコネクトされているのかも確認します。

Golden Hardware Reference Design (GHRD)の入手

Helio Resources for Rev.1.4にあるhelio_ghrd_5csxc5_v14.0.zipをダウンロードし、展開します。

FPGAへのGHRDの書き込み

GHRDのoutput_filesディレクトリにはhelio_ghrd_top.sofがすでにあります。 ですので、ビルド工程をスキップしてFPGAにhelio_ghrd_top.sofを書き込みできます。 今回は同梱のSOFファイルを用いてFPGAに書き込んでみます。(時間短縮の意味でも楽です)

HelioをONにしてオンボードUSB Blaster IIにUSBケーブルを接続した状態で以下の手順を実施します。

  1. Quartus IIを起動します。
  2. File -> Open Projectを選択します。
  3. 展開したzipファイルのトップディレクトリにある「helio_ghrd_top.qpf」を選択します。
  4. Tools -> Programmerを選択します。
  5. Hardware SetupでHelioを選択します。
  6. Auto Detectを選択します。 7.「5CSXFC5C6」を選択します。
  7. 「5CSXFC5C6」を選択し、Deleteキーを入力します。SOCVHPSだけが残った状態にします。
  8. Add Fileを選択します。helio_ghrd_5csxc5_v14.0/output_files/helio_ghrd_top.sofを選択します。
  9. Startを選択します。
  10. 正常に書き込まれたら、Progressが100%になります。

成功すると、LEDがウエーブのように点灯します。

Linuxの起動

Helioの電源を入れた状態で以下の手順を実施します。

  1. USBケーブルをUARTに接続しなおします。
  2. LANケーブルを接続します。
  3. Tera Termでシリアル接続します。
  4. Warm Resetボタン(SW6)を押します。HPSにリセットがかかってLinuxが起動します。

LED制御デモ

ブラウザからHelioのIPアドレスにアクセスします。 アクセスしたページにLED制御デモがあるので試してみます。 LEDのウエーブの速さを変更したり、特定のLEDを点灯/消灯したりできます。

Webアプリと言ってもシンプルで、シェルスクリプトベースのCGIで組まれていて、LED制御プログラムをCGIから叩く仕組みになっているようです。

root@socfpga:/www/pages/cgi-bin# ls
blink          index.sh       scroll_client  scroll_server  toggle

ちなみに、このディレクトリにある「blink」バイナリに対してstringsをかけてみると、「/sys/class/leds/fpga_led%d/」のような文字列が見つかります。 これから推測すると、おそらく、LEDを制御するデバイスドライバが別にあって、Sysfs経由でLED制御できるようにしてあるのだと思います。

root@socfpga:/www/pages/cgi-bin# strings blink
/lib/ld-linux-armhf.so.3
libpthread.so.0
_Jv_RegisterClasses
__gmon_start__
libc.so.6
sprintf
fopen
abort
fgets
fputs
fclose
fwrite
atoi
strcmp
__libc_start_main
GLIBC_2.4
xg{o
x`9`
x`9`H
?0F9FBF
/sys/class/leds/fpga_led%d/trigger
Failed to open the file %s
/sys/class/leds/fpga_led%d/brightness
none
--help
Usage %s: <LED number> <Blink delay (in ms)>
Invalid LED number. Valid LED range is 0-3
Invalid blink delay.
/home/root/.altera/frequency_fifo_scroll
Failed opening fifo frequency_fifo_scroll
/home/root/.altera/get_scroll_fifo
Failed opening fifo get_scroll_fifo
LED is scrolling.
Disable scroll_client before changing blink delay
/sys/class/leds/fpga_led%d/delay_on
/sys/class/leds/fpga_led%d/delay_off
timer

なぜGolden Hardware Reference Design (GHRD)が必要なのか?

GHRDにはHelioボードのHPS、LEDやボタンなどのサブシステム間のインターコネクトに関する情報などが入っていて、これをFPGAに書き込むことで、配線情報に従って結線されます。 つまり、LED制御デモが動かなかった原因は、GHRDをFPGAに書き込まないと、何も結線されていないので、ARMプロセッサからLEDが見えないため、ということになります。

Qsysによるインターコネクトの確認

GHRDのインターコネクトはQsysで確認できます。

  1. Qsysを起動します。
  2. helio_ghrd_5csxc5_v14.0/soc_system.qsysを選択します。

hps_0は、ARMプロセッサのインタフェースです。 led_pioは、LED制御用のパラレルインタフェースです。 hps_0のh2f_lw_axi_master(※)とled_pioのs1が結線されていることがわかります。これは、つまり、ARMプロセッサからMemory-mapped I/Oでパラレル接続されているLEDを制御する、ということを意味しています。

※h2fとはHPS to FPGAのことで、信号の方向を表現しています。

led_pioはPIOコアと呼ばれるIPコアを用いています。詳細仕様は、led_pioをダブルクリックして、Detailsボタンを選択するとデータシートへのリンクがあるので、そちらを参照します。

led_pioのパラメータを確認すると、Widthが4になっているので、4bitのパラレルインタフェースであることがわかります。制御対象のオンボードLEDの個数と一致しています。

f:id:fixme:20150112121656p:plain

おわりに

LEDをCGIから制御するデモが動きました。 QsysでGolden Hardware Reference Desigのインターコネクトを確認することで、Helioボード同梱のLED制御デモでは、ARMプロセッサからMemory-mapped I/OでLEDを制御していることがわかりました。今回の経験から、ARMプロセッサとFPGAの世界をつなぐ手法としてMemory-mapped I/Oの理解がポイントになりそうです。

HelioボードでLinuxをブートする

はじめに

Helioボードは、FPGAとARMプロセッサが同居しており、Linuxをブートできます。 今回はHelioボードでLinuxをブートできるようにします。 HelioボードにLAN接続することで、同梱のWebサーバやsshdにPCからアクセスできるようになります。

準備

以下を事前に用意しておきます。

  • SDカードリーダー
  • LANケーブル

このSDカードリーダーは、SDカードアダプタを使わなくてもMicro SDカードを直接読み書きできるので便利です。

f:id:fixme:20150111225024j:plain

LANケーブルは、必須ではありませんが、HelioのLinuxイメージにデフォルトでセットアップされているWebサーバとsshdサーバ試したいので用意することにしました。

Win32DiskImagerのインストール

MicroSDブートディスクを書き込むために必要になるのでインストールしておきます。 こちらからダウンロードしました。

Tera Termのインストール

シリアル接続するためにTera Termが必要になるのでインストールしておきます。

USB⇔シリアル接続のためのデバイスドライバのインストール

こちらからダウンロードしました。 64ビット環境なので、展開したzipファイルに含まれるCP210xVCPInstaller_x64.exeを実行します。

MicroSDブートディスクの作成

Getting Startedの「3. Creating a MicroSD boot disk from pre-built ALL in One Image」参考にMicroSDブートディスクを作成します。

Macnica Helio SoC Evaluation Kitからリンクされているhelio_gsrd_sdimage_v3.13.tar.gzが最新のようなので、こちらを使用します。

アーカイブを展開してイメージファイルを抽出します(cygwinを使いました)。2GBと結構大きいです。

$ tar zxvf helio_gsrd_sdimage_v3.13.tar.gz
helio_gsrd_sdimage_v3.13.img

$ ls -lh helio_gsrd_sdimage_v3.13.img
-rw-r--r--+ 1 yoshinori None 2.0G 9月   4 16:27 helio_gsrd_sdimage_v3.13.img

Win32DiskImagerを起動して、イメージファイルを書き込みます。

f:id:fixme:20150111225230p:plain

各種接続の準備

HelioボードのPowerスイッチがOFFになっていることを確認して以下の通り機材を準備します。

DCジャックに電源ケーブルを接続します。

SDカードを挿入します。

LANケーブルを接続します。DHCPからIPアドレスをアサインしてもらうため、WiFiルーターのLANポートと接続しました。

f:id:fixme:20150111231720j:plain

USBケーブルは、J9 (UART)に接続します。ここでPCがデバイスを認識します。

f:id:fixme:20150111225237p:plain

Tera Termを起動し、COM5のBaud Rateを115200にして接続します。

Linuxのブート

HelioボードのPowerスイッチをONにするとTera TermにLinuxのブートシーケンスが表示された後にログイン受付状態になります。

Poky 8.0 (Yocto Project 1.3 Reference Distro) 1.3 socfpga ttyS0

socfpga login:

IPアドレスDHCPからアサインされているのを確認しました。

root@socfpga:~# ifconfig
eth0      Link encap:Ethernet  HWaddr a2:83:a1:16:02:17
          inet addr:192.168.11.7  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1240 (1.2 KiB)  TX bytes:1248 (1.2 KiB)
          Interrupt:152

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

PCのブラウザから「http://192.168.11.7」(もちろん環境に依存します)にアクセスするとデモページが表示されました。

また、sshdが動いているので、Helioにsshで接続できることを確認しました。

おわりに

実はHelioボード上のWebデモページにLEDの制御のデモがあります。 これはWebアプリ(CGI)からFPGA側のLEDを制御するというもので、大変興味深いです。 しかし、残念ながら、今回の手順だけでは動きません。 Golden Hardware Reference Design (GHRD)をFPGAに予め書き込んでおく必要があります。 詳しくは次回紹介したいと思います。

HelioボードでFPGAによるLチカ

はじめに

FPGAに入門するため、Macnica Helio SoC評価ボードを購入しました。 今回はHelioボード内蔵のプッシュボタンとLEDを用いてブッシュボタンのON/OFFに応じてLEDを点灯してみます。

完成すると以下のような動作になります。

HelioボードでFPGA入門する人向けのまとまった良い情報が無かったので、詳しく記録に残しました。これからHelioボードでFPGAに入門する方などの参考になれば幸いです。

購入したHelioボード

Macnicaオンラインストアで購入しました。 税込みで28,000円ほどでした。 ACアダプターとUSBケーブル、8GB Micro SDカード、SDカードアダプタが付属しています。

f:id:fixme:20150110223530j:plain

準備

ボードのリビジョン確認

まず、ボードのリビジョンを確認します。Helioボードはこれまでに何回かリビジョン更新されているようです。ボードにシールが貼ってあり、それを見るとRev.1.4と書かれていました。この記事を書いている時点ではRev. 1.4が最新のようです。Rev 1.4の情報は、Helio Resources for Rev.1.4にまとまっています。

ボードレイアウト確認

Getting Startedでボードレイアウトを把握します。

良く見るとUSBポートが2つあります。Getting Startedの「2.2 External Connection」よると、用途は、

  • J9: U-Boot/Linuxシリアルコンソール用
  • J11: FPGAプログラミングとARMコアのデバッグ

とのことです。

今回は、FPGAプログラミングをしたいので、後者のJ11のUSBポートに付属USBケーブルでPCを接続します。

その他ジャンパやDIPスイッチは、デフォルトのままにしておきます。

今回は、とりあえずFPGAのプログラミングが試せれば良いので、Getting Startedに記載されている以下のステップは省略します。

  • Creating MicroSD boot disk for Helio Board
  • Running Linux on Helio Board

ソフトウェアのセットアップ

Quartus II 14.1 Web Editionをセットアップします。Devicesには、Helioボードに搭載されているCyclone Vだけ動作すれば良いので「Cyclone V device support」以外のチェックは外します。 セットアップの終盤でAltera USB-Blaster IIをインストールするか聞かれるのでインストールしておきます。

作るもの

ボード内蔵のプッシュボタン2個とLED2個を使います。 プッシュボタンをA、Bとし、LEDをX、Yとすると、A and Bの時Xが点灯、A or Bの時、Yが点灯、となるようなものを作ります。

実装

ここから実装作業に入ります。

プロジェクトの作成

  1. Quartus IIを起動します。
  2. File -> New Project Wizard を選択します。
  3. Nextを選択します。
  4. 以下を入力して、Nextを選択します。
  5. Directory: C:/work/sample
  6. Name: SAMPLE
  7. Top-Level Entity: SAMPLE
  8. Empty projectのままNextを選択します。
  9. Add FilesはそのままNextを選択します。
  10. Family & Device SettingsはName FilterにFPGAチップの型番「5CSXFC5C6U23C7」を入力してNextを選択します。
  11. EDA Tool SettingsはそのままNextを選択します。
  12. 内容を確認して、問題なければFinishを選択します。

コーディング

FPGA関連の書籍ではじめて買ったはじめてのFPGA設計VHDLで記述されていたので、VHDLを使います。

C:/work/sample/以下に空ファイルのsample.vhdを作成します。 Project NavigatorからFilesタブを選択し、Filesを右クリック->Add/Remove Files in Projectを選択します。 sample.vhdを選択して、追加します。

以下のコードを入力します。はじめてのFPGA設計のP29のリスト4-1のコードを使いました。

library ieee;
use ieee.std_logic_1164.all;

entity SAMPLE is
    port( A, B: in std_logic;
          X, Y: out std_logic );
end SAMPLE;

architecture RTL of SAMPLE is
begin
    X <= A and B;
    Y <= A or B;
end RTL;

コンパイル

Processing -> Start Compileを選択します。 処理が完了するまでしばらくかかります。 Intel Core i7 870 @ 3GHzで3分弱かかりました。

導入したQuartus IIがWeb Editionのためか、以下の警告が表示されます。

「Warning (20028): Parallel compilation is not licensed and has been disabled」

ピンの割り付け

コンパイルが完了すると、ピンの割り付けができるようになります。 sample.vhdに記述した、A、B、X、YにFPGAのピンに割り当てる作業になります。

ここでReference Manualを確認します。

「4.7.1 User-Defined push button」と「4.7.3 User-Defined LEDs」に、プッシュボタンとPin番号の情報が載っています。

  • SW11 -> Y4
  • SW12 -> Y8
  • LED3 -> U9
  • LED4 -> AD4

SW11をA、SW12をB、LED3をX、LED4をYと対応づけることにします。

ちなみに回路図が気になるなら、Schematicを確認します。Reference Manualに記載された仕様の通り結線されていることがわかります。

Assignments -> Pin Plannerを選択します。

AをY4にドラッグ&ドロップします。すると、AのLocationがPIN_Y4に設定されます。 残りも同様の作業を繰り返します。

すべての割り付け作業が完了すると、以下のようになります。

f:id:fixme:20150111001147p:plain

未使用のピンの処理

はじめてのFPGA設計によると、未使用のピンを処理しておかなないと、思わぬ誤動作やデバイスを破壊する恐れがあるとのことなので、設定しておきます。

  1. Assignments -> Deviceを選択します。
  2. Name FilterにFPGAチップの型番「5CSXFC5C6U23C7」を入力します。
  3. Device and Pin Optionsを選択します。
  4. Unused Pinsを選択します。
  5. As input tri-statedを選択します。
  6. OKを選択します。

フィッティング

Processing -> Start Compileを選択します。コンパイルの手順と同じですが、今回はピンの割り付けも加味されます。ここでも前回同様に3分弱かかりました。

FPGAに書き込む

手順を以下に示します。試行錯誤で見つけた手順なので変なやり方をしてるかもしれません。

  1. USBケーブルとDCケーブルを接続します。Power SwitchをONにします。PCがHelioを認識します。
  2. Tools -> Programmerを選択します。
  3. Hardware Setupを選択します。(3~5は1度だけでOK)
  4. Currently selected hardwareに「Helio [USB-1]」を選択します。
  5. Closeを選択します。
  6. Auto Detectを選択します。
  7. 「5CSXFC5C6」を選択します。
  8. 「5CSXFC5C6」を選択し、Deleteキーを入力します。SOCVHPSだけが残った状態にします。
  9. Add Fileを選択します。C:/work/sample/output_file/SAMPLE.sofを選択します。
  10. Startを選択します。
  11. 正常に書き込まれたら、Progressが100%になります。

参考に設定画面のキャプチャを載せます。

f:id:fixme:20150111004936p:plain

動作確認

期待する動作になることを確認します。ボードの電源を落とすとFPGAに書き込んだプログラムは消えます。

おわりに

FPGAをさわるのは今回がはじめてですが、なんとかLチカできました。