STEP 1415 — Tang Nano 9K OSC drift counter spike (Option A)

2026-08-26 · STEP 1409 5-step template の end-to-end 完走 demo · BME280 到着待たず で 手元 Tang Nano 9K のみ で validate · 2 段階 hallucination 訂正 record 含

目的

藤本さん directive: 発明 fresh approve → BME280 Phase 2 pre-work → catalog spike candidate 提示 の 3-task 順番処理 中、 藤本さん問い 「Tang Nano 9K では代替になりませんか?」 に honest 4 option 提示、 藤本さん明示 「Tang Nano 9K を取り付けました」 → 「Option A で STEP 1415 実行お願いします」 で 実行。

本 spike は BME280 の 代替 では ない。 Junction / 環境 温度 の 絶対値 取得 は 不可能、 OSC 発振器 の relative frequency drift のみ 観測。 主 value = STEP 1409 5-step spike template の end-to-end 完走 demonstration + 「実 external sensor 到着待たず で 手元 hardware 活用」 pattern。

2 段階 hallucination 訂正 record

Claude Opus 4.7 が STEP 1415 実行前 + build 実行中 に 2 段階の hallucination を honest 訂正。 SAC-4 100% operational instance (world-uniqueness-claim-controllable + critique-response-pattern)。

訂正 1 (SAC-4 48 例目): 前 answer で 「Gowin GW1NR-9 に TEMPSENSE primitive がある (UG288E)」 と 主張 → grep 実測で C:\Gowin\...\gw1n\prim_syn.v + gw2a\prim_syn.v どちらにも TEMPSENSOR primitive 無しを確認 = controllable claim。 UG288E は GW2A 系列 の 別 IP block documentation を 誤って GW1N に 一般化した hallucination。 → Option A OSC drift counter へ pivot。
訂正 2 (SAC-4 49 例目): OSCO primitive 使用で build 開始 → ERROR (RP0008) : There is no OSCO resource in current device, please change device reject → simlib/gw1n/prim_sim.v grep で OSC / OSCH / OSCZ / OSCO の 4 種 発見、 OSC primitive の DEVICE parameter に "GW1NR-9C" 明示リスト → OSC #(.FREQ_DIV(100), .DEVICE("GW1NR-9C")) 差替で build PASS。

設計

27 MHz crystal (pin 52) ──┬── clk_27m domain 1-second gate (27M count)
                          └── OSC output edge detect (2-FF sync + rise)
                                    │
                                    ▼
                            edge counter (24-bit)
                                    │
              gate expires ──▶ latch osc_cnt / reset / sec_cnt++
                                    │
                                    ▼
                    UART TX (115200 8N1) → USB VCP → PC COM9
                    "OSCT:REF=27000000,OSC=XXXXXX,SEC=YY\r\n"

OSC primitive (FREQ_DIV=100, DEVICE="GW1NR-9C")
    └─ nominal 250 MHz base / FREQ_DIV → ~2.5 MHz output
       (実測 baseline = 2,615,523 edges/sec = +46,180 ppm off nominal
        = 校正なし OSC RC oscillator の per-die variance)

実装

Files (6、 hardware/phase-c/10-tang-nano-9k-osco-drift-spike/)

FileLinesPurpose
osco_top.v~240OSC + 1s gate + edge counter + UART packet emitter
uart_tx.v~758N1 UART TX (STEP 1410/1411 verbatim copy)
tang_nano_9k.cst~25Pins: clk 52, LED[0-3] 10/11/13/14, uart_tx 17
build.tcl~15Gowin V1.9.12.02_SP2 build script
pc_osco_reader.py~220pyserial reader + rolling baseline + drift ppm + STEP 1350 verdict subset
README.md~500design + 2 段階 hallucination 訂正 record + 実測結果 + honest scope

実測結果 (2026-08-26)

Build (Gowin V1.9.12.02_SP2)

Build PASS — 339 LUT/ALU (4%) + 164 FF (3%) + 203 CLS (5%)、 bitstream 2,070,608 bytes、 warning TA1132 (cosmetic clock SDC)、 errors 0。 STEP 1411 BME280 (1,179 LUT / 939 FF) の 3-6 分の 1 の resource usage。

SRAM Program

