MAX1000およびCYC1000の使い方

# Arduino MKR標準の小型FPGA評価ボード
Intel(旧ALTERA)のFPGAを搭載した小型のFPGAボードで[MAX1000](https://www.trenz.jp/product/TEI0001-03-08-C8)と、[CYC1000](https://www.trenz.jp/product/TEI0003-02)というものがあります。
Arduino MKR標準という形状だそうです。DIP28ピンのような形状をしているので、ブレッドボードや万能機版に挿して使うこともできます。
PMOD端子も付いているのでFPGA用の簡単なモジュールを付けることもできます。
6個並んだピンはJTAGで、3個並んだピンはアナログ入力ピンのようです。

## CYC1000
CYC1000は、Intel社のCyclone10(10CL025YU256C8G)を搭載したボードで8MB SDRAMを備えていて、NiosIIプロセッサを入れることができます。コンフィグROMのEPCQ16ASI8Nと、3軸加速度センサのLIS3DHも積んでいます。
![CYC1000](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/718859a0-47a0-8549-a22d-a1a44d45611b.png)

## MAX1000
MAX1000は、Intel社のMAX10(10M08SAU169C8G)を搭載したボードで8MB SDRAMを備えていて、やはりNiosIIプロセッサを入れることができます。SPI ROMのW74M64FVSSIQと、3軸加速度センサのLIS3DHも積んでいます。
![MAX1000](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/313ffcee-c2a1-351d-46ec-4320a1b0d8b2.png)

## Trenzか？Arrowか？
これらのボードはArrowとTrenz Electronicという2つの会社のロゴが入っています。

実は、CYC1000には**TEI0003-02**、MAX1000は**TEI0001-03-08-C8**というもう一つの型番があります。おそらくArrow社の型番がCYC1000やMAX1000であって、Trenz社の型番がTEI0003-02やTEI0001-03-08-C8なのだと思います。(TEはTrenzElectronicの意味) Arrowの製品なのかTrenzの製品なのか、はっきりとは分かりません。
※ Arrowというのは、世界最大級の電子部品商社です。

# USBとJTAGの機能
MAX1000およびCYC1000にはUSB(Micro-B)のコネクタが付いていて、その先はFTDI社のFT2232Hにつながっています。そして、FT2232HはUSB-UARTとUSB-JTAGを兼ねています。つまり、1つのUSBコネクタでシリアル通信と、FPGA書き込みの両方ができるようになっています。

ところが、このFT2232Hを使ったUSB-JTAGの仕組みはIntel(ALTERAの頃からの)USB-Blasterとは互換性がなく、そのままではQuartusから認識することができません。

「**USB-Blaster互換ではないからQuartusから使えない**」と誤解されるるかもしれません。
それは**完全なる誤解**です。

以下に示すArrow USB Programmer 2の働きで、Quartusから完璧に使うことができるのです。

## Arrow USB Programmer 2とは
Arrowから、Arrow USB Programmer 2というソフトウェアが提供されています。Arrow USB Programmer 2は、FT2232Hを使ったUSB-JTAGを、Quartusから接続できるようにするためのバックグラウンドで動くソフトウェアです。これを使うとQuartusからFT2232HによるUSB-JTAGが、Arrow-USB-Blasterとして認識できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/b075ef70-bc99-3ec6-6caa-506cef42729e.png)

## FTDIドライバのダウンロードとインストール
FT2232Hを初めて使う方は、FTDI社のD2XXライブラリも必要です。電子工作を常日頃からやっていてFTDIドライバは既に入っているという方は次のステップに進んでください。
[D2XXライブラリのダウンロードページへ](https://www.ftdichip.com/Drivers/D2XX.htm)

## Arrow USB Programmer 2のダウンロードとインストール
このソフトウェアは下記のURLで提供されています。
[Arrow USB Programmer 2のダウンロードページ](https://shop.trenz-electronic.de/Download/?path=Trenz_Electronic/Software/Drivers/Arrow_USB_Programmer)

この中にある最新のLinux版またはWindows版をダウンロードしてインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/c5351ce5-3484-4590-68d7-595b2bdfb4e8.png)

FTDI社のD2XXを入れて、Arrow USB Programmer 2をインストールすれば、Quartusから簡単に認識することができました。本当に何も難しいことはありませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/c1cf731a-63db-a47b-74d9-2a222cc44769.png)

