SNSへはこちら

Tang Nanoでお手軽FPGA入門(2) - 開発環境構築

2021/11/6 追記:
udev ルール作成後に usermod の記述を追加

続いて、必須な開発環境構築です。
これに限らず、FPGA の IDE は Mac に対応していません。Windows か Linux のみの対応であることがほとんどです。

個人的に Mac でやりたかったのですが、仕方ありません。ここでは仮想マシンを使った開発環境をします。
VirtualBox 上にインストールした Linux(僕の場合は Arch Linux) 上に環境構築するのですが、若干ハマったところがあったのでご紹介します。
これは Ubuntu や CentOS で試しても同様のハマり方をしたので、みなさんのお役に立てると思います。

環境

  • ホストOS: macOS Mojave
  • 仮想PC: VirtualBox + Vagrant
  • ゲストOS: Arch Linux

環境構築

早速紹介していきます。Linux 版のインストール方法や IDE の使用方法はこの記事を参考にしました。
取り敢えず Vagrant + Arch Linux という点でのやり方を付け足しながら書いていこうかなと思います。

Ubuntu 等の機能モリモリディストリビューションで、かつ Vagrant を使わず仮想マシンのウィンドウ上で作業をするならばリンク先のみで良いんでしょうけど、今回はある意味特殊な環境なので解説を進めていきます。

インストール

取り敢えず OS のインストールをしましょう。Vagrant ならすべてコマンドでサクサクできて簡単です。

# まずはVagrant実行用の空ディレクトリを作る
$ mkdir vagrant
$ cd vagrant
$ vagrant box add archlinux/archlinux # VirtualBox に Arch Linux のゲストOSを追加
==> box: Loading metadata for box 'archlinux/archlinux'
    box: URL: https://vagrantcloud.com/archlinux/archlinux
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) libvirt
2) virtualbox

Enter your choice: 2
$ vagrant init archlinux/archlinux # 起動用のVagrantfile生成

以上で、仮想マシンの準備が整いました。

ゲストOS側で準備

起動・アプデ

続いてデフォルトの状態から、IDE を起動できるように各種設定やライブラリのインストールをしていきたいと思います。以下は Vagrant を使う上での基本です。

$ vagrant up # 仮想マシン起動
$ vagrant ssh # SSH接続

ひとまずパッケージをアップデートしておきます。

[vagrant@archlinux ~]$ sudo pacman -Syu # パッケージをすべてアップデート
[vagrant@archlinux ~]$ reboot # とりあえず再起動。この後再度 vagrant ssh をする。

IDEをダウンロード・そのための環境構築

ダウンロードして、環境変数の設定をします。

まずはダウンロード。Arch Linux ではダウンロードソフトである wget さえも入っていませんので、これを pacman でインストールすることから始めます。

[vagrant@archlinux ~]$ sudo pacman -S wget
[vagrant@archlinux ~]$ wget http://cdn.gowinsemi.com.cn/Gowin_V1.9.3Beta_linux.tar.gz

そうしたら展開先ディレクトリを用意して展開します。

[vagrant@archlinux ~]$ mkdir gowin
[vagrant@archlinux ~]$ tar vxf Gowin_V1.9.3Beta_linux.tar.gz -C gowin

続いて IDE 用の環境変数準備です。ついでにパス通しましょうか。これにより、コマンド名のみを入力するだけで IDE を起動できます。

[vagrant@archlinux ~]$ echo 'export LM_LICENSE_FILE=27020@45.33.107.56' >> ~/.bashrc
[vagrant@archlinux ~]$ echo 'export PATH="gowin/IDE/bin:$PATH"' >> ~/.bashrc
[vagrant@archlinux ~]$ exec bash

続いてライブラリのインストールです。とりあえず fontconfig だけでいいっぽい。

[vagrant@archlinux ~]$ sudo pacman -S fontconfig

よし、じゃあ実行してみましょう。

[vagrant@archlinux ~]$ gw_ide
gw_ide: symbol lookup error: /usr/lib/libfontconfig.so.1: undefined symbol: FT_Done_MM_Var

あれ??どうやら fontconfig が認識されているようですが、libfontconfig とのバージョンが合わないため整合性が取れていないようです。ここが一番ハマりました
ちなみに、現状どうなっているんでしょう。取り敢えず libfreetype の様子を見てみましょう。ldd を使うと、実行するバイナリが必要とするライブラリファイル、およびその参照先がわかります。

[vagrant@archlinux ~]$ ldd gowin/IDE/bin/gw_ide | grep freetype
    libfreetype.so.6 => /home/vagrant/gowin/IDE/bin/../lib/libfreetype.so.6 (0x0000003e25a00000)

むむ、どうやら先程展開した IDE のファイル中に、謎に libfreetype が同梱されているようです。なんだかよくわからないし、これがコンフリクトを起こしていたら困るので、適当にリネームしてしまいます。ちなみにこれは他の Linux OS を使う人にも必須の操作だと思います