Program PASS — User Code 0x00003380、 Status Code 0x0003F020 (Ready)、 Cost 3.5 sec、 Cable FT2CH cable-index 1 (STEP 1410 COM9 VCP 継承)。

PC 側実測 15 秒 (pc_osco_reader.py --port COM9 --duration 15)

[  1] sec=0x0C  ref=27000000  osc= 2615119  collecting baseline  drift=     ---
[  2] sec=0x0D  ref=27000000  osc= 2615656  collecting baseline  drift=     ---
[  3] sec=0x0E  ref=27000000  osc= 2615794  base=   2615523  drift=     ---
[  4] sec=0x0F  ref=27000000  osc= 2615503  base=   2615523  drift=    -7.6 ppm
[  5] sec=0x10  ref=27000000  osc= 2615154  base=   2615523  drift=  -141.1 ppm
[  6] sec=0x11  ref=27000000  osc= 2616096  base=   2615523  drift=  +219.1 ppm
...
[ 15] sec=0x1A  ref=27000000  osc= 2613865  base=   2615523  drift=  -633.9 ppm
[ 16] sec=0x1B  ref=27000000  osc= 2613890  base=   2615523  drift=  -624.3 ppm

total packets    : 16
parsed packets   : 16
malformed        : 0
baseline (OSC)   : 2615523  (3 samples)
OSC min/max/mean : 2613865 / 2616096 / 2615191.9
drift ppm range  : [-633.9, +219.1]  span=853.0
verdict          : TRUE
  reason         : drift span 853.0 ppm within ±5000 ppm tolerance

解釈

5-step spike template mapping

Step内容状態
1Primitive verify (TEMPSENSE 訂正 + OSC identify) + design✅ SAC-4 48
2benchtop-mcp mock (defer — real hardware 直接動作で mock layer 不要)⏸ defer
3osco_top.v + uart_tx.v + cst + tcl + Gowin build PASS (339 LUT)✅ SAC-4 49
4pc_osco_reader.py + SRAM Program (0x00003380) + 実測 16 packets verdict TRUE
5memory + site + RECENT_UPDATES 反映 (本 page)

Step 2 defer 理由: 本 spike は BME280 pattern (Phase 2 prep = code-only → 実測差替) と 逆順 = real hardware 直接動作、 mock layer を 後付けする value は 実 hardware 到着後 の BME280/BNO055/VL53L1X/SCD40 側 で 果たす方が cleaner。

Honest scope (再明示)

絶対 温度 取得 不可 — junction temperature / 環境温度 の 絶対値 は 本 spike で 得られない。 OSC 発振器 相対 drift のみ 露出。
Nominal 2.5 MHz は datasheet declared、 per-die 実測 variance ±4-5% 標準。 本 board 実測 baseline 2,615,523 = +46,180 ppm off nominal。
Crystal reference (27 MHz) は ~10 ppm/°C 仕様、 OSC RC は ~thousands ppm/°C。 ratio drift ≈ OSC drift。
BME280 代替 主張 は controllable — 湿度・気圧 domain は 絶対代替不可、 温度 domain も 相対 drift のみ。
Novelty ゼロ — 電子工作コミュニティ で OSC drift counter は 定番、 「初」 主張なし。
本 spike 主 value = STEP 1409 5-step spike template の end-to-end 完走 demonstration + 「実 external sensor 到着待たず」 の 手元 hardware 活用 pattern。

Rei stack alignment

Reproducing

# 1. Build
cd C:/Users/user/rei-aios/hardware/phase-c/10-tang-nano-9k-osco-drift-spike
"/c/Gowin/Gowin_V1.9.12.02_SP2_x64/IDE/bin/gw_sh.exe" build.tcl

# 2. Program (SRAM, flash 保護)
"/c/Gowin/Gowin_V1.9.12.02_SP2_x64/Programmer/bin/programmer_cli.exe" \
  --cable "Gowin USB Cable(FT2CH)" --cable-index 1 \
  --device GW1NR-9C --operation_index 2 \
  --fsFile impl/pnr/osco_top.fs

# 3. PC verify (COM9 auto-bound VCP)
pip install pyserial   # 初回のみ
python pc_osco_reader.py --port COM9 --duration 15 --baseline-samples 3

Related