SiPeed Tang Nanoの環境構築(Windows編)

秋葉原の[Sigezone](https://twitter.com/ShigezoneAkiba) で 深圳矽速科技有限公司(https://www.sipeed.com/ , 以降SiPeed) 製のFPGAボード**「Tang Nano」**を入手できましたので、早速動かしてみました。税込800円という超ロープライスなFPGAボードです。

【追記】
Linux版は @ciniml さんがプロジェクトの作り方とかも詳しく書かれているので[こちら](https://qiita.com/ciniml/items/bb9723673c91d8374b63)を参考にしてください。

# Tang Nanoとは
Tang Nanoは中国 广东高云半导体科技股份有限公司 (http://www.gowinsemi.com.cn/ , 以降GOWIN) のFPGAであるGW1N-1を搭載したボードです。
中国ではSeeedが取り扱っています。
https://www.seeedstudio.com/Sipeed-Tang-Nano-FPGA-board-powered-by-GW1N-1-FPGA-p-4304.html

![IMG_20191103_203700.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/23487af7-4050-d209-a309-9d77b82ac43e.jpeg)

# ドキュメントの入手先
ボードの開発元のSiPeedとチップの開発元のGowinよりドキュメントが公開されています。
[SiPeed Tang Nano Document](https://tangnano.sipeed.com/en/)
[Gowin 云源软件用户指南](http://cdn.gowinsemi.com.cn/SUG100-1.8_Gowin%E4%BA%91%E6%BA%90%E8%BD%AF%E4%BB%B6%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97.pdf)
この手順に従い、Windowsでの開発環境構築と動作確認のための「Lチカ」をやってみました。

#IDEの設定
まずは以下よりIDEを入手します。今回は確認時点(2019/11/13)での最新版(V1.9.2.01Beta)を使用しました。
[高云云源软件](http://www.gowinsemi.com.cn/faq.aspx)
![getIDE.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/9f22238a-42cc-3d04-0861-4e3219339aed.png)
#### 2020.4.21追記
現時点の最新版の1.9.5.01ベータでは書き込みで失敗するという報告がありました。
その場合は以下から旧バージョンを入手して使ってください。
[云源历史文件](http://www.gowinsemi.com.cn/solution_view.aspx?FId=n25:25:25&Id=563&fbclid=IwAR3cMkroK-OazFfGGt684Q9oLw9x3emIW55JBjUG7wh2TDFvb-56dZhaIrY)


## IDEのインストール
ダウンロードしたZIPファイルを解凍して出来た実行ファイルをダブルクリックしてインストールします。
![アイコン.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/f1e09bd9-d995-c848-1025-922b75285136.png)
画面の手順に従って進めればOKです。途中でダウンロードケーブルのドライバのインストールの確認を要求されますので、チェックを入れます。
USBチップは南京沁恒微电子股份有限公司(http://wch.cn/) のUSBマイコン**CH552を使用したFTDI互換**です。手順に従っていくと**FTDIのドライバ**がインストールされます。
**ここは正直ライセンス的にアレなので気になる人は他のOS版を使ってください**

## ライセンス設定
IDEを起動するにはSynopsysのライセンスが必要です。ライセンス設定は以下の2つの方法が提供されています。
1. Stand-Alone版ライセンス
2. SiPeedのサーバーを使ったNetwork activation
**1.は「Networkカードのmacアドレスを変えてライセンスファイルを導入する」という色々とアレな方法なので、今回は2.の方法で対応しました。**

インストールしたIDEを最初に起動すると"License Configuration"画面が表示されますので、
- server address 45.33.107.56
- port: 10559
を入力します。なお、SiPeedのドキュメントでは本文と図で異なるサーバアドレスが記載されているので、必ず本文に記載されているアドレスを入力してください。
![ライセンス設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/7c8876a8-6878-5cac-319c-ac6814b0e5d6.png)
次にWindowsの環境変数にライセンスサーバーのアドレスを追加します。
Windowsのコマンドプロンプトで、以下のコマンドを実行します。

```
setx LM_LICENSE_FILE 27020@45.33.107.56
```
念のためにWindowsの環境変数に追加されているか確認しておきます。
![環境変数.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/31c6da69-2c74-3dd2-2539-cc2a93556f6a.png)

## IDEの起動
ライセンス設定をしたら、念のためにPCを再起動します。
インストールした「GOWIN FPGA Designer」を必ず**管理者モード**で起動します。
**管理者モードで起動しないと、イメージファイルの書込みができないので注意してください。**

**【追記】**
**管理者モードでも書込みがうまく出来なかったという話も聞きましたので、その場合は[Linux環境](https://qiita.com/ciniml/items/bb9723673c91d8374b63)で試してみて下さい。**

ライセンス認証が完了すると以下の**Start Page**が表示されます。論理合成ツールは[Synopsys](https://www.synopsys.com/) の「Synplify Pro]です。

![StartPage.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/7f251a0d-a132-3ce5-bcfa-39b1557fd240.png)


# サンプルプロジェクトの実行
サンプルプロジェクトはSiPeedのGitHubより入手できます。
[Tang-Nano-examples](https://github.com/sipeed/Tang-Nano-examples)
環境の動作確認として「led_prj」を実行してみます。

## プロジェクトの読み込み
[File]->[Open]より \example_led\led_prj にある "led_prj.gprj" を開きます。
正常に読み込めると以下の**Design Summary**が表示されます。
サンプルプロジェクトには "デザイン(Verilog)ファイル" と "制約(Constraint)ファイル"が含まれています。
![DesignSummary.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/fc625cd6-7b85-72df-0649-9e872aab5731.png)

左ペインのファイルをダブルクリックするとファイルの内容が表示されます。
![Verilog](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/e96483f2-ff10-2cd0-c3a9-c1fa2df0ec0b.png)
"制約(Constraint)ファイル"にはピン配置が記述されています。
![constraint.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/88fce438-f276-001c-e97d-808400928341.png)

**タイミング制約等FPGA設計そのものについてはここでは触れません**

## 論理合成
左下のペインの**Synthesize**を右クリック->Runを選んで論理合成を実行します。
![論理合成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/5066a871-2ed9-9ab6-ee58-50dd471fe030.png)

正常に終了するとアイコンが緑のチェックマークになります。エラーがある場合は下ペインの"Issues"に表示されます。
![合成終了.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/4aeb4298-4b47-eea9-f004-09176431aac4.png)

## 配置配線
論理合成が終わったら左下のペインの**Place & Route**を右クリック->Runを選んで配置配線を実行します。
![配置配線.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/f8a44742-e6f1-1af4-3ce4-ea23a4b82f87.png)
論理合成と同様、正常に終了するとアイコンが緑のチェックマークになります。エラーがある場合は下ペインの"Issues"に表示されます。
![配置配線終了.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/871dd2fc-5c0c-07fe-20c2-29c44f60871a.png)

## デザインの書き込み
配置配線が終わったら作成したデザインをFPGAへ書き込みます。左下のペインの**Program Device**を右クリック->Runを選んで"Programmer"を立ち上げます。
![WriteProgram.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/64b5ecd2-c214-b052-c6cd-145a2813998d.png)

デフォルトの書き込み先はSRAMになっていますので、デバイスを選択して[Edit]->[Configure Device]でデバイス設定を開きます。
![Programmer2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/5630e9b0-3a6e-5837-e259-7492861f116e.png)

**Access Mode**で"Embedded Flash Mode"を選択して書き込み先を内蔵のフラッシュメモリに変更します。（SRAMのままでも、電源を切ったら消えますが、回路の書き込みと動作はできるようです。）
![deviceConfig.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/19081da2-cc7d-eebe-3832-64d735ec789e.png)

※v1.9.2/1.9.3だと、書き込み機のクロック周波数の設定がデフォルトで未設定のため書き込みが正常に終わっても動作しない、という減少があるようです。Edit→Cable→CableSettingから書き込み機のクロック周波数を「2.5MHz」に設定してから書き込みをすると動作します。

Saveボタンで保存して**Program/Configure**ボタンを押すと"フラッシュの消去"->"書き込み"が開始されます。
![programConfig.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/463f4e01-c3b3-fc5b-38d8-7d6d60949176.png)
![programming.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/167e8890-4ca4-fd0d-3de2-24d9653f68a5.png)

正常に終了すると下ペインの**Output**に"Finished!"と表示されます。
![finished.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/b22de8d6-620d-9665-4ebd-d28f30ee99f4.png)

## 動作確認
書込みが終わるとデバイスが自動で再起動しLチカが実行されます。以下はわかりやすいようにLチカのパターンをちょっと変えてみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/ciniml?ref_src=twsrc%5Etfw">@ciniml</a> さんと投稿をみて、こちらでもLチカパターンを変えてみた。 <a href="https://t.co/QMGJxvsqGg">pic.twitter.com/QMGJxvsqGg</a></p>&mdash; tomorrow56@11/9-10 MF深圳行くよ(今年こそ) (@tomorrow56) <a href="https://twitter.com/tomorrow56/status/1190944510768889857?ref_src=twsrc%5Etfw">November 3, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 最後に
とりあえず開発環境は出来たので、このサイズのFPGAで何ができるのか色々と触ってみるつもりです。
LCDのサンプルもあったので、次は専用のパネルを入手して遊んでみたいです。