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。
| Item | Usage | Nano 9K total | Utilization |
|---|---|---|---|
| LUT | 63 (25 LUT + 38 ALU) | 8640 | < 1% |
| Register (FF) | 53 | 6693 | < 1% |
| CLS | 40 | 4320 | < 1% |
| I/O | 5 (clk + LED1 + LED2 + GPIO27 + GPIO28) | 71 | 8% |
| fs UserCode | 0x0000E28C (valid) | — | — |
tx_data を 0 → 15 と 循環送出 (16 bit ごとに 一周)'1' = HIGH → LOW / '0' = LOW → HIGHtx_manchester (internal wire + 外部 GPIO 27)rx_data の 該当 bit に書込tx_manchester → rx_manchester_internal (直接接続、 物理 coil 介在なし)
TX bit 3 送出完了時に tx_data を +1 する ∴ RX bit 3 復元完了時 tx_data は RX 復元値 + 1:
match = ((rx_data + 1) == tx_data) // 常に TRUE のはず
| LED | Pin | Signal | 期待動作 |
|---|---|---|---|
| LED1 | 10 | heartbeat_counter[24] | ~0.8 Hz 点滅 (STEP 1586 と同じ視認性) |
| LED2 | 11 | ~match | 常時点灯 (安定 ON) = encode/decode 対称 OK |
判定:
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
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
expected: 0x0000E28C programmed User Code の 表示値と 一致すれば OK 不一致なら configuration 失敗、 retry
| Spec role | 本 spike 実装 |
|---|---|
receiver | ✅ Manchester decoder (internal loopback source) |
decoder | ✅ 4-bit rx_data 復元 |
output | ✅ LED2 = match indicator |
hardware/phase-c/14-nano9k-inductive-coil-loopback/inductive_coil_loopback.v (~120 line)hardware/phase-c/14-nano9k-inductive-coil-loopback/tang_nano_9k.csthardware/phase-c/14-nano9k-inductive-coil-loopback/build.tclhardware/phase-c/14-nano9k-inductive-coil-loopback/README.md