454 Spiking Neural Network WTA Inference Engine (GF180)

454 : Spiking Neural Network WTA Inference Engine (GF180)

Design render
  • Author: Prof. Santhosh Sivasubramani, IIT Delhi
  • Description: GF180mcuD digital spiking neural network inference engine: 4 LIF neurons with programmable 4x4 signed synaptic weight matrix, per-neuron bias, programmable global threshold/leak/refractory, hard winner-take-all lateral inhibition, optional self-recurrence, SPI-configurable 16-bit register file, 4-channel 2-bit input current coding, 4 spike outputs, 2-bit winner ID output, any-spike and busy flags; deterministic single-cycle neuron update
  • GitHub repository
  • Open in 3D viewer
  • Clock: 25000000 Hz

How it works

A 4-neuron digital Spiking Neural Network (SNN) inference engine with hard Winner-Take-All lateral inhibition for TinyTapeout GF 26a (1×2 tile).

Each clock tick (rate set by an 8-bit tick divider) every non-refractory neuron accumulates a MAC of its bias, the dot product of the 4-channel 2-bit input current vector with its row of the 4×4 signed weight matrix, and an optional self-recurrence term. The resulting increment is added to the 16-bit signed membrane (saturating on overflow). If the updated membrane crosses the global threshold the neuron fires a 1-tick spike and resets; if hard_wta=1, the lowest-index firing neuron is the sole winner and all other firing neurons are forced into the refractory_cnt inhibition window for refractory cycles.

All datapath parameters (threshold, leak, refractory, tick_div, bias, weights, recur_gain) are programmable over the SPI register file. Membrane and refractory counters are memory-mapped for debug.

How to test

  1. Reset (rst_n=0 ≥ 10 clocks).
  2. Program via SPI:
    • threshold, leak, refractory, tick_div, recur_gain
    • per-neuron bias[0..3]
    • weight matrix w[0..15]
  3. Write ctrl = {recur_en, hard_wta, 0, global_en=1, irq_en} to start.
  4. Drive ui_in[7:0] with the 4×2-bit input current vector.
  5. Observe spikes on uo_out[3:0] and winner ID on uo_out[5:4]; uio_out[5] pulses every tick for oscilloscope triggering.
  6. Poll status (0x20) for latest spike vector + sticky overflow flag.

External hardware

  • An SPI master (any Raspberry Pi / microcontroller) for register programming.
  • A 4×2-bit input pattern generator on ui_in[7:0] — could be raw GPIO, a small logic-analyser pattern, or an external event source.
  • Oscilloscope or logic analyser on uo_out / uio_out for spike capture.

Register summary

Addr Name
0x00 ctrl
0x01 threshold
0x02 leak
0x03 refractory
0x04 recur_gain
0x05 tick_div
0x08..0x0B bias[0..3]
0x10..0x1F w[0..15]
0x20 status
0x30..0x37 membrane lo/hi (read-only)
0x38..0x3B refractory_cnt (read-only)

ctrl bits

Bit Name Meaning
0 irq_en gate uio[7] IRQ pulse on any spike
1 global_en master enable (also drives busy output)
2 learn_frozen reserved for future on-line STDP
3 hard_wta 1 = lateral inhibition of losers; 0 = soft WTA
4 recur_en 1 = add recur_gain when fired_prev[i]=1

IO

#InputOutputBidirectional
0in_cur0[0]spike[0]spi_cs_n
1in_cur0[1]spike[1]spi_mosi
2in_cur1[0]spike[2]spi_miso
3in_cur1[1]spike[3]spi_sck
4in_cur2[0]winner_id[0]overflow_ever
5in_cur2[1]winner_id[1]tick
6in_cur3[0]busywinner_valid
7in_cur3[1]any_spikeirq

Chip location