[vagrant@archlinux ~]$ mv gowin/IDE/lib/libfreetype.so.6{,.old}

これでええやろ、と実行。なんと成功してしまいました(ライブラリに関するエラーは出ていない)。

[vagrant@archlinux ~]$ gw_ide
gw_ide: cannot connect to X server

このエラーは...

X Serverのインストール

Linux で GUI 環境を提供する X Server が入っていないので、このようなエラーが出るのは当たり前です。
とはいえ、この対処法はだいたい手順が決まっているので、気軽に解決できます。以下のように。

[vagrant@archlinux ~]$ sudo pacman -S xorg-server xorg-xinit xorg-xauth
[vagrant@archlinux ~]$ sudo pacman -S vim # お好きなテキストエディタ。僕はVim派だ。
[vagrant@archlinux ~]$ sudo vim /etc/ssh/sshd_config
# X11Forwardingのところのコメントを解除し、noをyesに変える
[vagrant@archlinux ~]$ sudo systemctl restart sshd # sshdを再起動
[vagrant@archlinux ~]$ exit # 一旦ログアウト

通常、ネットワーク経由でサーバー等に接続する際は再度 ssh 接続すればこれで解決できますが、今回は Vagrant を使っているため、話が異なります。
どこで得た情報か忘れましたが、一旦ホストOS(Mac等) に戻って以下のおまじないを Vagrantfile に追加で記載すれば Vagrant 側で X11 に対応出来るらしいです。

  config.ssh.forward_x11 = true
  config.ssh.forward_agent = true

そしたら ssh 接続してみましょう。なお Mac の場合は XQuartz という X11 用のクライアントアプリをインストールする必要があります。ググってくだされ。

$ vagrant ssh
Last login: Tue Dec 24 04:37:21 2019 from 10.0.2.2
/usr/bin/xauth:  file /home/vagrant/.Xauthority does not exist
$ gowin/IDE/bin/gw_ide # 取り敢えず起動するはず

初回起動時にエラーで怒られますが、一応起動できたはずです。これらのエラーは次回以降出ませんのでご安心あれ。
しかしながら GUI 用(?)のフォントを入れていないため、文字が潰れてすごいことになっていると思います。なので追加でインストール。そして再度 IDE を実行します。

[vagrant@archlinux ~]$ sudo pacman -S otf-ipafont
[vagrant@archlinux ~]$ gw_ide

ふぅ。これでやっとまともに IDE が起動できたはずです。ここから IDE の設定に移ります。Sipeed の Floating Server によってライセンスを使用しますので、以下のように設定してください。これは必須です。

Use Floating License Server を選んで、Serverに45.33.107.56, Portに10559を入力する。そうして再度 IDE を立ち上げると、スプラッシュスクリーン表示後にこのようなメイン画面が出ます。

ここまで来たら一応開発環境の導入完了です。

VirtualBoxでUSBを認識させる

続いて、VirtualBox 側で USB デバイスをゲストに認識させることが出来るように Extension をインストールします。まずは先立ってそれ用のファイルを作成しておきましょう。これは後で使います。

次のファイルを /etc/udev/rules.d/50-tang-nano.rules に配置。

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", ATTRS{product}=="Sipeed-Debug", GROUP="users", MODE="0666"

そしたら取り敢えず VM を終了です。

$ vagrant halt

このサイトを参考に Extension Pack をインストールしてください。詳細は省きますよ。
終わったら、Tang Nano を PC に接続、VirtualBox の VM マネージャーウィンドウ上で arch_default_... を右クリックして設定ウィンドウを出しましょう。
こんな感じでUSB デバイスを追加します。

そして VM をスタート。

$ vagrant up
$ vagrant ssh

Arch Linux側でUSBへのアクセス権限をなんとかする

先程保存したファイルを適用すれば、一般ユーザーでも USB デバイス(この場合は Tang Nano のこと)に sudo なしでアクセスすることができます。

先程のルールは users グループに属するユーザーに権限を付与するものなので、自分がそのグループに入っていない場合は追加する必要があります。

# 自分がusersグループに入っているか確認
$ getent group users
users:x:985:

# ユーザー"vagrant" が含まれていないので追加
$ sudo usermod -aG users vagrant
$ getent group users
users:x:985:vagrant

これが終わったらプログラマで確認。

[vagrant@archlinux ~]$ sudo modprobe -r ftdi_sio
[vagrant@archlinux ~]$ cd gowin/Programmer/bin
[vagrant@archlinux ~]$ ./programmer_cli --channel 0 --device GW1N-1 --operation_index 0
 "Read Device Codes" starting on device-1...
 ID code is: 0x0900281B
 User code is: 0x0000496F
 Status code is: 0x0001F020
 Cost 0.58 second(s)

この modprobe だけはデバイスの付け外し、マシンの再起動時に実行する必要があります。

お疲れ様でした。次はいよいよLチカです。