inductive-coil v0.3 — envelope detector + recovered-stream loopback

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

★★★ chat-Claude 「実 coil 経由でも動く」 に 一歩近づく HDL verify 完成。 信号 path 全 layer が silicon 動作: TX Manchester → carrier gate (105 kHz) → envelope detector (monostable) → RX decoder。 Decoder 無変更で 対称性維持 silicon 証明 = 分離設計 (v0.2) + 復元 path (v0.3) 完成。

また rev1 (32-clock sliding OR) → rev2 (monostable 400-clock) の 修正 arc は silicon test = truth の 実効的価値の 例。 「上手そうな設計」 が silicon LED で dim flicker 顕在化 → carrier period vs window size 比較で root cause 特定 → 修正 で 一発解決。

v0.2 → v0.3 delta

要素v0.2 (STEP 1597)v0.3 (STEP 1598)
Manchester encoder / decoder✓ (同一)
Carrier gating (105 kHz)✓ (同一)
Envelope detector✓ monostable 400-clock (rev2)
Loopback sourcetx_manchester 生 streamenvelope_out 復元 stream
External envelope pinGPIO 26 (オシロで tx_raw と一致確認可)
LUT / FF94 / 76109 / 86
UserCode0x00006D680x0000E5DA

Rev 履歴 (silicon = truth)

Rev 1 (32-clock sliding OR shift register) — 失敗

reg [31:0] envelope_shift = 32'd0;
always @(posedge clk) envelope_shift <= {envelope_shift[30:0], tx_gated};
wire envelope_out = |envelope_shift;

Build OK (LUT 105 / FF 108)、 wrapper program OK (UserCode 0x00001099 一致)。 藤本さん目視: LED2 薄く光っている (fast flicker、 dim visual)

Root cause: carrier period 256 clock (HIGH 128 / LOW 128、 duty 50%) を 32-clock window は跨いで hold できず、 bit HIGH 中の carrier LOW 96 clock 分で envelope も LOW に落ちる → RX 誤 sample → 4 bit の一部 mismatch → LED2 flicker。

この設計エラーは simulation でも 気付きにくい (carrier duty 依存で 偶然 動く / 動かない が変わる)。 Silicon LED の 常時点灯 vs 薄く光る の 明確な視覚差 が 一発診断 signal になった。

Rev 2 (monostable 400-clock decay) — 成功

reg [9:0] envelope_timer = 10'd0;
always @(posedge clk) begin
    if (tx_gated) begin
        envelope_timer <= 10'd400;    // reload on carrier HIGH
    end else if (envelope_timer != 10'd0) begin
        envelope_timer <= envelope_timer - 10'd1;
    end
end
wire envelope_out = |envelope_timer;

動作:

Build (rev2): LUT 109 / FF 86 (rev1 108 の -22 = shift register 削除で FF 節約 = 副産物)、 UserCode 0x0000E5DA。 Wrapper program 1 attempt PASS + 藤本さん目視 LED2 常時点灯 ✅

信号 path 全 layer silicon 動作

[TX side]
tx_data (0..15 循環)
  → Manchester encoder (first half = bit, second half = ~bit)
  → tx_manchester (3.29 kbps、 GPIO 25 tx_raw_pin)
  → carrier gate (& 105 kHz)
  → tx_gated (GPIO 27 tx_out_pin、 bit HIGH 中に 105 kHz burst = 実 coil で observable な signal)

[Envelope layer — 実 coil の envelope detection の 簡易 model]
tx_gated
  → monostable timer (400-clock hold on carrier HIGH event)
  → envelope_out (GPIO 26 envelope_pin、 tx_raw_pin と ~400 clock 遅延で一致)

[RX side]
envelope_out
  → half_bit_tick sampling
  → rx_data (Manchester decode)
  → match = (rx_data + 1 == tx_data)
  → LED2 (~match)

LED / GPIO map

pinsignal期待 (rev2)
LED1 (10)heartbeat~0.8 Hz 点滅
LED2 (11)~match常時点灯 ✅
LED3 (13)envelope activity sample常時光る (envelope が active な時間 大)
GPIO 25tx_raw_pin生 Manchester 波形 (オシロ)
GPIO 26envelope_pin復元 Manchester (tx_raw と ~400 clock 遅延で一致)
GPIO 27tx_out_pincarrier-gated (bit HIGH 中に 105 kHz burst)

STEP 1578 spec 進捗 (v0.3 で)

Spec 要素v0.1v0.2v0.3
Manchester encoder / decoder
Carrier gating (100 kHz)
Envelope detector✓ rev2
Loopback via recovered stream
CRC-8— (v0.4)
32-bit frame + preamble— (v0.4)
実 coil 空中経由— (v0.4+ 物理 spike)

spec 半実装 → v0.3 で 4/7 要素 (57%) 到達。

Honest scope

V0.4+ candidate (defer)

Files