概要
micropythonでshrike-lite、やってみた。
- Shrike-lite(シュライク・ライト)の凄さは、「マイコン」と「FPGA」の両方を1枚の基板に搭載しているため、配線なしでI2C、SPI、UARTをシミュレーション出来ることです。(pythonとverilogが書ければね。)
23のサンプルあります。
写真
「マイコン」と「FPGA」の通信には、七つの方法がある。
タイプ1 GPIO
最も基本的なアプローチ。
プロトコルもクロックもハンドシェイクも不要。
各相互接続ピンは独立した信号であり、MCUがGPIOに書き込み、FPGAがその変化を認識する。
あるいは、FPGAがピンをハイレベルに駆動し、MCUがそれを読み取る。
-
これを使用するタイミング:
イベントフラグ。ステータスビット。「センサーは範囲内にあるか?」? FPGAからのはい/いいえの回答。 -
この仕組みの理由:
FPGAはクロックサイクルごとにセンサーを評価します(毎秒5000万回)。
MCUは任意のレートでポーリングを行います。
FPGAはイベントを見逃すことはなく、MCUは準備ができたときに結果を読み取ります。
これがMCUとFPGAの協調処理の核心となる考え方です。
タイプ2 ハンドシェイク
データバスに4ピン、ハンドシェイク信号に2ピンを使用します。
MCUはバス上に4ビットのコマンドを配置し、READYフラグを立てます。
FPGAはコマンドを読み取り、処理し、バス上に4ビットの応答を配置してACKフラグを立てます。
これは、両側が交互にデータを送信する初のプロトコルです。
データバスはトランザクションの途中で方向が変わります。
MCU_READY_____=========____________
DATA[3:0] >>>> CMD >>>>>>>>>>>>
FPGA_ACK________________=======______
DATA[3:0] <<<<<<<<<<<< RESP <<<<<<
- 重要なポイント:
このパターンは、複数のFPGA機能があり、実行時にそれらを選択したい場合に役立ちます。
センサーAにはコマンド0x01、センサーBには0x02、ステータスには0x03を送信します。1つのインターフェースで複数の機能を実現します。 - 制限事項:
データ幅は4ビット。4ビットを超えるデータを扱うには、複数回の往復通信が必要になります。そこでハードウェア周辺機器の出番となります。
タイプ3 割り込み型通知
FPGAは、MCUが継続的にポーリングすることなく、「何かが起こった」ことをMCUに伝える必要がある場合があります。
FPGAはピンをハイレベルに駆動し、MCUはハードウェア割り込みでそれを検知します。
- これは通信プロトコルではなく、通知メカニズムです。
多くの場合、これを他のパターンと組み合わせて使用します。
例えば、FPGAが割り込みを発生させると、MCUはSPI経由でデータを読み取って応答します。
タイプ4 クロック同期ストリーミング
GPIOのみを使用して大量のデータを転送する場合、FPGAは1つのピンでクロックを生成し、別のピンでデータ有効信号を生成し、残りの4つのピンでニブルをストリーミングします。
- MCUは各立ち上がりエッジでサンプリングします。
これはニッチな用途です。FPGA(ストリーマー)
適度なスループットが必要だが、Verilogで完全なSPI/UART周辺機器を実装できない、または実装したくない場合に使用します。
ほとんどの人にとっては、パターン5(SPI)の方が適しています。
タイプ5 SPI通信
SPIバスの処理が完了して解放されるとshrike.flash()、同じ4つのピンが解放されます。
それらを標準のSPIペリフェラルとして再初期化すると、MCUがマスターとなり、FPGAはVerilog SPIスレーブとして動作します。
MCU (SPI Master) FPGA (SPI Slave)
│ │
│ GPIO 2 ──── SCLK ─────────────> │ Pin 3
│ GPIO 1 ──── CS ────────────────> │ Pin 4
│ GPIO 3 ──── MOSI ─────────────> │ Pin 5
│ GPIO 0 ─── MISO ──────────────>│ Pin 6
MCUのハードウェアSPI周辺機器は、クロック供給、バッファリング、そしてオプションでDMA処理を行います。
これにより、ビットバンギングによる4ビット単位の転送ではなく、 MHz速度で8ビット単位のフルデータ転送が可能になります。
Verilog SPIスレーブは、SCLKの立ち上がりエッジでMOSIをサンプリングし、立ち下がりエッジでMISOを出力するシフトレジスタです。
8ビットがクロック入力されると、そのバイトがラッチされ、次の転送のために新しいバイトがロードされます。
- 本格的なプロジェクトでSPIがデフォルトの選択肢となる理由:
8ビットのフルデータ幅、ハードウェア周辺機器によるタイミング制御、RP2040とESP32-S3の両方でDMA対応、そしてピンがまさにこの用途向けに設計されている点。
FPGAのプログラミングに使用した配線がそのまま高速データチャネルとして使用できます。
完全なSPIスレーブVerilogモジュールとファームウェアはサンプルに含まれています。
タイプ6 UART通信
FPGAのピン4と6は、MCUのGPIO 1(UART0 RX)とGPIO 0(UART0 TX)に対応しています。
プログラミング後、MCUとVerilogで実装されたUARTコア間でUART通信を実行できます。
MCU FPGA
│ GPIO 0 ──── TX ────────────────> │ Pin 6 (FPGA's RX)
│ GPIO 1 <─── RX ─────────────── │ Pin 4 (FPGA's TX)
UARTは2ピンしか使用しないため、残りの4ピンはGPIO、SPI、またはI2C用に空けておくことができます。
プロトコルはよく理解されており、デバッグも容易(シリアルターミナルを開くだけ)で、任意の長さのメッセージを伝送できます。
ただし、トレードオフとして速度が犠牲になります。UARTの最大速度は数メガボーです。
Verilog側はモジュール式になっています。
アプリケーションロジックを実装するFPGAによって接続された、独立したモジュールuart_rx.vとモジュールです。
- SPIよりもUARTを選ぶべき時:シンプルで双方向のバイトストリームが必要で、チップセレクトやクロック管理のオーバーヘッドを避けたい場合。
- UARTはデバッグも容易です。
USB-シリアルアダプタをFPGAのTXピンに接続すれば、送信されているデータを確認できます。
モジュール式Verilogを使用した完全なUARTの例は、この例に含まれています。
タイプ7 I2C通信
FPGAのピン17と18は、MCUのGPIOピン14と15(I2C1のSDAおよびSCLライン)に接続されています。
FPGAは7ビットアドレスを持つI2Cスレーブを実装しており、MCUは標準のWireライブラリを使用してFPGAと通信します。
MCU FPGA
│ GPIO 14 ──── SDA ──────────── │ Pin 18
│ GPIO 15 ──── SCL ───────────── │ Pin 17
これは通信以外にも興味深い点があります。
これらのピンはIOヘッダーにも接続されているため、 FPGAと同じバス上に外部I2Cセンサーを接続できます。
MCUはFPGAを(例えば)0x42番地、温度センサーを0x48番地でアドレス指定できます。
つまり、同じ2本のワイヤで複数のデバイスを接続できるのです。
Verilog I2Cスレーブは3つの中で最も複雑で、START/STOP検出、アドレスマッチング、ACK生成、双方向SDA処理が必要です。
完全な実装はサンプルに含まれています。
- I2Cを選択するタイミング:レジスタベースのインターフェース(レジスタ0x01を読み出し、レジスタ0x02に書き込み)が必要な場合、または
外部センサーとバスを共有する必要がある場合。また、SPIおよびUARTピンを既に他の用途で使用していて、ピン17/18しか空いていない場合にも便利です。
どれを、採用するのか
| 条件 | 採用 |
|---|---|
| 「FPGAからイエス/ノーの信号だけが必要です」 | → パターン1(並列入出力) |
| 「FPGAでMCUを起動する必要がある」 | → パターン3(割り込み)+データ用の別のパターン |
| 「コマンドを送信して応答を受け取る必要がある」 | → シンプルさを重視するならパターン6(UART)、速度を重視するならパターン5(SPI) |
| 「高速データ交換が必要」 | → パターン5(SPI)お薦め、何でもこれで、いいじゃん。 |
| 「レジスタベースのインターフェースまたは共有バスが必要です」 | → パターン7(I2C) |
| 「最小限のピンで最大限の柔軟性が必要」 | → パターン6(UART)ピンはわずか2本。 |
23サンプルの概要
| 番号 | サンプル名 | フォルダー | カテゴリー | 難易度 | 内容 |
|---|---|---|---|---|---|
| 1 | LED Blink | led_blink | Getting Started | Beginner | Single output signal, no state |
| 2 | Breathing LED | breathing_led | Getting Started | Beginner | Simple PWM counter, single module |
| 3 | Button Debouncer | button_debouncer | Getting Started | Beginner | Basic FSM, introduces synchronous logic |
| 4 | LED PMOD | pmod_led_blink | GPIO & I/O | Beginner | Direct pin drive, PMOD pinout awareness |
| 5 | Logic Gates | logic_gates | Digital Logic | Beginner | Pure combinational, no clock needed |
| 6 | 4-Bit Counter | counter_4bit | Signal & Timing | Beginner | Sequential logic, introduces registers |
| 7 | PMOD Patterns | pmod_patterns | GPIO & I/O | Intermediate | Sequenced output, simple state machine |
| 8 | GPIO Extender 8-Pin | gpio_extender_8pin | GPIO & I/O | Intermediate | FPGA-to-RP2040 IO bridge, bus awareness |
| 9 | GPIO Extender 14-Pin | gpio_extender_14pin | GPIO & I/O | Intermediate | FPGA-to-RP2040 IO bridge, wider bus |
| 10 | I2C LED | i2c_led | Communication Protocols | Intermediate | I2C state machine, clock stretching awareness |
| 11 | SPI Loopback LED | spi_loopback_led | Communication Protocols | Intermediate | SPI shift register, MISO/MOSI routing |
| 12 | UART LED | uart_led | Communication Protocols | Intermediate | UART RX framing, baud clock generation |
| 13 | Morse Blink | morse_blink | Communication Protocols | Intermediate | UART input, timing/state machine, serial-to-LED translation 0 |
| 14 | UART ALU | uart_alu | Communication Protocols | Intermediate | UART + datapath, multi-module design |
| 15 | PLL Oscillator | pll_oscillator | Signal & Timing | Intermediate | PLL primitive instantiation, clock domain |
| 16 | PWM 4-Channel | pwm_4ch | Signal & Timing | Intermediate | Multi-channel counter, duty cycle control |
| 17 | 7-Segment Display Clock | seven_seg_clock | Signal & Timing | Intermediate | BCD conversion, multiplexed display drive |
| 18 | Ultrasonic Sensor | ultrasonic_sensor | Sensors & Peripherals | Intermediate | Pulse timing, echo measurement FSM |
| 19 | WS2812 LED | ws2812_led | Sensors & Peripherals | Intermediate | Precise bit-bang timing, serial protocol |
| 20 | ASK Modulator | ask_modulator | Signal & Timing | Advanced | RF modulation concepts, carrier + data mixing |
| 21 | Stack Processor | stack_processor | Processors & CPUs | Advanced | Custom ISA, stack-based execution, SPI host |
| 22 | Vector-4 CPU | vector4_cpu | Processors & CPUs | Advanced | Full 4-bit SAP CPU: ALU, PC, registers, decode |
| 23 | Vector-8 CPU | vector8_cpu | Processors & CPUs | Advanced | Full 8-bit SAP CPU: wider datapath, more opcodes |
以上。

