Tang Nano 4KのMac開発環境構築メモ


# はじめに

最近Tang Nano 4Kと言う安価なFPGAボードがあることを知り、買ってみた。
カメラの映像をHDMIに出力できるらしい。

https://www.shigezone.com/product/tangnano4kcam/

個人的にまだFPGAは使ったことが無いが、
既に先輩方が色々やられている記事を参考に、自身の環境（iMac）を構築し、Lチカしてみた。

特に今回はインストールするIDEのバージョンがシビアだったので、今後のために記録しておく。


# Sipeed Tang Nano 4K

https://gowinsemi.com/en/support/devkits_detail/39


![IMG_3822D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/e86848ec-bb75-5418-9b18-b27e02157831.jpeg)

カメラとHDMI出力つきのFPGAボード

* GOWIN GW1NSR-LV4C FPGA with 4608 LUT
* Arm Cortex-M3
* Tang Nanoと言うものがあるが、それのアップグレード版
* etc.

（FPGAについては簡単にググって調べて得た程度の知識しかないので、説明は他の方にお任せします）


# 開発環境

Tang Nano 4Kの開発環境は、WindowsかLinux向けにしか提供されていない。
今回は、MacにVagrant & VirtualBoxでUbuntuをインストールして使う。

* iMac 2020
    * Mac OS Catalina 10.15.7
