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 (STEP 1597) | v0.3 (STEP 1598) |
|---|---|---|
| Manchester encoder / decoder | ✓ | ✓ (同一) |
| Carrier gating (105 kHz) | ✓ | ✓ (同一) |
| Envelope detector | — | ✓ monostable 400-clock (rev2) |
| Loopback source | tx_manchester 生 stream | envelope_out 復元 stream |
| External envelope pin | — | GPIO 26 (オシロで tx_raw と一致確認可) |
| LUT / FF | 94 / 76 | 109 / 86 |
| UserCode | 0x00006D68 | 0x0000E5DA |
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 になった。
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 常時点灯 ✅。
[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)
| pin | signal | 期待 (rev2) |
|---|---|---|
| LED1 (10) | heartbeat | ~0.8 Hz 点滅 |
| LED2 (11) | ~match | 常時点灯 ✅ |
| LED3 (13) | envelope activity sample | 常時光る (envelope が active な時間 大) |
| GPIO 25 | tx_raw_pin | 生 Manchester 波形 (オシロ) |
| GPIO 26 | envelope_pin | 復元 Manchester (tx_raw と ~400 clock 遅延で一致) |
| GPIO 27 | tx_out_pin | carrier-gated (bit HIGH 中に 105 kHz burst) |
| Spec 要素 | v0.1 | v0.2 | v0.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%) 到達。
hardware/phase-c/16-nano9k-inductive-coil-v03-envelope/inductive_coil_v03.v (~140 line、 rev2)tang_nano_9k.cstbuild.tclimpl/pnr/inductive_coil_v03.fs (UserCode 0x0000E5DA)