FPGA開発環境をクラウド化した話

## 要約

Googleクラウド上の仮想マシンでAltera Quartus PrimeによるFPGA開発＆ビルドを行い、手元のFPGAボードとVPN経由でUSB接続して動かした話。4コア＋15GBメモリの開発環境を1時間あたり50円以下で使え、使わないときはOFFにしておけて便利。

![IMG_0292.JPG](https://qiita-image-store.s3.amazonaws.com/0/38290/b49ca2ca-c599-7777-0144-aa773b2d5305.jpeg)
DE0-Nano-SoCにブレッドボードと7セグ乗せたところ

### 3/11追記

keiさん情報によると、Xilinx Vivadoだと[ちょっと工夫するだけで同様のことができる](http://masahir0y.blogspot.jp/2014/01/vivado-fpga.html)らしい。最初っからX使っとけって話か。。

## いきさつ

ひさびさにFPGAをさわりたくなって[DE0-Nano-SoC](http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=163&No=941&PartNo=1)を買ったのだけど、開発環境である[Quartus](https://www.altera.co.jp/products/design-software/fpga-design/quartus-prime/overview.html)を動かすマシンをどうしようかと考えた。FPGAのビルドっておそろしく重いので、最低でも4コア＋8GBメモリ程度のマシンが必要となる。

とはいえ、土日にちょろっと使う程度だし、もはや物理マシンを買って自宅に置いたりしたくない。クラウドの仮想マシンでQuartus動かしたい！　というのがきっかけ。

## GCEインスタンスの用意

まずはクラウド上に仮想マシン（インスタンス）を作成する。今回はGoogle Cloud Platformの[Google Compute Engine (GCE)](https://cloud.google.com/compute/)を使った。GCEのインスタンス作成方法については[こちら](https://cloud.google.com/compute/docs/windows-quickstart)を見ていただくとして、今回は以下のような構成のインスタンスを作った。

![Screen Shot 2016-03-09 at 1.00.29 PM.png](https://qiita-image-store.s3.amazonaws.com/0/38290/98787379-973b-08f4-5503-fe8607d5e77c.png)

- Windows Server 2012 R2 Datacenter Edition
- CPU: 4コア
- メモリ: 15GB
- ストレージ: 100GB SSD
- ゾーン: asia-east1-c

これまでずっとWindows環境でQuartusを使ってきたのと、リモートデスクトップ接続が簡単なので、今回はWindowsを選んだ。ただし、OSライセンスが月額$116.8かかるので、Linuxを選べばもっと安くなる（ただし、VNCによるリモートデスクトップ設定がちょっと面倒）。

## Quartus Prime Lite Editionのインストール

GCE上のWindows環境とRDPでリモートデスクトップ接続を行い、デスクトップを開く。つづいてAlteraのダウンロードサイトからQuartus Prime Lite（無償版）をダウンロードしてインストール。これ、5GBあるので、2時間くらいかかった。

![Screen Shot 2016-03-09 at 1.33.59 PM.png](https://qiita-image-store.s3.amazonaws.com/0/38290/feb0d9cb-0d40-9148-0f7b-f1c98f33625b.png)
GCE上でQuartusを動かす

## Atlas SoCを試すも、断念

さて問題は、手元のFPGAとクラウド上のQuartusをどうやってつなぐかだ。普通はFPGAボードのUSBポートとPCをつないで、QuartusのProgrammerから設定データを流す。これをクラウド経由で実現したい。

Alteraが最近出している新しいSoC開発環境、[Atlas SoC](http://qiita.com/yukitaketake/items/96f9fd8607cc1f3c8e7c)では、FPGAの設定データをSDカードイメージとしてビルドできるので、クラウドでビルド→手元のFPGAにSDカードを挿して動かす、って流れが可能なはず。そこでちょっと試してみたけど、[ビルドのエラーをどうしても解消できない](http://qiita.com/kazunori279/items/a77133e5fdf1da305253)。あきらめた。

## USBデバイスサーバー＋VPNで行くことにした

そこで今回は手っ取り早く、バッファローの[USBデバイスサーバー](http://www.amazon.co.jp/dp/B00428M176)をポチって、FPGAボードにつないだ。あとは、クラウド上のGCEインスタンスと自宅LANの間をVPNで結ぶというもくろみ。

![Screen Shot 2016-03-09 at 1.52.53 PM.png](https://qiita-image-store.s3.amazonaws.com/0/38290/89f5af71-7bc4-a947-3357-847ed226043d.png)

もしくは、[RasPiにVirtualHereとVPNを乗せる方法](http://higehige4.blogspot.jp/2015/02/raspberry-pivirtual-hereusb-over-ip.html)を使えばさらに安く上げられるかも。

## SoftEtherでVPN構築

VPNの構築にはこれまで何回か使ったことのある[SoftEther](http://www.softether.org/)を使用することに。

### GCE上にSoftEther VPN ServerとClientを作成

SoftEtherでVPNを構築するには、VPN Server上に仮想ハブを作成して、そこへVPN ClientやVPN Bridgeを接続してネットワークを構成する。まずは、GCE上にVPN Serverをインストール、仮想ハブを作成する。

![Screen Shot 2016-03-09 at 1.59.00 PM.png](https://qiita-image-store.s3.amazonaws.com/0/38290/1dbfd58c-ea69-4740-8ba8-755026aaccd8.png)

さらに、GCPの管理コンソールで`Network` - `Firewall rules`を選択し、SoftEtherが使うTCPポートの穴を開けておく。

![Screen Shot 2016-03-09 at 2.00.07 PM.png](https://qiita-image-store.s3.amazonaws.com/0/38290/ecba76a4-b5e0-aaa2-98fc-28c820235de8.png)

さらに、GCEにはVPN Clientもインストールする。これで、GCE自体も仮想ハブに1台のマシンとして接続できる。

これでクラウド側のVPN設定はOK。

### 自宅のWindowsマシンにVPN Bridgeをインストール

一方、自宅側にはUSBデバイスサーバーとVPN間を中継するVPN Bridgeを用意する。そのためにはVPN Bridgeをインストールできる適当なマシンが1台必要となるのだけど、今回は手っ取り早く[安いスティック型のWindows PC](http://www.amazon.co.jp/dp/B01A69Y6KO)をポチることにした。LinuxやMacでも行けるはずだ。

![Screen Shot 2016-03-09 at 2.02.50 PM.png](https://qiita-image-store.s3.amazonaws.com/0/38290/5acacfdb-754f-ddef-6d1b-41260adea071.png)

このWindows PCにVPN Bridgeをインストールして、先ほどの仮想ハブに接続する設定を行う。

![Screen Shot 2016-03-09 at 2.08.15 PM.png](https://qiita-image-store.s3.amazonaws.com/0/38290/df272bf3-456b-d268-2576-5486b5ed57a6.png)

自宅からGCE、およびGCEから自宅へpingしてみて、VPNが開通していることを確認。

## QuartusのProgrammerから使ってみる

GCE上でUSBデバイスサーバーの管理ツールを起動すると、DE0が認識された！

![Screen Shot 2016-03-09 at 2.09.58 PM.png](https://qiita-image-store.s3.amazonaws.com/0/38290/f3b6c027-355a-a9e2-d0c8-d13ba644c9af.png)

さっそく使ってみよう。QuartusでLチカのコードを書いてビルドする。ちなみにQuartus Prime Liteでは3コアしか使えない制限があるらしい。有償版なら、もっと多くのコアを使ったビルドもできるはず。

Programmerで`Auto Detect`をクリックしてデバイスが認識されるのを待つ。出てきた出てきた。

![Screen Shot 2016-03-09 at 2.11.28 PM.png](https://qiita-image-store.s3.amazonaws.com/0/38290/7ff09ec9-329d-5789-244a-ff2e6cb4a032.png)

`Start`ボタンをクリックすると、`Successful`と表示され、手元のFPGAのLEDがチカチカした。やったぜ！

## クラウドでFPGA開発しようぜ！

クラウドならば、1時間あたり50円以下で快適なFPGA開発環境を利用できる。プロフェッショナルな方はビルドに一晩かけたりされてるので、例えば16コア＋50GBくらいの大きなインスタンスタイプを使えばビルド時間を短縮できるはず。使わないときは仮想マシンを止めておけばほとんどコストはかからないし。クラウドでFPGA開発やりましょう。

---
Disclaimer この記事は個人的なものです｡ここで述べられていることは私の個人的な意見に基づくものであり､私の雇用者には関係はありません｡