QuickLogic EOS S3用に提供されているFPGAのサンプルプロジェクトを使って、QuickLogic EOS S3のFPGAの動作確認を行います。開発環境はUbuntuに構築しますが、Windows10上にインストールされたVS Codeからリモート開発拡張機能 「Remote Development」 を使ってUbuntuにアクセスします。またVerilog拡張機能「Verilog HDL/System Verilog」をインストールして、moduleやalwaysなどのよく使う定型文をスニペットやシンタックスハイライトできるようにします。

VS Code拡張機能のインストール

  1. リモート開発拡張機能 「Remote Development」
  2. 左側メニューバーの拡張機能アイコンをクリックし、検索欄に「Remote Development」と入れます。表示された「Remote Development」を選択して「Extention」をクリックし、「Install」をクリックします。

    インストールするとリモートエクスプローラアイコンができているのでクリックし、次のように「SSH Targets」を選択します。

    次のように、Ubuntuに展開したフォルダのソースコードがVS Codeに表示されます。

  3. Verilog拡張機能「Verilog HDL/System Verilog」
  4. 左側メニューバーの拡張機能アイコンをクリックし、検索欄に「verilog」と入れます。表示された「Verilog HDL/System Verilog」を選択して「Extention」をクリックし、「Install」をクリックします。

QuickLogic EOS S3のFPGAの開発環境の構築

QuickLogic EOS S3のFPGAの開発には「Symbiflow」が必要になります。FPGAへの書き込みは「TinyFPGA Programmer」を使用します。「QuickLogic Featherの開発環境の構築」で構築した開発環境に「Symbiflow」をインストールします。「Symbiflow」については、「QuickLogic-Corp/quicklogic-fpga-toolchain」を参照してください。

  1. Symbiflow_v1.3.1」をダウンロードします。
  2. 2021/08/26現在、FPGAのコードを「Symbiflow_v1.3.2」でコンパイルすると、理由はわかりませんがコンパイルエラーとなります。

  3. ダウンロードした「Symbiflow_v1.3.1」を次のコマンドでインストールします。
  4. $ export INSTALL_DIR="/home/xxxx/symbiflow/”
    $ bash Symbiflow_v1.3.1.gz.run
  5. インストールした「Symbiflow_v1.3.1」を次のコマンドで初期化します。
  6. $ export PATH="$INSTALL_DIR/quicklogic-arch-defs/bin:$INSTALL_DIR/quicklogic-arch-defs/bin/python:$PATH"
    $ source "$INSTALL_DIR/conda/etc/profile.d/conda.sh"
    $ conda activate
  7. 次のhelpコマンドでインストールした「Symbiflow」を動作確認します。
  8. $ ql_symbiflow -h
  9. 次のように「 ~/.bashrc 」に「Symbiflow」の動作環境を追加します。
  10. export INSTALL_DIR="/home/ne/challenge/symbiflow/"
    export PATH="$INSTALL_DIR/quicklogic-arch-defs/bin:$INSTALL_DIR/quicklogic-arch-defs/bin/python:$PATH"
    source "$INSTALL_DIR/conda/etc/profile.d/conda.sh"
    conda activate
    

サンプルプロジェクトのコンパイルとQuickLogic EOS S3への書き込み

次の手順でサンプルプロジェクト「qf_advancedfpga」をコンパイルします。FPGAに関するコンパイルについては、makeによりSymbiflowを呼び出すようになっています。

$ cd /home/xxxx/qorc-sdk/qf_apps/qf_advancedfpga
$ make clean -C GCC_Project
$ make -C GCC_Project

次のコマンドでQuickfeather development kitのファームウェアを書き換えます。

$ qfprog --port /dev/ttyACM0 --m4app GCC_Project/output/bin/qf_advancedfpga.bin --mode fpga-m4 --reset

coolbreeze413/qorc-onion-apps」では、FPGA関連のみのコンパイル方法とFPGAに書き込む方法が記述されてします。

$ ql_symbiflow -compile -src fpga/rtl -d ql-eos-s3 -P pu64 -v AL4S3B_FPGA_Top.v AL4S3B_FPGA_IP.v AL4S3B_FPGA_QL_Reserved.v AL4S3B_FPGA_ONION_PWMCTRL.v ONION_PWM.v -t AL4S3B_FPGA_Top -p quickfeather.pcf -dump binary

$ qfprog --port /dev/ttyACM0 --m4app GCC_Project/output/bin/qorc_fpga_pwmctrl.bin --appfpga fpga/rtl/AL4S3B_FPGA_Top.bin --mode fpga-m4 --reset

この方法だと変更したFPGAのみをコンパイルして書き換えるという考え方に一致した手順が可能となる。しかし、上記の方法だとFPGAのコンパイルオブジェクト「binファイル」が吐き出されていないように思う。ただし、この方法でFPGAを書き換えて実行すると、FPGAでパニックになる(原因不明)。

QuickLogic EOS S3とパソコンとの接続

パソコンとQuickfeather development kitとは、次のように「USB to TTL 」シリアルアダプタで接続します。

信号名  ピン番号
RXD J3のPin 2
TXD J3のPin 3
GND J3のPin 1

・通信速度:115200bps

Quickfeather development kitと「USB to TTL 」シリアルアダプタとの接続画像を次に示します。なおシリアルアダプタは「CP2102 USB to TTL」を使用します。接続画像は、コマンドラインから設定したLED制御を実行しています。

サンプルプロジェクトの実行

パソコンでシリアルモニタを起動し次のコマンド「ledctlr」を入力します。タイムスロットにLEDを設定し、タイムスロットの長さを設定して、指定したLEDを設定した時間表示します。コマンドによる設定の手順を次に示します。

  1. timeslot 0 to blue
  2. timeslot 1 to green
  3. timeslot 2 to red
  4. timeslot 0 to 500ms
  5. timeslot 1 to 500ms
  6. timeslot 2 to 1000ms
##########################
Quicklogic QuickFeather Bootloader
SW Version: qorc-sdk/qf-apps/qf_bootloader(v2) (GCC)
Jun  7 2020 11:50:58
##########################

User button not pressed: proceeding to load application


##########################
Quicklogic QuickFeather Advanced FPGA Example
SW Version: qorc-sdk/qf_apps/qf_advancedfpga
Aug 21 2021 18:12:02
##########################

#*******************
Command Line Interface
App SW Version: qorc-sdk/qf_apps/qf_advancedfpga
#*******************
[0] > ledctlr
[1] ledctlr > color0 1
color0 = 1
[1] ledctlr > color1 2
color1 = 2
[1] ledctlr > color2 4
color2 = 4
[1] ledctlr > duration0 500
duration0 = 500
[1] ledctlr > duration1 500
duration1 = 500
[1] ledctlr > duration2 1000
duration2 = 1000
[1] ledctlr > help
help-path: ledctlr
color0         - set color for time slot 0
color1         - set color for time slot 1
color2         - set color for time slot 2
color3         - set color for time slot 3
duration0      - set duration for time slot 0
duration1      - set duration for time slot 1
duration2      - set duration for time slot 2
duration3      - set duration for time slot 3
exit           - exit/leave menu
help           - show help
?              - show help
help-end:
[1] ledctlr >