## レジストリの書き換えや、サービスの再起動が必要？
Arrow USB Programmer 2の説明を読んでいると、レジストリの書き換えやサービスの再起動が必要な場合について書いてあります。
[トラブルシューティングの解説書](https://www.trenz-electronic.de/fileadmin/docs/Trenz_Electronic/Software/Drivers/Arrow_USB_Programmer/Arrow_USB_Programmer2-Troubleshooting_Guide_for_WinOS.pdf)

レジストリのHKEY_LOCAL_MACHINE\SOFTWARE\Altera Corporation\JTAGServer\Hardware_Arrow_USB_Blaster を書き換える必要性や、サービスを開いてALTERA JTAG Serverを再起動する必要性について書かれていますが、実際には必要はありませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/c5d7675b-3e9e-e9cc-d218-0c4e32ed53a0.png)

もし、うまく動かないときにはやってみてください。

## それでも外部にJTAGケーブルをつなげたい
もちろん、オンボードのUSB-JTAGを使わずに、ピンヘッダにUSB-BlasterなどのJTAGケーブルをつないで操作することも可能です。下の図はMAX1000のマニュアルの20ページからの引用です。J4につなげばよいようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/85416587-ae01-773e-7acb-7ba8e66bd2a3.png)


## 本当にうまくいくの？
最近、Windows10をインストールしなおしたばかりで、まだFTDIもQuartusも知らないSurfaceに、D2XXドライバとArrow USB Programmer2と、Quartus18.1をインストールして試してみましたが、全く問題なくArrow USB Programmer2を認識してくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/e4764392-5c88-d4f5-8f4b-b8a9b19dd062.png)

# サンプルプロジェクトのビルド
## 必要なQuartusのバージョン
必要なQuartusのバージョンは18.1です。Liteで構いません。
ただし、19.1は未対応のようです。

## サンプルプロジェクトのダウンロード
MAX1000およびCYC1000のサンプルプロジェクトはTrenzElectronic社のWebサイトで提供されています。
CYC1000であれば[このページ](https://shop.trenz-electronic.de/en/TEI0003-02-CYC1000-with-Cyclone-10-FPGA-8-MByte-SDRAM?path=Trenz_Electronic/Modules_and_Module_Carriers/2.5x6.15/TEI0003/Reference_Design/18.1/test_board)のDownloadタブをつつき、Reference_Designの18.1のtest_boardの中にあります。

このページの[TEI0003-test_board-quartus_18.1-20191111104339.zip](http://www.trenz-electronic.de/fileadmin/docs/Trenz_Electronic/Modules_and_Module_Carriers/2.5x6.15/TEI0003/Reference_Design/18.1/test_board/TEI0003-test_board-quartus_18.1-20191111104339.zip)をダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/214bca5e-7aa6-d987-8e35-ef58a7fee831.png)

MAX1000であれば、[こちらのページ](https://shop.trenz-electronic.de/en/TEI0001-03-08-C8-MAX1000-IoT-Maker-Board-8kLE-8-MByte-RAM)の[TEI0001-test_board-quartus_18.1-20191111104348.zip](http://www.trenz-electronic.de/fileadmin/docs/Trenz_Electronic/Modules_and_Module_Carriers/2.5x6.15/TEI0001/Reference_Design/18.1/test_board/TEI0001-test_board-quartus_18.1-20191111104348.zip)です。

## サンプルプロジェクト自体を作る
Trenz社のFPGAのプロジェクトは、Quartusのプロジェクトがそのまま入っているのではなく、Quartusのプロジェクトを生成するためのソースファイルとTclファイルと、バッチファイル（あるいはシェルスクリプト）が入っています。なぜこのような形式になっているのかというと、バージョン管理システムで管理しやすいというのと、配布するファイルサイズを減らすことができるのと、マシン間のポータビリティが向上するためでしょう。CYC1000のプロジェクトはNIOS2のコアが入っているのに763kバイトしかありません。
これはこれで素晴らしい仕組みなのですが、ほとんどの人にとっては初めて見る形式であり、プロジェクトファイルがない！？と驚かせることになります。

MAX1000やCYC1000のプロジェクトを解凍すると、以下のようなフォルダが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/f117b540-38b3-44ee-af51-34f643c4b8d8.png)

最初にやることは_create_win_setup.cmd (Linuxの場合は_create_linux_setup.sh)を実行することです。
すると、次の図のような画面が出ます。ここでは **c** のキーを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/648f0185-d2b8-175c-b5ba-48954223bd98.png)

次に **max** と入力し、ENTERを押します。
> このmaxというのはMAX1000のことではなく、最大限たくさんのコマンドファイルを作るという意味です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/86ef2ef4-197e-268b-0d43-01e1a22ed25c.png)

すると、design_basic_settings.cmdと、quartus_create_project_batchmode.cmdと、quartus_open_existing_project_guimode.cmdという3つのファイルが作られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/04df9853-324a-d5a1-1aed-bc1b10f72bca.png)

