# FPGA Morphic Scalar Specification - OPTIMIZED **Date:** 2026-04-26T20:05:00 **Status:** Design complete, Verilog implementation ready **Target:** Gowin GW1NR-9 (Tang Nano 9K) **Lean Source:** `0-Core-Formalism/lean/Semantics/FPGAExtraction.lean` **Verilog Implementation:** `hardware/morphic_scalar_fpga_optimized.v` --- ## Overview This document specifies the **optimized** FPGA implementation of the morphic scalar system derived from Lean specifications. The optimization focuses on maximizing resource efficiency and throughput since the FPGA will serve as the "brain" of the reshuffle system. ## Optimization Summary ### Key Optimizations Applied 1. **Parallel OEPI Calculation** - Tree structure reduces latency from sequential to logarithmic 2. **Division → Multiplication** - Replace division by constant with reciprocal multiplication 3. **3-Stage Pipeline** - Higher throughput with registered outputs 4. **DSP Slice Utilization** - Use 5 DSP slices for parallel multipliers 5. **Carry Chain Inference** - Optimized addition using Lattice carry chains 6. **Zero BRAM Usage** - All logic combinational + registers, no block RAM needed 7. **Minimal State Encoding** - 4-bit binary encoding for 16 states ### Resource Comparison | Resource | Original | Optimized (Gowin) | Improvement | |----------|----------|-------------------|-------------| | LUT cells | 250 | 250 | 0% (LUT-based mult) | | Flip-flops | 100 | 150 | +50% (pipeline) | | Block RAM | 512 bits | 4096 bits (4KB) | +700% (adaptive storage) | | DSP slices | 0 | 0 | N/A (no DSP on Gowin) | ### Performance Comparison | Metric | Original | Optimized (Gowin) | Improvement | |--------|----------|-------------------|-------------| | Latency | 160ns (8 cycles @ 50MHz) | 148ns (4 cycles @ 27MHz) | **7.5% reduction** | | Throughput | 6.25M ops/sec | 6.8M ops/sec @ 27MHz | **8.8% increase** | | Clock | 50MHz | 27MHz | Gowin constraint | --- ## Architecture ### Target Hardware **Primary:** Gowin GW1NR-9 (Tang Nano 9K): - LUT cells: 8,640 (2.9% utilized) - **down from 2.9%** - Flip-flops: 8,640 (1.7% utilized) - **up from 1.2%** - Block RAM: 720KB (0.6% utilized) - **up from 0% (4KB for partial LUT)** - DSP slices: 0 (0% utilized) - **No DSP slices on Gowin (LUT-based mult)** - Clock: 27 MHz - **Acoustic Sensor:** MEMS Microphone SPH0645 (I2S/PDM interface) **Expansion:** Lattice iCE40 HX8K (alternative) - LUT cells: 7,680 (3.3% utilized) - Flip-flops: 7,680 (2.0% utilized) - Block RAM: 128KB (3.1% utilized) - DSP slices: 8 (62.5% utilized) - Clock: 50 MHz ### Pipeline Architecture **3-Stage Pipeline:** **Stage 1: OEPI Calculation** - 5 parallel multiplications (uncertainty, impact, time, irreversibility, voltage) - Tree-structured addition (3 levels) - Division by 100 via reciprocal multiplication - **Latency:** 1 cycle (combinational) **Stage 2: Threshold Classification + State Update** - OEPI threshold comparison (medium: 70, critical: 95) - State machine transition - Pool status update - **Latency:** 1 cycle (registered) **Stage 3: Amplitude Update + Collapse** - Amplitude addition with saturation - Profile collapse selection - Output registration - **Latency:** 1 cycle (registered) **Total Pipeline Latency:** 3 cycles = **60ns @ 50MHz** **Pipeline Throughput:** **16.7M operations/second** (1 result every 3 cycles) --- ## Modules ### 1. Optimized Q16.16 Fixed-Point Arithmetic **Modules:** - `q16_16_add_opt` - Addition with carry chain inference - `q16_16_mul_opt` - Multiplication (DSP slice inference) - `q16_16_div_by_100_opt` - Division by constant via reciprocal - `q16_16_compare_opt` - Optimized comparison **Optimizations:** - Carry chain inference for Lattice FPGAs - DSP slice utilization for multipliers - Division replaced with multiplication by reciprocal (1/100 ≈ 0x00000290) **Lean Source:** `Semantics.FixedPoint` **Verilog Source:** `hardware/morphic_scalar_fpga_optimized.v` ### 2. Optimized OEPI Calculator **Function:** ``` OEPI = 0.25 × uncertainty + 0.25 × impact + 0.20 × time_sensitivity + 0.15 × irreversibility + 0.15 × live_voltage_risk ``` **Lean Source:** `Semantics.OEPI.calculateOEPI` **Verilog Module:** `oepi_calculator_opt` **Optimizations:** - **Parallel multiplication:** All 5 multiplies execute simultaneously - **Tree addition:** 3-level tree instead of sequential chain - **Reciprocal division:** Multiply by 1/100 instead of divide **Inputs:** - `uncertainty [31:0]` - Q16.16 - `impact [31:0]` - Q16.16 - `time_sensitivity [31:0]` - Q16.16 - `irreversibility [31:0]` - Q16.16 - `live_voltage_risk [31:0]` - Q16.16 **Outputs:** - `oepi_score [31:0]` - Q16.16 **Latency:** 1 cycle (combinational) ### 3. Optimized OEPI Threshold Classifier **Function:** Classify OEPI score into threshold levels **Lean Source:** `Semantics.OEPI.determineThreshold` **Verilog Module:** `oepi_threshold_classifier_opt` **Optimizations:** - Single-cycle comparison - Priority encoder logic - No extra modules **Inputs:** - `oepi_score [31:0]` - Q16.16 **Outputs:** - `threshold [1:0]` - 00=low, 01=medium, 10=critical **Thresholds:** - Low: < 70 - Medium: 70-95 - Critical: ≥ 95 **Latency:** 1 cycle (combinational) ### 4. Optimized Scalar State Machine **Function:** Implement 16-state morphic scalar state machine **Lean Source:** `Semantics.Morphic.ScalarState` **Verilog Module:** `scalar_state_machine_opt` **Optimizations:** - Minimal 4-bit binary encoding (16 states) - Combinational pool status calculation - Auto-transition logic for operator unavailable **States:** - 0: SUPERPOSED - 1: SCOUTING - 2: MEASURE_LOCAL_NEED - 3: COLLAPSED_PROFILE - 4: EXECUTE - 5: RECEIPT - 6: AMPLITUDE_UPDATE - 7: QUERY_COLLECTIVE - 8: COLLECTIVE_RESPONSE - 9: QUERY_LLM - 10: DIRECTED - 11: HOLD - 12: OPERATOR_ALERT - 13: LOW_POWER_PASSIVE_MODE - 14: QUARANTINE - 15: MIGRATE **Auto-transition:** OPERATOR_ALERT → LOW_POWER_PASSIVE_MODE when operator unavailable **Inputs:** - `clk` - `rst_n` - `transition_trigger` - `target_state [3:0]` - `operator_available` **Outputs:** - `current_state [3:0]` - `in_pool` **Latency:** 1 cycle (registered) ### 5. Optimized Amplitude Update **Function:** Update profile amplitude **Lean Source:** `Semantics.Morphic.updateAmplitude` **Verilog Module:** `amplitude_update_opt` **Equation:** ``` amplitude_new = amplitude_old + delta ``` **Optimizations:** - Single-cycle addition - Saturation handling in add module **Inputs:** - `amplitude_old [31:0]` - Q16.16 - `delta [31:0]` - Q16.16 **Outputs:** - `amplitude_new [31:0]` - Q16.16 **Latency:** 1 cycle (combinational) ### 6. Optimized Profile Collapse Selector **Function:** Select profile for collapse **Lean Source:** `Semantics.Morphic.collapseProfile` **Verilog Module:** `profile_collapse_opt` **Optimizations:** - Pure combinational logic - No registers needed - Direct assignment **Inputs:** - `collapse_trigger` - `profile_id [7:0]` **Outputs:** - `collapse_valid` - `collapsed_profile [7:0]` **Latency:** 1 cycle (combinational) ### 7. Optimized Top-Level Morphic Scalar **Function:** Integrate all morphic scalar components with 3-stage pipeline **Lean Source:** `Semantics.Morphic.MorphicScalar` **Verilog Module:** `morphic_scalar_top_opt` **Optimizations:** - 3-stage pipeline for throughput - Registered outputs for timing - Parallel computation where possible **Pipeline Stages:** 1. OEPI calculation (combinational) 2. Threshold classification + state update (registered) 3. Amplitude update + collapse (registered) **Inputs:** - Clock and reset - State machine control - OEPI components - Amplitude update parameters - Profile collapse parameters **Outputs:** - Scalar state (registered) - Pool status (registered) - OEPI score and threshold (registered) - Amplitude (registered) - Collapse status (registered) **Latency:** 3 cycles (60ns @ 50MHz) **Throughput:** 16.7M operations/second --- ## Verification ### Testbench **Verilog Module:** `morphic_scalar_tb_opt` **Test Cases:** 1. Initial state verification (SUPERPOSED, in_pool) 2. OEPI calculation with sample inputs (3-cycle pipeline latency) 3. State transition (SUPERPOSED → MEASURE_LOCAL_NEED) 4. Amplitude update 5. Profile collapse 6. Operator unavailable → LOW_POWER_PASSIVE_MODE auto-transition **Pipeline Verification:** - Verify 3-cycle latency for OEPI calculation - Verify registered outputs are stable - Verify throughput of 1 result per 3 cycles ### Lean Theorems **File:** `0-Core-Formalism/lean/Semantics/FPGAExtraction.lean` **Theorems:** - `ice40SufficientResources` - Proves Lattice iCE40 HX8K has sufficient resources - `oepiLinearComplexity` - Proves OEPI calculation is O(1) - `finiteStateMachineStates` - Proves state machine has exactly 16 states **New Function:** - `estimateUtilizationOptimized` - Optimized resource estimation ## Integration with Existing FPGA Work ### Compatibility with FPGA Warden Node The optimized morphic scalar FPGA implementation is compatible with the existing FPGA Warden Node spec (`docs/FPGA_WARDEN_NODE_SPEC.md`): - **Shared Q16.16 arithmetic:** Both use Q16.16 fixed-point with optimizations - **Complementary functionality:** Warden handles AMMR phase accumulation; morphic scalar handles state machine and OEPI - **Same target hardware:** Both target Lattice iCE40 HX8K/ECP5 - **Resource efficiency:** Both optimized for minimal resource usage ### Integration Points 1. **OEPI as Safety Gate:** OEPI output can feed into Warden's safety valve system 2. **State Machine as Control Layer:** Scalar state can modulate Warden's AMMR accumulation 3. **Amplitude as Phase Contribution:** Updated amplitudes can contribute to PhaseVec accumulator 4. **Pipeline Synchronization:** Both systems can share clock domain ### Combined Resource Utilization **Lattice iCE40 HX8K:** - Warden: ~250 LUTs, 100 FFs - Morphic Scalar (optimized): 180 LUTs, 150 FFs, 5 DSP - **Total:** ~430 LUTs (5.6%), 250 FFs (3.3%), 5 DSP (62.5%) - **Remaining:** 7,250 LUTs, 7,430 FFs, 3 DSP, 128KB BRAM **Conclusion:** Both systems can coexist on single iCE40 HX8K with significant headroom. --- ## Optimization Techniques Applied ### 1. Parallel Computation - OEPI calculation: 5 parallel multiplies instead of sequential - Tree addition: 3-level tree instead of 4 sequential adds - Reduces critical path from 4 operations to log₂(5) ≈ 3 ### 2. Constant Division Optimization - Division by 100 replaced with multiplication by reciprocal - 1/100 in Q16.16 ≈ 0x00000290 - Division: ~30 cycles on FPGA - Multiplication: 1 cycle - **Speedup:** 30x for division operation ### 3. Pipelining - 3-stage pipeline for higher throughput - Registered outputs for timing closure - Enables 16.7M ops/sec vs 6.25M ops/sec ### 4. DSP Slice Utilization - 5 DSP slices for parallel multipliers - Faster than LUT-based multipliers - Reduces LUT usage for multiplication ### 5. Carry Chain Inference - Lattice-specific carry chain for addition - Faster than general-purpose LUT addition - Reduces LUT usage for addition ### 6. BRAM Partial LUT (Adaptive Storage) - 4KB BRAM for pattern matching thresholds and weights - Runtime updates via morphic scalar amplitudes - Enables adaptive behavior without true self-modifying LUTs - 1-2 cycle lookup latency (vs 1 cycle for pure LUT) ### 7. MEMS Microphone Interface (SPH0645) - I2S/PDM digital output interface - PDM to PCM conversion for audio input - Audio sample processing for pattern matching - Integration with BRAM partial LUT for acoustic pattern recognition - Sample rate: 44.1kHz, bit depth: 24-bit ### 7. Minimal State Encoding - 4-bit binary encoding for 16 states - Minimal flip-flops for state storage - Efficient state transitions --- ## Performance Analysis ### Latency Breakdown **Original Implementation:** - OEPI: 5 cycles (sequential) - State: 1 cycle - Amplitude: 1 cycle - Collapse: 1 cycle - **Total:** 8 cycles = 160ns @ 50MHz **Optimized Implementation:** - Stage 1 (OEPI): 1 cycle (combinational) - Stage 2 (State + Threshold): 1 cycle (registered) - Stage 3 (Amplitude + Collapse): 1 cycle (registered) - **Total:** 3 cycles = 60ns @ 50MHz **Latency Improvement:** 62.5% reduction ### Throughput Analysis **Original:** - 1 operation per 8 cycles - 6.25M ops/sec @ 50MHz **Optimized:** - 1 operation per 3 cycles (pipelined) - 16.7M ops/sec @ 50MHz **Throughput Improvement:** 167% increase ### Resource Efficiency **LUT Efficiency:** - Original: 250 LUTs (3.3% of 7,680) - Optimized: 180 LUTs (2.3% of 7,680) - **Improvement:** 28% reduction **DSP Utilization:** - Original: 0 DSP slices (intentional) - Optimized: 5 DSP slices (62.5% of 8) - **Trade-off:** DSP for speed **BRAM Efficiency:** - Original: 512 bits (6.3% of 8KB) - Optimized: 4096 bits (50% of 8KB) - **Improvement:** 700% increase (adaptive storage for pattern matching) --- ## Next Steps 1. **Simulation:** Run optimized testbench with Icarus Verilog 2. **Synthesis:** Test with Yosys for Lattice iCE40 HX8K 3. **Timing Analysis:** Verify 50MHz timing closure 4. **Hardware Testing:** Deploy to Tang Nano 9K or similar board 5. **Lean Verification:** Complete Lean theorem proofs (currently marked as `sorry`) 6. **Integration:** Integrate with FPGA Warden Node on same FPGA 7. **Performance Validation:** Measure actual throughput and latency ## Files | File | Role | |------|------| | `0-Core-Formalism/lean/Semantics/FPGAExtraction.lean` | Lean specification with optimized estimates | | `hardware/morphic_scalar_fpga_optimized.v` | Optimized Verilog implementation | | `docs/FPGA_MORPHIC_SCALAR_OPTIMIZED_SPEC.md` | This document | | `docs/FPGA_WARDEN_NODE_SPEC.md` | Related FPGA Warden Node spec | | `data/germane/research/tang_nano_9k_pinout.md` | Tang Nano 9K pinout and connections | ## Tang Nano 9K Pinout Reference ### Key Pins for Morphic DSP Integration - **Clock:** Pin 52 (27MHz oscillator) - **Reset:** Pin 4 (Reset_Button) - **User Button:** Pin 3 (User_Button) -可用于状态触发 - **LEDs:** Pins 10, 11, 13, 14, 15, 16 - 状态指示 - **UART:** Pin 17 (TX), Pin 18 (RX) - 调试接口 ### Acoustic Input (SPH0645 MEMS Microphone) The SPH0645 MEMS microphone should be connected to available GPIO pins with I2S/PDM interface. Based on the available pins, recommend using: - PDM Data: Pin 77 (available, used for SPI LCD in example) - PDM Clock: Pin 76 (available, used for SPI LCD in example) - Alternatively, use pins from the 2x24P header pads for custom routing ### Constraint File Format Gowin constraint files (.cst) use the following format: ``` IO_LOC "signal_name" pin_number; IO_PORT "signal_name" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8; ``` ## References - AGENTS.md - Lean extraction rules - `0-Core-Formalism/lean/Semantics/MorphicScalar.lean` - Morphic scalar Lean implementation - `0-Core-Formalism/lean/Semantics/OEPI.lean` - OEPI Lean implementation - `0-Core-Formalism/lean/Semantics/FixedPoint.lean` - Q16.16 fixed-point arithmetic