STEP 1415 — Tang Nano 9K OSC drift counter spike (Option A)
目的
藤本さん 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)。
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。
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/)
| File | Lines | Purpose |
|---|---|---|
osco_top.v | ~240 | OSC + 1s gate + edge counter + UART packet emitter |
uart_tx.v | ~75 | 8N1 UART TX (STEP 1410/1411 verbatim copy) |
tang_nano_9k.cst | ~25 | Pins: clk 52, LED[0-3] 10/11/13/14, uart_tx 17 |
build.tcl | ~15 | Gowin V1.9.12.02_SP2 build script |
pc_osco_reader.py | ~220 | pyserial reader + rolling baseline + drift ppm + STEP 1350 verdict subset |
README.md | ~500 | design + 2 段階 hallucination 訂正 record + 実測結果 + honest scope |
実測結果 (2026-08-26)
Build (Gowin V1.9.12.02_SP2)
SRAM Program
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
解釈
- Baseline OSC = 2,615,523 edges/sec (nominal 2.5 MHz)
- Per-die variance: +46,180 ppm off nominal (~4.6% 高い、 校正なし RC の 典型)
- Within-session drift: 853 ppm span (~0.03% relative variation、 15 秒 window)
- Drift 起源: 温度 (RC 特性 ~thousands ppm/°C) + supply voltage noise + quantization
- Verdict: TRUE (< 5000 ppm tolerance、 STEP 1350 3 値 subset)
5-step spike template mapping
| Step | 内容 | 状態 |
|---|---|---|
| 1 | Primitive verify (TEMPSENSE 訂正 + OSC identify) + design | ✅ SAC-4 48 |
| 2 | benchtop-mcp mock (defer — real hardware 直接動作で mock layer 不要) | ⏸ defer |
| 3 | osco_top.v + uart_tx.v + cst + tcl + Gowin build PASS (339 LUT) | ✅ SAC-4 49 |
| 4 | pc_osco_reader.py + SRAM Program (0x00003380) + 実測 16 packets verdict TRUE | ✅ |
| 5 | memory + 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 (再明示)
Rei stack alignment
- STEP 1409 5-step spike template の end-to-end 完走 demonstrate
- STEP 1411 BME280 pattern と 相補 (逆順: code-only + 実測差替 vs 手元実測 即)
- STEP 1410 uart_tx.v origin (verbatim copy)
- STEP 1350 verdict 3 値 subset で verdict computation (TRUE/NEITHER/FALSE)
- Tang Nano 9K 物理 silicon 7 例目 (STEP 1038/1039/1399/1410/1411 継承、 Tang Console NEO STEP 1028/1029 統合 count)
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