## カスタマイズ
まず、design_basic_settings.cmdをメモ帳などで開き、26行目から28行目の

```
@set QUADIR=C:/intelFPGA_lite
@REM -Attention: These scripts support only the predefined Quartus Version. 
@set QUARTUS_VERSION=18.1
```
に書かれているQuartusをインストールしたディレクトリを書き換えます。私はDドライブに大きなHDDをつないでいるので、QUADIR=D:/intelFPGA_liteにしました。QUARTUS_VERSIONは18.1のままにします。

> Quartusのバージョンも変更できるようだったので、Quartus 19.1でやろうとしてQUARTUS_VERSION=19.1にして実行してみたのですが、うまくいきませんでした。現時点(2020/4/15)では18.1専用と考えてください。

## プロジェクトの生成と最初のビルド
quartus_create_project_batchmode.cmd を実行します。エクスプローラからダブルクリックするだけでOKです。

すると、バッチモードでQuartusが動き、TCLが起動してプロジェクトの生成からビルドまで一気に行ってくれます。最初のビルドは10分くらいかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/83ce1def-5946-fd9d-f9b8-76c9b4bfbe7f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/9325cba5-e838-b046-d1d0-0162d2e8eda8.png)

## プロジェクトをGUIモードで開く
最初のビルドが終わったら、quartus_open_existing_project_guimode.cmd をダブルクリックします。同じように緑色のスクリプトが動いて・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/c0fab299-4bc3-aece-ed07-7ee609157bba.png)
いつの間にかQuartusのGUIが開きます。そして、プロジェクトが出来上がっていて、コンパイルまで終わっているというわけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/a01673fe-0206-74a8-2e83-9a656e4fe965.png)

CYC1000の合成結果を見ると、Nios2が入っているのに18%くらいでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/a825498d-f943-35c1-f754-c859336c6eae.png)

プロジェクトはtest_board\quartusフォルダにあるので、2回目からはこのフォルダの中のtest_board.qpfを開くか、quartus_open_existing_project_guimode.cmdをクリックすればよいでしょう。

## FPGAへの書き込み
Quartusの上からProgrammerを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/6cc694c4-f402-a84c-8a9b-0525bb212749.png)
最初からquartus\output_files\test_board.sofが選択されています。Startを押すだけで、何も苦労することなく書き込みできました。書き込み時間は1秒未満でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/919dc379-2d1d-316c-6207-eae1ce31ad69.png)

## コンフィギュレーションROMへの書き込み
コンフィギュレーションROMに書き込むには、Add Fileを選び、ダイアログが開いたらoutput_filesのtest_board.jicを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/348cf3c1-9810-cdc3-1c52-0bb4f9eba28e.png)
FPGAが2つになってしまうので、ROMがつながっていない方をクリックしてDELキーを押して消します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/83c6b089-7282-9e4f-a0d2-286b0c649ea2.png)

FPGAが1個になった状態でStartを押すと、書き込みが行われます。トータルで15秒くらいかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/89a868cb-45bb-17f3-af38-74456a2e3b3d.png)

## USB-UARTはどうなっている？
CYC1000やMAX1000のUSBはFT2232Hでした。USB-JTAGのほかにもUSB-UARTが使えます。
CYC1000の場合、下の図のようなテキストベースのアプリが動いていました。LEDの点灯状態の説明のようです。Spirit levelという状態のときには、オンボードの3軸加速度センサでボードの傾きに応じたLEDの表示になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/bfb5e9d1-9fcb-0b31-5d56-940135d9ae7f.png)

# まとめ
いかがでしたでしょうか？

MAX1000やCYC1000は数1000円と大変安価で、無償のQuartus Lite 18.1を使って開発することができ、
ソフトコアのNios2が入ったサンプルプロジェクトも用意されています。
Arduino MKR標準のピン配置なのでブレッドボードや万能基板にのせて試すことができます。

つまり、初めてIntelのFPGAを触って試してみたいという方にも、
何かに組み込んでみたいという方にも、とてもオススメなのです。

オンボードのUSB-JTAGはUSB-UARTとして1台2役なので、
USBケーブルが1本で良いのもありがたいですね。

## 入手はこちらから
MAX1000とCYC1000は、TrenzElectronic社の日本代理店から購入できます。

* [MAX1000(TEI0001)はこちら](https://www.trenz.jp/product/TEI0001-03-08-C8) &yen;3,680
* [CYC1000(TEI0003-02)はこちら](https://www.trenz.jp/product/TEI0003-02) &yen;4,900

価格は2020年4月15日の価格です。国際的な輸送の情勢が不透明なのと、ドイツTrenz社の平時とは違うようで、在庫が切れた場合の今後の入荷は不明です。