QuickLogic EOS S3用に提供されているFPGAのサンプルプロジェクトを使って、QuickLogic EOS S3のFPGAの動作確認を行います。開発環境はUbuntuに構築しますが、Windows10上にインストールされたVS Codeからリモート開発拡張機能 「Remote Development」 を使ってUbuntuにアクセスします。またVerilog拡張機能「Verilog HDL/System Verilog」をインストールして、moduleやalwaysなどのよく使う定型文をスニペットやシンタックスハイライトできるようにします。
VS Code拡張機能のインストール
- リモート開発拡張機能 「Remote Development」
- Verilog拡張機能「Verilog HDL/System Verilog」
左側メニューバーの拡張機能アイコンをクリックし、検索欄に「Remote Development」と入れます。表示された「Remote Development」を選択して「Extention」をクリックし、「Install」をクリックします。
インストールするとリモートエクスプローラアイコンができているのでクリックし、次のように「SSH Targets」を選択します。
次のように、Ubuntuに展開したフォルダのソースコードがVS Codeに表示されます。
左側メニューバーの拡張機能アイコンをクリックし、検索欄に「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」を参照してください。
- 「Symbiflow_v1.3.1」をダウンロードします。
- ダウンロードした「Symbiflow_v1.3.1」を次のコマンドでインストールします。
- インストールした「Symbiflow_v1.3.1」を次のコマンドで初期化します。
- 次のhelpコマンドでインストールした「Symbiflow」を動作確認します。
- 次のように「 ~/.bashrc 」に「Symbiflow」の動作環境を追加します。
2021/08/26現在、FPGAのコードを「Symbiflow_v1.3.2」でコンパイルすると、理由はわかりませんがコンパイルエラーとなります。
$ export INSTALL_DIR="/home/xxxx/symbiflow/” $ bash Symbiflow_v1.3.1.gz.run
$ 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
$ ql_symbiflow -h
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 」シリアルアダプタとの接続画像を次に示します。なおUSBシリアル変換モジュールは「CP2102 USB to TTL」を使用します。接続画像は、コマンドラインから設定したLED制御を実行しています。
サンプルプロジェクトの実行
パソコンでシリアルモニタを起動し次のコマンド「ledctlr」を入力します。タイムスロットにLEDを設定し、タイムスロットの長さを設定して、指定したLEDを設定した時間表示します。コマンドによる設定の手順を次に示します。
- timeslot 0 to blue
- timeslot 1 to green
- timeslot 2 to red
- timeslot 0 to 500ms
- timeslot 1 to 500ms
- 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 >