* IDE
    * [GOWIN EDA](https://www.gowinsemi.com/ja/product/detail/31/) on VirtualBox(Ubuntu)

![スクリーンショット 2021-10-17 14.07.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/4cad760b-1a14-8fde-ecba-077b2dacd151.png)


# 必要なものをインストール

## 1. VirtualBoxのインストール

```
nabeshin@iMacNabeshin vagrant % brew install virtualbox
```

## 2. Vagrantのインストール

```
nabeshin@iMacNabeshin vagrant % brew install vagrant
Updating Homebrew...

...

==> Installing Cask vagrant
==> Running installer for vagrant; your password may be necessary.
Package installers may write to any location; options such as `--appdir` are ignored.
Password:
installer: Package name is Vagrant
installer: Installing at base path /
installer: The install was successful.
🍺  vagrant was successfully installed!
nabeshin@iMacNabeshin vagrant % vagrant -v
Vagrant 2.2.18
nabeshin@iMacNabeshin vagrant % 
```

## 3. Ubuntuのインストール

virtualBoxにLinuxをインストールする。
基本的にLinuxであれば何とかなる筈なので、以下の中から好きに選択すれば良い。

https://app.vagrantup.com/boxes/search

自分は`ubuntu/trusty64`にした。


```
nabeshin@iMacNabeshin vagrant % vagrant init ubuntu/trusty64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
nabeshin@iMacNabeshin vagrant % ls
Vagrantfile
```

`Vagrantfile `から以下のコメントアウトをはずす。

```
nabeshin@iMacNabeshin vagrant % vi Vagrantfile              

...

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network "private_network", ip: "192.168.33.10"

...

```

### Ubutuの起動＆ログイン

```
nabeshin@iMacNabeshin vagrant % vagrant up
nabeshin@iMacNabeshin vagrant % vagrant ssh
Welcome to Ubuntu 14.04.6 LTS (GNU/Linux 3.13.0-170-generic x86_64)

...

vagrant@vagrant-ubuntu-trusty-64:~$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
vagrant@vagrant-ubuntu-trusty-64:~$ 
```

## 4. GOWIN EDA のインストール

* 以下のページにあるリンクからダウンロードする。
    * https://www.gowinsemi.com/ja/support/database/1056/
* Gowin_V1.9.5Beta_linux
    * https://cdn.gowinsemi.com.cn/Gowin_V1.9.5Beta_linux.tar.gz


執筆時点での最新版はV1.9.8だが、**これはTang Nano 4Kでは使えないので注意！！**


![スクリーンショット 2021-10-24 14.10.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/45949647-b8d2-88b1-5146-0f3c01581b6e.png)

最初、全くボードと通信できなくてVirtualBoxの設定からUbuntuの設定から色々調べたがダメ。。。
アプリのバージョンを古くしたら通信出来ることが分かったが、Tang Nano 4Kのボード設定が入ってなかったり、
いくつかバージョンを試した結果、これがOKだった。
（自分はこれにハマり、、、買ってからLチカできるようになるまで、2,3日かかった・・・・）


```
vagrant@vagrant-ubuntu-trusty-64:~$ pwd
/home/vagrant
vagrant@vagrant-ubuntu-trusty-64:~$ mkdir gowin
vagrant@vagrant-ubuntu-trusty-64:~$ cd gowin/
vagrant@vagrant-ubuntu-trusty-64:~/gowin$ wget https://cdn.gowinsemi.com.cn/Gowin_V1.9.5Beta_linux.tar.gz
vagrant@vagrant-ubuntu-trusty-64:~/gowin$ gunzip ./Gowin_V1.9.5Beta_linux.tar.gz 
vagrant@vagrant-ubuntu-trusty-64:~/gowin$ tar xvf ./Gowin_V1.9.5Beta_linux.tar
vagrant@vagrant-ubuntu-trusty-64:~/gowin$ ls -l
total 1380388
-rw-rw-r--  1 vagrant vagrant 1413498880 Mar 31  2020 Gowin_V1.9.5Beta_linux.tar
drwxr-xr-x 10 vagrant vagrant       4096 Jan 17  2020 IDE
drwxr-xr-x  3 vagrant vagrant       4096 Mar 31  2020 Programmer
drwxr-xr-x  8 vagrant vagrant       4096 Mar  9  2020 SynplifyPro
vagrant@vagrant-ubuntu-trusty-64:~/gowin$ 

```

`.bashrc`にライセンスサーバの設定を追加。

```
vagrant@vagrant-ubuntu-trusty-64:~$ vi ~/.bashrc 

...

# ------------------------
# Gowin License Server
export LM_LICENSE_FILE=27020@45.33.107.56
export PATH=/home/vagrant/gowin/IDE/bin:$PATH
```


```
vagrant@vagrant-ubuntu-trusty-64:~$ source .bashrc
```

## 5. X Serverのインストール

* UbuntuにX Serverをインストールする。

```
vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get update
vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get -y install xserver-xorg
```

## 6. xquartzのインストール

* こちらの記事を参考にMacに`xquartz`をインストールする。
  * [X11 ForwardingしてMacにGUI表示する](https://qiita.com/loftkun/items/37340745f211ea5d7ece)
* インストールしたら再ログインまたは再起動。

```
nabeshin@iMacNabeshin ~ % brew install xquartz
```


# gw_ideのライセンス設定

```
vagrant@vagrant-ubuntu-trusty-64:~$ gw_ide
```

* `gw_ide`で以下のIDEが起動する。

![スクリーンショット 2021-10-17 9.38.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/935181d5-4e21-0232-f8a6-e1e1e9ecea2d.png)

* 初回はライセンス情報の入力が求められる。
    * `Use Floating License Server` で、Serverに`45.33.107.56`, Portに`10559`を入力。
    * 入力後、gw_ideを再起動すると以降は入力を求められずに起動できるようになる。

* また、`cannot connect to X server`が出る場合、xquartzの準備ができてない。
 * 再ログイン、再起動なりして、以下の環境設定ができてることを確認する。

```
nabeshin@iMacNabeshin vagrant % echo $DISPLAY
/private/tmp/com.apple.launchd.KwU938ZDOO/org.xquartz:0
```  

# USBデバイスの認識

VirtualBoxでUSB 2,3 デバイスを使用するには、`virtualbox-extension-pack`をインストールしておく必要がある。

```
nabeshin@iMacNabeshin ~ % brew install virtualbox-extension-pack
```

Tang Nano 4KをUSB接続した状態で、Virtual Boxを起動し、以下の設定画面で`SiPEED JTAG Debugger`をフィルタに追加する。


![スクリーンショット 2021-10-17 14.01.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/3cc7313b-c229-d4d5-4303-ef6a79089366.png)


![スクリーンショット 2021-10-17 14.04.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/d6301da3-1d7d-211f-ec0e-b89e71373e87.png)


VirtualBox側でUSBデバイスとしてこんな感じで認識されればOK。

```
vagrant@vagrant-ubuntu-trusty-64:~/gowin$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 0403:6010 Future Technology Devices International, Ltd FT2232C Dual USB-UART/FIFO IC
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
vagrant@vagrant-ubuntu-trusty-64:~/gowin$ ls -l /dev/*USB*
crw-rw---- 1 root dialout 188, 0 Oct 24 07:17 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1 Oct 24 07:17 /dev/ttyUSB1
vagrant@vagrant-ubuntu-trusty-64:~/gowin$ 
```

## Tang Nano 4K との通信

* `programmer_cli`でボード情報を取得できるか確認。


```
vagrant@vagrant-ubuntu-trusty-64:~/gowin$ cd Programmer/bin/
vagrant@vagrant-ubuntu-trusty-64:~/gowin/Programmer/bin$ sudo ./programmer_cli --scan
 Scanning!
Current download-cable channel:0
Device Info:
 	Family: GW1NSER  
	Name: GW1NSER-4C  
	ID: 0x0100981B  
 1 device(s) found!
 Cost 0.59 second(s)
  
vagrant@vagrant-ubuntu-trusty-64:~/gowin/Programmer/bin$ 
```

* `sudo`つけないとデバイスの参照権限がなくて`Error: Error found!`になる。
    * @ciniml さんが[udevの設定方法](https://qiita.com/ciniml/items/bb9723673c91d8374b63)を記載してくれている。
    * 残念ながら自分の環境では、なぜか上手く行かないので後でゆっくり調べよう。。
* インストールしてるアプリのバージョンが違うと`Cable Open Failed`になって情報が取得できない。
    * Programmerのバージョンによっては全然応答が返らなかったりする。
    * Gowin_V1.9.5Betaにすると解決するかも知れない。


# Lチカコードの書き込み

公式のGitHubリポジトリからサンプルコードを入手し、書き込んでみる。

![スクリーンショット 2021-10-24 14.56.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/ee8d9145-4113-ac6b-2295-e888602b7743.png)


```
vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get install git
vagrant@vagrant-ubuntu-trusty-64:~$ git clone https://github.com/sipeed/TangNano-4K-example.git
```

* `gw_ide`を起動し、ダウンロードしたサンプルコードを開く。
    * `$ sudo gw_ide`
    * ボードへの書き込み権限が必要なので、一旦`sudo`付きで。（本当は綺麗に解決したい）
    * ボードの設定は、`GW1NSR-LV4CQN48PC6/I5`

![スクリーンショット 2021-10-24 14.59.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/04f61fa8-46bc-505d-0bbc-7b5db37c84c7.png)


* `Process`タブを開いて、ビルド。
    * `Synthesize`を右クリックして、`clean`, `run`
    * `Place & Route`を右クリックして、`clean`, `run`

![スクリーンショット 2021-10-24 15.15.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/50dce58c-18cc-d64f-6a9c-053c549ded4d.png)


* 右上のツールバーのアイコンをクリックし、`Programmer`を起動
    * `Cable Setting`で、Frequencyを`2.5MHz`に変更

![スクリーンショット 2021-10-24 15.19.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/46cd2fe4-30c1-71fd-27e3-82c2258483e7.png)


* 書き込み
    * デフォルトだと書き込み先はSRAMになってる。
    * ツールバー右上のアイコンをクリックすると書き込み開始。
    * インジケータが表示されて、10秒くらいで書き込みが終了し、Lチカが始まる。

![スクリーンショット 2021-10-24 15.25.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/a7a4be54-09d5-9e2f-4dbb-67701bc7673f.png)

# Lチカ

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">きたー！<br>Tang Nano 4K ついに書き込めた。<br>結局、IDEをV1.9.5Betaにしたら行けました。<br>Lチカ出来てこんなに嬉しいなんて。。。 <a href="https://t.co/yaeDopsCQ6">pic.twitter.com/yaeDopsCQ6</a></p>&mdash; Nabeshin (@desmoquattro996) <a href="https://twitter.com/desmoquattro996/status/1451900031603068933?ref_src=twsrc%5Etfw">October 23, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# まとめ
* 結構ハマったが、約2000円でFPGAの開発環境が手に入りました。
* IDEで回路実装したり色々できるみたいなので、サンプルコードをいじりながら色々試してみようと思います。

# 参考資料
* 製品資料
    * https://wiki.sipeed.com/hardware/zh/tang/Tang-Nano-4K/Nano-4K.html
* 環境構築系
    * https://blog.goo.ne.jp/sabotenboy_london/e/e7ea54a2469f0af9cefd22d98773350c
    * http://blueeyes.sakura.ne.jp/2019/12/24/2793/
    * https://qiita.com/ciniml/items/bb9723673c91d8374b63
    * https://blog.goo.ne.jp/sabotenboy_london/e/e7ea54a2469f0af9cefd22d98773350c