Controller Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux tt_um_chip_rom (Chip ROM) tt_um_factory_test (Tiny Tapeout Factory Test) tt_um_Vincent2405_adder_tree (BSD Convolution Adder Tree) tt_um_BastiBudde_i2c_slave_sensor (I2C Slave Template with Emulated Sensor) tt_um_60hz_load (60 Hz Grid-Forming ASIC with Dump-Load Control) tt_um_spi_config_reg (Simple SPI configuration for analog designs) tt_um_ex_drosen766 (Project) tt_um_spi_cpu_top (SPI-CPU) tt_um_d5smith_mfa (Music for ASICs) tt_um_i2c_master (I2C Master Controller) tt_um_aswarby_mac (Aswarby INT8 MAC) tt_um_arrakeen_spsram_direct (TT-Arrakeen-SPSRAM-direct) tt_um_alu (8-bit Interactive ALU) tt_um_JCT_PoC (ttgf jct PoC) tt_um_jct_lea (LEA-128) tt_um_cwru_cpu (CWRU CPU) tt_um_teapot (100Mbps Ethernet Accelerator Wrapper) tt_um_jte_cordic (CORDIC sin/cos generator) tt_um_aidenkoch4 (Three Channel RGB PWM Controller) tt_um_pschuetz_tremolo (Tremolo guitar pedal ASIC) tt_um_jsabree11_fibonacci_checker (fibbonaci_tt) tt_um_connerdaehler_boop (Procedural ASIC) tt_um_Kieckenwama_Traffic_LIGHT_FSM (Traffic Light FSM) tt_um_KimLuu02_WashingMachine_FSM (WashingMachine_FSM) tt_um_PaulineKreis_PWM_Analyser (PWM-Analyser) tt_um_PWM (PWM Generator) tt_um_wokwi_466666882406199297 (Simple Sprinkler) tt_um_rebeccargb_universal_decoder (Universal Binary to Segment Decoder) tt_um_rebeccargb_hardware_utf8 (Hardware UTF Encoder/Decoder) tt_um_spi_master (SPI Master Slave Communication) tt_um_likitha_trng (Secure TRNG Entropy Generator) tt_um_wnn (8-bit WNN Pattern Recognizer) tt_um_raksha (Raksha) tt_um_uart_soc (UART_SOC) tt_um_ecdsa_verify (ECDSA Verification) tt_um_ecc_processor (ECC Processor) tt_um_fast_auth (Fast Authentication Accelerator) tt_um_karthik_trng (TRNG using Ring Oscillator) tt_um_push (Secure V2X Mini Demonstrator) tt_um_santosh_aes_sbox (AES S-Box Accelerator) tt_um_hardware_anomaly_detection (Hardware Anomaly Detection) tt_um_multi_protocol (Multi-Protocol Communication Controller) tt_um_pqc_ntt_butterfly (PQC NTT Butterfly Core) tt_um_cambridge_nlfsr (Programmable Chaotic NLFSR) tt_um_4b_accumulator_cpu (4 bit Accumulator CPU) tt_um_spi_slave (SPI Slave with 8-Register File) tt_um_geeta_doddamani_lfsr (4-bit Maximum-Length LFSR) tt_um_ecc_accelerator (ECC Scalar Accelerator) tt_um_egurapha_chacha20 (ChaCha20) tt_um_configurable_pwm (Configurable PWM Generator) tt_um_Arctic0 (Arctic0 16-bit CPU) tt_um_comp8 (8-bit Comparator) tt_um_pwm_cit (Configurable 8-bit PWM Generator) tt_um_rameshwar_door_lock (Digital Door Lock) tt_um_sandy_venky (8-bit LFSR Circuit) tt_um_ljhahne_pong (Pong) tt_um_v2x_warning (V2X Collision Warning) tt_um_ecc_scalar_mult (ECC Scalar Multiplication) tt_um_fhw_appel_spiPWMio (spiPWMio) tt_um_arrakeen_spsram_direct_sramrules (TT-Arrakeen-SPSRAM-direct-sramrules) tt_um_arrakeen_spsram_direct_5v (TT-Arrakeen-SPSRAM-direct-5V) tt_um_LukeSilva_cartrip (Car Trip) tt_um_coffeepot (100Mpbs 3 port Ethernet switch) tt_um_emiliopeju_lightscan (Lightscan) tt_um_Alanduan21_triad01_top (triad01) tt_um_lif_snn (4-Neuron LIF Spiking Neural Network) tt_um_smerity_mandelbrot (Smerity-Mandelbrot) tt_um_elvtide01_7SegmentDice (7SegmentDice) tt_um_elemental_harmony (Elemental Harmony Game) tt_um_pattern_gen (Programmable Waveform and PWM Generator) tt_um_antimatter15_pdm_vad (PDM Voice Activity Detector) tt_um_layla_spike_detector (Neural Spike Detector) tt_um_detronyx_arith_lab (Detronyx Arithmetic Lab Tile) tt_um_hasheddan_nni (Nearest Neighbor Interpolation) tt_um_brisq (BRISQ) tt_um_santhosh_spike_codec_gf (Neuromorphic Spike Codec (GF180)) tt_um_santhosh_aer_router_gf (Asynchronous-AER Spike Router (4-phase REQ/ACK, 16-entry routing table, GF180)) tt_um_santhosh_snn_wta_gf (Spiking Neural Network WTA Inference Engine (GF180)) tt_um_santhosh_cim_bist_gf (CIM Controller with BIST and Fault Map (GF180)) tt_um_santhosh_neuro_puf_gf (Neuromorphic PUF (distinct-tap LFSR arbiter + memristor XOR, GF180)) tt_um_detronyx_uart_trace_exerciser (Detronyx UART Trace Exerciser) tt_um_ro_puf (Tiny RIng Oscillator PUF) tt_um_franretfie_top (Quadrature sine generator) tt_um_cherny_xor_8bi (XORing given bits) tt_um_mealycpp_ascon_sdmc_uart (ASCON Integrated Crypto Processor) tt_um_reflex_s4 (AER Reflex Chip - MCP2515 CAN gateway) tt_um_polytrig_core (PolyTrig Digital Waveform Synthesis Core) tt_um_waferspace_vga_screensaver (Wafer.space Logo VGA Screensaver) tt_um_2048_vga_game (2048 sliding tile puzzle game (VGA)) tt_um_urish_simon (Simon Says memory game) Available