はじめに
最近話題(?)のShrike-Liteを手に入れました。
RP2040と小さなFPGAが載った小さなボードです。
実際にいじってみるとこれがなかなかの優れモノだと気づきました。
ただ、小さなボードにMCUと小規模FPGA、という構成ですから、できることには限りがあり、その制約の中で次から次へと実装の題材を考えるのもなかなか大変です。
そこで「なにか面白い題材はないかな」と考えていて思いついたのが 「AtCoderの問題をShrike-Liteで解いてみる」です。
実用性はいったん横に置いておきます。
まずは「安価なFPGAボードで、何か自分で作って動かしてみる」ことを目的にします。
本記事はその準備編の第1回です。
今回は、Shrike-Liteの概要と、今後使う開発環境を整理します。
やりたいこと
やりたいことはシンプルです。
AtCoderの問題を題材にして、Shrike-Lite上のRP2040とFPGAを組み合わせて回答を出力してみます。
AtCoderとFPGAの相性が特別によい、という話ではありません。
ただ、AtCoderのABC-A問題やB問題は仕様が小さく、入力例と期待出力もテストケースとして用意されているため、FPGAで小さな回路の実装を試す題材としてとても優れています。
また、ほぼ毎週新しい問題を提示してくれる、というのは、私も含めたFPGAの基礎学習者にとっては非常にありがたいことです。
Shrike-Liteの特長が生きるよう、実装方針は次のようにします。
- RP2040側で入力整形やテスト実行を担当する
- FPGA側で小さな判定回路や状態機械を担当する
- RP2040とFPGAの間はSPIなどで通信する
- まずは動かすことを優先する
この記事は本格的なFPGA開発やASIC開発のような厳密な検証を目指すものではありません。
趣味の実験として、まずは手元の実機で動かしてみます。
Shrike-Liteとは
Shrike-Liteは、RP2040とルネサス社製小規模FPGAであるForgeFPGAを搭載した小型ボードです。
インドVicharak社製で、日本では秋月電子さんが代理店であるとウェブサイトに記述があります。
Vicharak社のウェブサイトや現物の梱包箱では表記に少し揺れがあるようですが、本記事では以降「Shrike-Lite」に統一します。
その製品コンセプトには非常に優れたものがあります。
とにかく開発環境の構築が簡単です。
また、FPGAへの回路書き込みをRP2040経由で行えるので、FPGA初心者殺しの「回路の書き込みがうまくできない」問題を回避できます。
最低限の知識があれば、「マイコン + FPGA」の構成を、とても気軽に試せるのです。
FPGAというと、専用機材や高額な開発ボードが必要な印象がありますが、Shrike-LiteはPCとUSB-Cケーブルがあれば、まず遊び始めることができます。
Shrike-Liteのざっくり構成
本シリーズでは、Shrike-Liteを次のような構成として見ます。
普通にAtCoderの小規模な問題を解くだけなら、RP2040側のMicroPythonで十分です。
FPGA側の実装中には「RP2040とPyスクリプトでACにたどり着いてしまいたい」という誘惑にしばしば負けそうになると思います。
実際、FPGAに処理をさせることによるパフォーマンス向上はほぼ見込めませんが、開発の手間は数倍に膨れ上がります。
しかしこの記事では、あえてFPGA側にも処理を持たせてみます。
クロックごとに状態が進むFPGAで、普段のソフトウェア処理をどう表現するのか。そのあたりを小さな題材で試していきます。
今回使うもの
まず必要になるものは、以下です。
| 種別 | 使うもの |
|---|---|
| ボード | Shrike-Lite |
| ケーブル | USB-Cケーブル |
| PC | Windows PCなど |
| RP2040側の開発 | Thonny |
| FPGA側の開発 | Renesas Go Configure Software Hub / ForgeFPGA Workshop |
通常、FPGAの学習というと、大量のジャンパケーブルと分厚いマニュアル、開発環境構築のための数日間が必要になりますが、Shrike-Liteの利点は「PCとUSB-Cケーブル1本、あとは無償アプリだけ」で開封から2時間もあれば、とにかく遊び始めることができることです。
この記事では当面の間ロジックアナライザや波形ビューアは使いません。
もちろん、Icarus Verilog、GTKWaveなどのFPGA開発テスト環境や、ロジックアナライザなどがあると、より詳しく動作確認ができたり、より簡単にトラブル原因の追及ができたりします。
ただし、最初の一歩としては必須ではないので、まずはPC、USB-Cケーブル、Thonny、Go Configure Software Hub / ForgeFPGA Workshopで始めます。
開発環境
Thonny / MicroPython
RP2040側の操作にはThonnyを使います。
ThonnyはMicroPythonを扱いやすいエディタで、RP2040に接続してスクリプトを実行できます。
本シリーズでは、RP2040側で次のような役割を担当させる予定です。
- テストケースの管理
- SPI通信の実行
- FPGAへのコマンド送信
- FPGAから返ってきた値の確認
- 期待値との比較
- 処理結果のPC向け送信
つまり、RP2040側は「テスト担当」「制御担当」として使います。
ThonnyやMicroPythonの詳しいインストール手順は、本記事では扱いません。
配布ページや対応バージョンは変わる可能性があるため、最新版はThonny公式サイトやMicroPython公式サイトを確認してください。
Renesas Go Configure Software Hub / ForgeFPGA Workshop
FPGA側の開発にはRenesas Go Configure Software Hubに含まれるForgeFPGA Workshopを使います。
ForgeFPGA Workshopでは、Verilogで書いた回路を合成し、Shrike-LiteのFPGAに書き込むためのbitstream (FPGAに書き込む回路構成ファイル) を生成します。
本シリーズでは、まずFactory Codeやサンプルを使って、次の流れを確認していきます。
- Verilogコードを少し編集する
- ForgeFPGA Workshopで合成する
- bitstreamを生成する
- Shrike-Liteへ書き込む
- 実機の動作が変わることを確認する
Renesas Go Configure Software Hub / ForgeFPGA Workshopの詳しいインストール手順は、本記事では扱いません。
配布ページや対応OS、バージョンは変わる可能性があるため、最新版はRenesas公式サイトを確認してください。
サンプルとFactory Code
新品のShrike-Liteには、工場出荷時に書き込まれた動作確認用のLチカコードが入っています。
また、Vicharak社のshrike GitHubリポジトリやRenesas社のForgeFPGA製品ページには有用なサンプルや情報が用意されています。
そこで最初から複雑な回路を書くのではなく、まずは既存のFactory Codeやサンプルを出発点にします。
準備編では、次の順番で進める予定です。
- Factory Codeを確認する
- RP2040側のLチカ速度を変える
- FPGA側のLチカ速度を変える
- 回路図を見て、RP2040からFPGAへ1bit信号を渡す
- SPIサンプルを使って、RP2040とForgeFPGA間の通信を確認する
Lチカそのものは目的ではありません。
Verilogを変更して、合成して、書き込んで、実機の動作が変わるところまで体験することがゴールです。
また、Shrike-LiteでAtCoder問題を解くには、RP2040とFPGA間の通信が必要になります。
ただし、いきなりUARTやSPIでの通信を自力実装するのはかなり大変です。
そこで、まずはRP2040とFPGAをつなぐGPIO線を1本だけ使い、二つのIC間でON/OFF状態を受け渡す仕組みを実装してみます。
そのあとで、公開されているSPI通信サンプルコードを利用し、RP2040とFPGAの間でデータを送受信できることを確認します。
公式リンク
本記事で出てきた公式サイトや一次情報への入口をまとめておきます。
- AtCoder
- Shrike-Lite 秋月電子商品ページ
- Vicharak Shrike documentation
- Vicharak shrike GitHub repository
- Thonny official website
- MicroPython official website
- Renesas Go Configure Software Hub
- Renesas ForgeFPGA product page
次回以降の予定
今回は、環境準備と今後の方針確認までにします。
具体的なコード編集や書き込み操作は、次回以降の記事に記載します。
準備編は、ひとまず5回に分ける予定です。
| 回 | 内容 |
|---|---|
| 準備編① | Shrike-Lite紹介と環境準備 |
| 準備編② | Factory Codeを確認してRP2040側のLチカ速度を変える |
| 準備編③ | ForgeFPGA WorkshopでFPGA側のLチカ速度を変える |
| 準備編④ | 回路図を見てRP2040からFPGAへ1bit信号を渡す |
| 準備編⑤ | SPIサンプルでRP2040からFPGAを叩く |
準備編が終わったら、AtCoderのABC問題を実際にRP2040 + FPGAで処理してみます。
A問題を普通に解くだけなら簡単ですが、FPGA側に処理を持たせると、入力の渡し方、状態の持ち方、結果の読み出し方を考え、仕様としてまとめる必要があります。
実装の結果は失敗も含め実験ログとして公開していく予定です。
AI支援について
本シリーズでは、MicroPythonコードやVerilogコードのたたき台作成などにAI支援を使うことがあります。
というか、コードの実装の多くの部分はAIに任せる方針です。
人間の役割は、問題の解法アルゴリズムを検討し、どこまでをFPGA側で処理するか、RP2040とどう役割分担するか、動作確認をどう行うかなどを決定して、AIへの指示を行うことに集中します。
おそらくB問題以降では、入力制約範囲のすべてをShrike-Liteで時間内処理することは非現実的な場合があると思います。
このあたりも、実際に試しながら書いていくつもりです。
次回以降
第2回/第3回では、Factory Codeを少し編集して、Lチカの速度を変えてみます。
まずは「動かす → 少し変える → また動かす」から始めます。