Inductive-coil Manchester loopback silicon spike (Phase C Step 14)

STEP: 1591 / Date: 2026-08-30 / Status: ★★★ ✅ silicon 動作確認完了 (LED1 heartbeat + LED2 常時点灯、藤本さん目視)

★★★ STEP 1578 inductive-coil-pair spec の Manchester encoder + decoder pair silicon 動作確認完了 ★★★

Tang Nano 9K に program (fs UserCode 0x0000E28C ↔ programmed 一致 ✅、 Status 0x0003F020) → 藤本さん目視で LED1 ~0.8 Hz heartbeat + LED2 常時点灯 (match indicator) 確認。 spec の receiver + decoder + output 3 role の 対称性が silicon で verify 完了。 v0.2+ の 100 kHz carrier + CRC + 32-bit frame + 実 coil spike は defer。

Build 結果

ItemUsageNano 9K totalUtilization
LUT63 (25 LUT + 38 ALU)8640< 1%
Register (FF)536693< 1%
CLS404320< 1%
I/O5 (clk + LED1 + LED2 + GPIO27 + GPIO28)718%
fs UserCode0x0000E28C (valid)

Design summary

Bit timing (27 MHz clock)

TX (Manchester encoder)

RX (Manchester decoder)

Internal loopback

tx_manchester → rx_manchester_internal (直接接続、 物理 coil 介在なし)

Verify

TX bit 3 送出完了時に tx_data を +1 する ∴ RX bit 3 復元完了時 tx_dataRX 復元値 + 1:

match = ((rx_data + 1) == tx_data)  // 常に TRUE のはず

LED 動作の期待 (次回 silicon 実機 verify)

LEDPinSignal期待動作
LED110heartbeat_counter[24]~0.8 Hz 点滅 (STEP 1586 と同じ視認性)
LED211~match常時点灯 (安定 ON) = encode/decode 対称 OK

判定:

Verilog highlights

module inductive_coil_loopback (
    input  wire clk,           // 27 MHz (pin 52)
    output wire led_tx_beat,   // LED1 (pin 10)
    output wire led_rx_match,  // LED2 (pin 11)
    output wire tx_out_pin,    // GPIO 27 — 将来 コイル TX 用
    input  wire rx_in_pin      // GPIO 28 — 将来 コイル RX 用 (v0.1 unused)
);
    // Bit timing
    reg [12:0] bit_counter;
    always @(posedge clk) bit_counter <= bit_counter + 1;
    wire half_bit_tick = /* edge detect on bit_counter[12] */;

    // TX Manchester encoder
    reg [3:0] tx_data;
    reg [1:0] tx_bit_idx;
    reg       tx_half_phase;
    reg       tx_manchester;
    always @(posedge clk) if (half_bit_tick) begin
        if (tx_half_phase == 0) tx_manchester <= tx_data[tx_bit_idx];      // first half
        else                    tx_manchester <= ~tx_data[tx_bit_idx];     // second half
        /* + advance bit_idx / tx_data */
    end

    // Internal loopback
    wire rx_manchester_internal = tx_manchester;

    // RX decoder
    reg rx_phase;
    reg [3:0] rx_data;
    reg [1:0] rx_bit_idx;
    reg       rx_latched_first_half;
    always @(posedge clk) if (half_bit_tick) begin
        if (rx_phase == 0) rx_latched_first_half <= rx_manchester_internal;
        else               rx_data[rx_bit_idx] <= rx_latched_first_half;
    end

    // Verify + LED
    wire match = ((rx_data + 4'd1) == tx_data);
    assign led_rx_match = ~match;  // active LOW → LED lit when match=1
endmodule

Silicon 実機動作確認 protocol (defer to 次回 session)

  1. Tang Nano 9K を USB 接続
  2. Program:
    programmer_cli --device GW1NR-9C --cable-index 1 --run 2 \
      --fsFile hardware/phase-c/14-nano9k-inductive-coil-loopback/impl/pnr/inductive_coil_loopback.fs
  3. Post-program UserCode 検証 必須 (STEP 1590 の教訓):
    expected: 0x0000E28C
    programmed User Code の 表示値と 一致すれば OK
    不一致なら configuration 失敗、 retry
  4. 藤本さん目視: LED1 ~0.8 Hz 点滅 + LED2 常時点灯 → 成功

Honest scope (v0.1 意図的除外)

STEP 1578 spec との対応

Spec role本 spike 実装
receiver✅ Manchester decoder (internal loopback source)
decoder✅ 4-bit rx_data 復元
output✅ LED2 = match indicator

V0.2+ (defer)

Files