0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

micropythonでshrike-lite その2

0
Last updated at Posted at 2026-05-12

概要

micropythonでshrike-lite、やってみた。

  • Shrike-lite(シュライク・ライト)の凄さは、「マイコン」と「FPGA」の両方を1枚の基板に搭載しているため、配線なしでI2C、SPI、UARTをシミュレーション出来ることです。(pythonとverilogが書ければね。)
    23のサンプルあります。

写真

初期型
image.png

「マイコン」と「FPGA」の通信には、七つの方法がある。

image.png

タイプ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

以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?