547 Memristive Crossbar Peripheral Controller (GF180)

547 : Memristive Crossbar Peripheral Controller (GF180)

Design render
  • Author: Prof. Santhosh Sivasubramani, IIT Delhi
  • Description: GF180mcuD port of the 8x8 memristive crossbar controller: READ/SET/RESET/FORMING/SWEEP modes, pulse trains, 16-bit pulse counter, compliance auto-abort with sticky history, V/2 half-select DAC, last-ADC-in-sweep snapshot. Direct cross-foundry sibling to the TTSKY26a xbar_ctrl for comparative characterisation.
  • GitHub repository
  • Open in 3D viewer
  • Clock: 50000000 Hz

How it works

Device-agnostic peripheral controller for 8-row x 8-column memristive / spintronic / phase-change / ferroelectric crossbar arrays. Drives four operation modes — READ, SET, RESET, FORMING — with a configurable 1-to-511- cycle pulse width, repeatable pulse trains with programmable inter-pulse gap, a swept-DAC I-V characterization mode, a compliance-current auto-abort, a 16-bit hardware pulse counter, a read-only V/2 half-select DAC value for sneak-path mitigation, a sticky compliance-history register, and a last-ADC-in-sweep snapshot. All parameters are programmed through a Mode-0 SPI slave.

The FSM is verbatim from the TTSKY26a sibling (IDLE -> SETUP -> PULSE -> SENSE -> GAP -> REPORT with an additional SWEEP outer loop). The design instantiates no foundry-specific standard cells, so the GF180mcuD port required no cell-library substitution; instead the extra gate budget that the GF 1x1 tile provides versus SKY (~1.6x) is spent on features that were deferred on SKY:

Feature SKY port GF port
Pulse counter width 8-bit (wraps at 256) 16-bit (0x0E lo / 0x11 hi)
Compliance history Only current trip in status Sticky 8-bit (0x10), clear via reg_ctrl[4]
Last-sweep-ADC snapshot not captured Register 0x12
Register count (NUM_REGS) 16 20

Register map

Addr Name Access Description
0x00 reg_ctrl RW [0]=start, [1]=abort, [2]=auto_sweep, [3]=compliance_en, [4]=clear_hist (self-clearing)
0x01 reg_mode RW [1:0] in {READ=00, SET=01, RESET=10, FORM=11}
0x02 reg_row RW 3-bit row address
0x03 reg_col RW 3-bit column address
0x04 reg_pulse_l RW Pulse width [7:0]
0x05 reg_pulse_h RW Pulse width [8] (9-bit total, default 10)
0x06 reg_dac RW 8-bit DAC code (default 0x80)
0x07 reg_status R [7]=compliance_hit, [3]=sense_in, [2]=op_error, [1]=op_done, [0]=busy
0x08 reg_adc_data R Last ADC reading, {4'b0, ui_in[7:4]}
0x09 reg_sweep_start RW Sweep start DAC (default 0x00)
0x0A reg_sweep_end RW Sweep end DAC (default 0xFF)
0x0B reg_sweep_step RW Sweep increment (default 0x10)
0x0C reg_repeat RW [3:0]=repeat_count (0 -> single), [7:4]=gap x 16 cycles
0x0D reg_compliance RW Compliance ADC threshold (default 0xFF = off)
0x0E pulse_count[7:0] R Pulse counter low byte
0x0F V/2 R {1'b0, active_dac[7:1]} half-select bias
0x10 reg_compliance_hist R GF-new sticky compliance history (cleared by reg_ctrl[4])
0x11 pulse_count[15:8] R GF-new pulse counter high byte
0x12 reg_sweep_last_adc R GF-new ADC sample from last sweep step

SPI: Mode 0 (CPOL=0, CPHA=0), MSB first. CS=uio[0], MOSI=uio[1], MISO=uio[2] (tri-stated when CS high), SCK=uio[3]. First byte is {rw, addr[6:0]}; second byte is write data, or 8 clocks of MISO for reads.

Pinout

  • ui[0] sense_in, ui[1] adc_ready, ui[2] ext_irq, ui[3] unused
  • ui[7:4] 4-bit ADC data (captured into reg_adc_data[3:0])
  • uo[0] pulse_out, uo[1] row_enable, uo[2] col_enable, uo[3] op_done
  • uo[7:4] = active_dac[3:0] (low nibble of DAC code)
  • uio[0..3] SPI CS/MOSI/MISO/SCK
  • uio[4..6] = row_addr[2:0]
  • uio[7] = col_addr[0]

Full 3-bit column address is SPI-readable at reg_col[2:0].

How to test

  1. Apply reset. Configure over SPI. For a single SET pulse on row 2 / col 5 with DAC 0xA0: write reg_mode=0x01, reg_row=0x02, reg_col=0x05, reg_pulse_l=0x32 (50 cycles), reg_dac=0xA0, then pulse reg_ctrl[0]=1.
  2. Observe pulse_out high for 50 clock cycles; row_enable/col_enable stay high; op_done asserts on completion. Read reg_adc_data (0x08).
  3. READ: reg_mode=0x00, start — skips PULSE, waits for adc_ready.
  4. Pulse train: reg_repeat=0x34 -> 4 pulses with 3x16=48-cycle gap. Counter (0x11:0x0E) reports actual pulses delivered.
  5. Compliance limit: reg_compliance=0x40, reg_ctrl[3]=1. If ADC crosses the threshold during SENSE, the FSM aborts; compliance_hit latches in status AND in reg_compliance_hist (0x10, GF-new).
  6. Clear history: write reg_ctrl=0x10 to clear reg_compliance_hist; the bit self-clears next cycle.
  7. Sweep mode: set reg_ctrl[2]=1 + reg_ctrl[0]=1. After completion, the ADC sample at the last DAC step is retained in reg_sweep_last_adc (0x12, GF-new), separate from reg_adc_data (0x08).

A cocotb suite of 36 tests in test/test.py covers every mode, SPI round- trip, pulse-width boundaries (1 and 511 cycles), pulse trains, compliance abort, sweep (incl. step=0 edge case), V/2 readback, uio_oe direction, and all three GF-new features. All tests pass locally on icarus.

External hardware

  • SPI master (MCU/FPGA) on uio[0:3].
  • External DAC: connect uo_out[7:4] to a 4-bit DAC for basic use, or read the full 8-bit reg_dac over SPI for higher resolution. Register 0x0F gives the V/2 half-select bias line.
  • External ADC: 4-bit nibble on ui_in[7:4], ready pulse on ui_in[1].
  • Crossbar array: row select on uio_out[6:4] (3 bits), column-low on uio_out[7]; decode full 3-bit column via SPI.
  • Optional: external interrupt on ui_in[2], single-bit sense-comparator on ui_in[0].

IO

#InputOutputBidirectional
0sense_inpulse_outspi_cs_n
1adc_readyrow_enablespi_mosi
2ext_irqcol_enablespi_miso
3op_donespi_sck
4adc_data[0]dac_code[0]row_addr[0]
5adc_data[1]dac_code[1]row_addr[1]
6adc_data[2]dac_code[2]row_addr[2]
7adc_data[3]dac_code[3]col_addr[0]

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_utoss_riscv (UTOSS RISC-V core) tt_um_memory_game_top (Number Memory Game) tt_um_danielpenas42 (Ball Display) tt_um_machinelearning (7-Segment Neural Predictor) tt_um_microlane_demo (microlane demo project) tt_um_pixel_processor (Tiny Pixel Processor) tt_um_jpigdon_gps_accelerator_top (GPS_Accelerator) tt_um_rgb_mixer (rgb_mixer) tt_um_bgao43 (Tiny TPU Systolic Array) tt_um_main (Pong in Verilog) tt_um_joannec34_teenytpu (teenytpu) tt_um_apa102_ws2812_squidgeefish (APA102 to WS2812 Translator) tt_um_uacj_bouncing_DVD_screensaver (Custom DVD Screensaver for VGA) tt_um_logoUACJ_MOGA (VGA_screensaver_UACJ) tt_um_grace_spi_led_driver (SPI-Controlled 8-Channel LED Driver) tt_um_rebeccargb_universal_decoder (Universal Binary to Segment Decoder) tt_um_rebeccargb_hardware_utf8 (Hardware UTF Encoder/Decoder) tt_um_happyhop_deadcast2 (happyhop) tt_um_dino7 (Dino-7: 7-Segment Runner Game) tt_um_arty3_mac_engine (Simple MAC Engine w/ Postproc) tt_um_uacj (Custom DVD Screensaver for VGA) tt_um_algofoogle_dottee (DOTTEE VGA demo (TTGF26a)) tt_um_mattvenn_signal_generator (Simple Signal Generator) tt_um_urish_simon (Simon Says memory game) tt_um_tpu (Tensor Processing Unit For GF) tt_um_gojimmypi_ttgf_UART_FSM_TRNG_Lab (Hardware Entropy Explorer: UART/SPI TRNG and PUF) tt_um_wokwi_465483277165299713 (First Tinytapeout) tt_um_prem_pipeline_test (Programmable_Pipeline-RISC-V) tt_um_wokwi_467219410242853889 (Tiny Tapeout testtest 111233) tt_um_wokwi_465549494272929793 (Pacos first design) tt_um_wokwi_465731371445677057 (Arturo's first Wokwi design) tt_um_wokwi_465732744934845441 (Tiny Tapeout Template_1234) tt_um_wokwi_465736492859711489 (Tiny Tapeout Workshop JuanF) tt_um_wokwi_465731430225727489 (Rafa’s first Wokwi design) tt_um_wokwi_465731458365332481 (7 segment Display Fli-Flop Try-out) tt_um_wokwi_465732744245929985 (DiseñoCursoTiny) tt_um_wokwi_465731490568160257 (Matt’s first Wokwi design) tt_um_wokwi_465736691688630273 (test1) tt_um_wokwi_465731458628527105 (Mi copia del Tiny Tapeout) tt_um_wokwi_465731520738845697 (El primer diseño) tt_um_wokwi_465731521356457985 (Tiny Tapeout Template Copy) tt_um_gen1_digital_companion_tile (Gen1 Digital Companion Tile) tt_um_wokwi_465732827753495553 (Tiny Tapeout Template Ayman) tt_um_wokwi_465731394728267777 (Julian_Proyecto) tt_um_wokwi_465731458535202817 (Tiny Tapeout Template Copy) tt_um_wokwi_465732847401723905 (Basic Circuit) tt_um_wokwi_465731452481768449 (El primer diseño de Matt para Wokwi) tt_um_wokwi_465731502018614273 (Tiny Tapeout Template flip flop) tt_um_wokwi_465732616714924033 (Tiny Tapeout RJAP) tt_um_wokwi_465731575275296769 (ocxpkeWokwiDesign) tt_um_wokwi_465732880722332673 (Pedro Template) tt_um_wokwi_465731858252480513 (Paula's first Wokwi design) tt_um_wokwi_465731455677830145 (Tiny Tapeout JMCG) tt_um_wokwi_465737601403996161 (Tiny Number Simon) tt_um_ttmul (Balanced Ternary Multiplier) tt_um_wokwi_465731466664816641 (Tiny Tapeout Workshop Malaga 2jun2026) tt_um_8bit_risc_cpu (8-bit RISC CPU) tt_um_wokwi_451184391728659457 (Simple Sprinkler) tt_um_fhw_appel_spiPWMio (spiPWMio) tt_um_divadnauj_GB_serv_soc_wb (serv_soc_wb) tt_um_8bitcustomcomputer (SAP 8 Bit Computer) tt_um_bioimpedance (Very Low Resource Digital Implementation of Bioimpedance Analysis) tt_um_mgj_bist8 (BIST-8: Built-In Self-Test for 8-bit CLA Adder) tt_um_roberto_tiny_radar_tile (BioPulse Tile) tt_um_systolic_mac_2x2 (2x2 Systolic Array Matrix Multiplier) tt_um_peg_top (2x2 CNN Accelerator PE Grid with UART) tt_um_AlvaroRub_ringcounter (Counter16Outputs) tt_um_wokwi_465731440267947009 (Antonio's first Wokwi design) tt_um_wokwi_465732706576877569 (Guille's first Wokwi design.) tt_um_wokwi_465731481873367041 (MIPS-Lite 8-bit Processor) tt_um_wokwi_465736612213902337 (Juan`s first Worki design) tt_um_wokwi_465731439156454401 (Rhyloo’s first Wokwi design) tt_um_wokwi_465732536551273473 (Tiny Tapeout Marcos Fernandez) tt_um_wokwi_465737290543084545 (Tiny Tapeout Template) tt_um_wokwi_465630130495825921 (ram 1 bit Copy) tt_um_wokwi_465731403724006401 (sdft wokwi 1) tt_um_top (RHD2164-MCU-SPI Bridge) tt_um_line_follower_arvaloez (Line Follower Robot controller) tt_um_xoroshiro64plus_v2 (xoroshiro64) tt_um_ohuettenhofer_tiny_qsim (Tiny Quantum Circuit Simulator) tt_um_santhosh_ring_osc_gf (Ring Oscillator PVT Sensor & TRNG (GF180)) tt_um_santhosh_stoch_stdp_pair_gf (Stochastic neuron + STDP controller (merged, GF180)) tt_um_santhosh_rsd_char_gf (RRAM Characterization Platform (DC sweep + endurance + retention + histogram, GF180)) tt_um_santhosh_xbar_ctrl_gf (Memristive Crossbar Peripheral Controller (GF180)) tt_um_joseph_bf (BF) tt_um_hydrocomms (FSK Modem) tt_um_systolic_array (2x2 MAC Systolic array with DFT) tt_um_kluterirv_rv32e_core (Minimal RV32E SoC with UART Loader) tt_um_algofoogle_ttgf26a_vco (VCO driven by DAC) tt_um_fer_logo_music_vga (UNIZG-FER VGA project) tt_um_maqsudbek_dyadic_pwm (Dyadic PWM) tt_um_waferspace_vga_screensaver (Wafer.space Logo VGA Screensaver) tt_um_htfab_vga_tester (Video mode tester)