585 Data General Nova 1200 CPU

585 : Data General Nova 1200 CPU

Design render
              DDDDDDDD
          DDDDDDDDDDDD
       DDDDDDDDDDDDDDD
    DDDDDDDDDDDDDDDDDD
  DDDDDDDDDDDDDDDDDDDD
 DDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDD   GGGGGGGGGGGGGGGGGGGGGG
DDDDDDDDDDDDDDDDDDDDDD   GGGGGGGGGGGGGGGGGGGGGG
 DDDDDDDDDDDDDDDDDDDDD   GGGGGGGGGGGGGGGGGGGGG
  DDDDDDDDDDDDDDDDDDDD   GGGGGGGGGGGGGGGGGGGG
    DDDDDDDDDDDDDDDDDD   GGGGGGGGGGGGGGGGGG
       DDDDDDDDDDDDDDD   GGGGGGGGGGGGGGG
          DDDDDDDDDDDD   GGGGGGGGGGGG
              DDDDDDDD   GGGGGGGG          X4

Data General Nova 16-Bit CPU for Tiny Tapeout

This is my first tapeout, and I decided to challenge myself with trying to build a single-tile 16-bit Data General Nova CPU in Verilog, based on the minicomputer architecture used by the Nova 1200. While fitting a 16-bit CPU on a single tapeout tile is ambitious, I believed it could be possible with some adjustments due to a 4-bit nibble-serial datapath used for the ALU.

A little bit of history: Data General was founded in 1968 by four engineers, three of whom were former employees of Digital Equipment Corporation (DEC), the company famous for minicomputers like the PDP-8. DEC had expressed no interest in moving from 12-bit to 16-bit architectures at the time, so three engineers left to start Data General and build the new design themselves. They went through years of commercial success for their 16-bit machines, then later developed the 16-bit (later 32-bit) Eclipse: the intense development process of the 32-bit Eclipse MV/8000 became the inspiration for the Pulitzer Prize-winning Tracy Kidder book, The Soul of a New Machine. They also helped define the future of portable laptop computers with the Data General/One in 1984.

A few modifications were necessary to fit the design on a single tile. The main difference from the original Nova is that AC0-AC3 were reduced to AC0-AC1, as the reality of four 16-bit accumulators plus multiplexing logic was simply too much for a single tile. This doesn't actually have much impact outside of some software compatibility, as the extra registers aren't used very often in simple programs and I was able to easily modify JSR to store PC in AC1 rather than AC3. The other architecture difference is the exclusion of the memory reference operations ISZ (Increment and Skip if Zero) and DSZ (Decrement and Skip if Zero). I otherwise tried to stay as close to the original Nova architecture as possible.

TT Nova GDS Render

Tile Utilization: 88.614%


How it works

The Tiny Tapeout Nova CPU is fully programmable assuming a QSPI PMOD is being used with the demoboard. Full details on flashing the CPU and testing can be found below, in the "How to test" section. At a high level, the Nova CPU continuously fetches instructions from Flash, decodes them, and executes them:

  1. Fetching: When power is applied and reset is released, the CPU begins reading 16-bit instruction words from the Flash ROM.
  2. Processing: The CPU decodes each instruction and carries out arithmetic, logic, or data transfers using its internal general-purpose registers (AC0 and AC1). Temporary data and variables are stored in PSRAM. Much like the original Nova 1200, the Tiny Tapeout implementation of the CPU processes 16-bit math 4 bits at a time.
  3. Communicating: The chip includes a built-in serial UART transceiver operating at 19,200 Baud at the standard 1.5 MHz demoboard clock. The baud rate is determined by a fixed hardware clock divider of 78 cycles per bit ($\text{Baud} = f_{\text{clk}} / 78$). When a program wants to print text or wait for input, it communicates over ui_in[0] (RX) and uo_out[0] (TX). This allows for interactive terminal I/O, which the example program below demonstrates.
  4. Blinkenlights: As the CPU runs, it drives diagnostic blinkenlight signals on the output pins (uo_out[7:1]), using the demoboard's 7-segment display to show the CPU's major cycle, active instruction class, UART send/receive status, and halt status.
Das Blinkenlights!
  uo[7]      uo[6],uo[5],uo[4]    uo[3],uo[2],uo[1]      uo[0]
 ----------------------------------------------------------------
| HALTED   |     IR_OP[2:0]     |     STATE[2:0]    |  UART_TX  |
| (Halt)   |    (Instruction)   |   (Major Cycle)   |  (Serial) |
 ----------------------------------------------------------------

TT Nova Diagram


How to test

Nova programs are stored in Flash. Words are stored in big-endian format. I have included a Python script so it's possible to write Nova assembly, and the full Nova instruction set is given below. (I highly recommend sharing your Nova programs on Discord or GitHub if you create something cool! I haven't tried writing DOOM yet.)

Step 1: Write and assemble a program

You can assemble your Nova code using the self-contained make_rom.py script:

#!/usr/bin/env python3
"""
make_rom.py
DG Nova assembly -> big-endian binary (rom.bin)
Copyright (c) 2026 X4NTHA, x4ntha.com
SPDX-License-Identifier: Apache-2.0
"""
import re, sys

# demo assembly program: interactive UART echo
ASM_SOURCE = """
; interactive UART echo
START:  SKPDN 010        ; check if char was received on UART RX (Dev 0o10)
        JMP   START      ; wait for char
        DIAC  0, 010     ; read char into AC0 (clears RX done flag)
WAIT:   SKPBZ 011        ; wait until UART TX (Dev 0o11) is ready
        JMP   WAIT       ; wait
        DOAS  0, 011     ; echo char back out via UART TX (with start pulse)
        JMP   START      ; loop indefinitely for next char
"""

def assemble_nova(source_text):
    """
    assembles Nova asm into a list of 16-bit words
    """
    lines = source_text.strip().split('\n')
    rom = [0] * 16384 # 16K words, 32 KB
    labels = {}
    cleaned = []
    pc = 0
    
    def parse_string_bytes(s):
        m = re.search(r'"([^"\\]*(?:\\.[^"\\]*)*)"', s)
        if not m: return []
        content = m.group(1).encode('utf-8').decode('unicode_escape')
        byte_list = [ord(c) for c in content] + [0]
        words = []
        for i in range(0, len(byte_list), 2):
            b_hi = byte_list[i]
            b_lo = byte_list[i+1] if (i+1 < len(byte_list)) else 0
            words.append((b_hi << 8) | b_lo)
        return words

    # pass 1: strip comments, extract labels, map PC
    for raw in lines:
        line = re.sub(r'[;#].*

, '', raw).strip() if not line: continue while True: m_lbl = re.match(r'^([A-Za-z0-9_]+):\s*(.*)

, line) if m_lbl: labels[m_lbl.group(1)] = pc line = m_lbl.group(2).strip() else: break if line: cleaned.append((pc, line)) if line.upper().startswith('.STRING') or line.upper().startswith('.TXT'): str_words = parse_string_bytes(line) pc += max(1, len(str_words)) else: pc += 1 # instruction lookup alc_ops = {'COM':0, 'NEG':1, 'MOV':2, 'INC':3, 'ADC':4, 'SUB':5, 'ADD':6, 'AND':7} alc_shifts = {'L':1, 'R':2, 'S':3} alc_carries = {'Z':1, 'O':2, 'C':3} alc_skips = {'SKP':1, 'SZC':2, 'SNC':3, 'SZR':4, 'SNR':5, 'SEZ':6, 'SBN':7} io_trans = {'NIO':0, 'DIA':1, 'DOA':2, 'DIB':3, 'DOB':4, 'DIC':5, 'DOC':6} io_skips = {'SKPBN':0, 'SKPBZ':1, 'SKPDN':2, 'SKPDZ':3} mrc_ops = {'JMP':(0,0), 'JSR':(0,1), 'LDA':(1,None), 'STA':(2,None)} # resolve labels, current PC, offsets, numeric literals def resolve_val(s, curr_pc): s = s.strip() if s == '.': return curr_pc if s in labels: return labels[s] m = re.match(r'^([\w\.]+)\s*([\+\-])\s*(\d+)

, s) if m: sym, sign, val = m.groups() base = curr_pc if sym == '.' else labels.get(sym, int(sym, 0)) return (base + int(val, 0)) if sign == '+' else (base - int(val, 0)) return int(s, 0) # pass 2: encode instructions into 16-bit binary words for curr_pc, line in cleaned: if line.upper().startswith('.STRING') or line.upper().startswith('.TXT'): words = parse_string_bytes(line) for idx, w in enumerate(words): rom[curr_pc + idx] = w & 0xFFFF continue if line.upper().startswith('.WORD'): val_str = line.split(None, 1)[1] rom[curr_pc] = resolve_val(val_str, curr_pc) & 0xFFFF continue tokens = [t.strip() for t in re.split(r'[\s,]+', line) if t.strip()] mnemonic = tokens[0].upper() args = tokens[1:] # CPU control if mnemonic == 'HALT': rom[curr_pc] = 0x633F continue if mnemonic == 'IORST': rom[curr_pc] = 0x65BF continue # I/O skip if mnemonic in io_skips: ctrl = io_skips[mnemonic] dev = int(args[0], 8) if args[0].startswith('0') else int(args[0]) rom[curr_pc] = (0 << 0) | (3 << 1) | (0 << 3) | (7 << 5) | (ctrl << 8) | ((dev & 0x3F) << 10) continue # I/O data transfer instructions (DIA, DOA, NIO, DIAS, DIAC, DOAS, DOAC, etc.) base_io = mnemonic[:3] suffix_io = mnemonic[3:] if len(mnemonic) > 3 else '' if base_io in io_trans and suffix_io in ('', 'S', 'C', 'P'): trans = io_trans[base_io] ctrl = {'':0, 'S':1, 'C':2, 'P':3}[suffix_io] ac = int(args[0].replace('AC', '')) if base_io != 'NIO' else 0 dev = int(args[1], 8) if (len(args) > 1 and args[1].startswith('0')) else (int(args[1]) if len(args) > 1 else int(args[0], 8)) rom[curr_pc] = (0 << 0) | (3 << 1) | ((ac & 3) << 3) | ((trans & 7) << 5) | ((ctrl & 3) << 8) | ((dev & 0x3F) << 10) continue # MRC base_mrc = None for k in mrc_ops: if mnemonic.startswith(k): base_mrc = k break if base_mrc: indir = 1 if ('@' in mnemonic or any('@' in a for a in args)) else 0 clean_args = [re.sub(r'^AC(?=[0-3]|$)', '', a.replace('@', ''), flags=re.I) for a in args] mode, func = mrc_ops[base_mrc] if mode == 0: func_or_ac = func target = clean_args[0] else: func_or_ac = int(clean_args[0]) target = clean_args[1] explicit_index = len(clean_args) > (1 if mode == 0 else 2) if explicit_index: index = int(clean_args[1 if mode == 0 else 2]) else: if target.startswith('.'): index = 1 else: addr_val_temp = resolve_val(target, curr_pc) if addr_val_temp < 256: index = 0 elif -128 <= (addr_val_temp - (curr_pc + 1)) <= 127: index = 1 else: index = 0 addr_val = resolve_val(target, curr_pc) disp = (addr_val - (curr_pc + 1)) if index == 1 else addr_val rom[curr_pc] = (0 << 0) | ((mode & 3) << 1) | ((func_or_ac & 3) << 3) | ((indir & 1) << 5) | ((index & 3) << 6) | ((disp & 0xFF) << 8) continue # ALC m = re.match(r'^(COM|NEG|MOV|INC|ADC|SUB|ADD|AND)([LRS]?)([ZOC]?)(#?)

, mnemonic) if m: op_str, sh_str, c_str, nl_str = m.groups() op = alc_ops[op_str] shift = alc_shifts.get(sh_str, 0) carry = alc_carries.get(c_str, 0) no_load = 1 if nl_str == '#' else 0 clean_args = [re.sub(r'^AC(?=[0-3]|$)', '', a, flags=re.I) for a in args] acs = int(clean_args[0]) acd = int(clean_args[1]) skip = alc_skips.get(clean_args[2].upper(), 0) if len(clean_args) > 2 else 0 rom[curr_pc] = (1 << 0) | ((acs & 3) << 1) | ((acd & 3) << 3) | ((op & 7) << 5) | ((shift & 3) << 8) | ((carry & 3) << 10) | ((no_load & 1) << 12) | ((skip & 7) << 13) continue raise ValueError(f"unknown instruction at line {curr_pc}: {line}") return rom if __name__ == '__main__': source = ASM_SOURCE if len(sys.argv) > 1: with open(sys.argv[1], 'r') as f: source = f.read() # compile asm to bin rom = assemble_nova(source) with open("rom.bin", "wb") as f: for word in rom: f.write(bytes([(word >> 8) & 0xFF, word & 0xFF])) print("compiled rom.bin successfully!")

To compile your code into rom.bin:

# assemble the embedded program:
python make_rom.py

# assemble an .asm file:
python make_rom.py my_program.asm
Step 2: Test on the Tiny Tapeout demoboard
  1. Plug in the QSPI PMOD: Insert the official Tiny Tapeout Flash/PSRAM QSPI PMOD into the BIDIR (uio) PMOD connector.
  2. Set DIP Switches to OFF: Ensure all 8 input DIP switches (ui[7:0]) on the demoboard are set to OFF. Specifically, DIP switch 1 (ui[0]) connects to UART RX; leaving it ON will clamp the line and prevent keyboard input from reaching the CPU.
  3. Flash the ROM:
  4. Select the project: Select the project on the demoboard (tt_um_x4ntha_nova). The demoboard will automatically configure the system clock to 1.5 MHz.
  5. Open terminal: Connect a serial terminal (screen, PuTTY, etc.) to the demoboard's virtual COM port at 19,200 Baud (8N1).
  6. Interact: With the example project, typing characters into your terminal will result in the Nova CPU echoing them back. The onboard 7-segment display will actively display CPU execution state and instruction telemetry.

Nova Instruction Set Quick Reference
A. Arithmetic & Logic Class (ALC)

Syntax: OP[sh][c][#] acs, acd [,skip]
Example: ADD 0, 1 (Add AC0 to AC1), SUBO# 0, 1, SZR (Compare AC0 and AC1, skip if equal).

Field Options Description
Opcode COM (op=0) Complement: $ACD \leftarrow \sim ACS$
NEG (op=1) Negate: $ACD \leftarrow -ACS$
MOV (op=2) Move: $ACD \leftarrow ACS$
INC (op=3) Increment: $ACD \leftarrow ACS + 1$
ADC (op=4) Add Complement: $ACD \leftarrow \sim ACS + ACD$
SUB (op=5) Subtract: $ACD \leftarrow ACD - ACS$ (use carry=2 / O for exact $ACD - ACS$)
ADD (op=6) Add: $ACD \leftarrow ACS + ACD$
AND (op=7) Bitwise AND: $ACD \leftarrow ACS \ & \ ACD$
Shift (sh) None (shift=0) Direct 16-bit transfer
L (shift=1) Rotate Left 16-bit word through Carry
R (shift=2) Rotate Right 16-bit word through Carry
S (shift=3) Byte Swap: Swap upper and lower 8-bit bytes
Carry (c) None (carry=0) Use existing Carry flag
Z (carry=1) Initialize Carry-in to 0
O (carry=2) Initialize Carry-in to 1
C (carry=3) Initialize Carry-in to $\sim\text{Carry}$
No-Load # (no_load=1) Perform calculation, evaluate skip/flags, but do not alter destination AC
Skip None (skip=0) Never skip
SKP (skip=1) Always skip next instruction
SZC (skip=2) Skip if Carry is Zero (C == 0)
SNC (skip=3) Skip if Carry is Non-zero (C == 1)
SZR (skip=4) Skip if Result is Zero (Result == 0)
SNR (skip=5) Skip if Result is Non-zero (Result != 0)
SEZ (skip=6) Skip if either Carry or Result is Zero (C == 0 or Result == 0)
SBN (skip=7) Skip if both Carry and Result are Non-zero (C == 1 and Result != 0)

B. Memory Reference Class (MRC)

Syntax: OP[@] ac, disp [,index]
Example: LDA 0, 0x40 (Load AC0 from Page 0 addr 0x40), STA 1, @0x41 (Indirect store AC1 via pointer at 0x41), JMP 0, 1 (PC-relative jump).

Opcode mode func_or_ac Description
LDA 1 0..1 (AC) Load Accumulator from memory address: $AC \leftarrow M[EA]$
STA 2 0..1 (AC) Store Accumulator into memory address: $M[EA] \leftarrow AC$
JMP 0 0 Jump: $PC \leftarrow EA$
JSR 0 1 Jump to Subroutine: $AC1 \leftarrow PC + 1$, $PC \leftarrow EA$

C. Input/Output Class (I/O)

Syntax: IO_OP[c] ac, dev
Example: DIA 0, 010 (Read char into AC0 from Keyboard), DOA 1, 011 (Print char from AC1 to UART).

Transfer transfer Description
NIO 0 No transfer (control functions only)
DIA 1 Data In A: Read Device buffer into $AC[7:0]$ (zero extends upper 8 bits)
DOA 2 Data Out A: Send $AC[7:0]$ to Device transmitter
DOC 6 DOC 0, 077 $\rightarrow$ HALT (Halts CPU execution)
DICC 5 DICC 0, 077 $\rightarrow$ IORST (Reset UART flags)
SKP 7 Skip on Device Flag (control=0: SKPBN, 1: SKPBZ, 2: SKPDN, 3: SKPDZ)

External hardware

The official Tiny Tapeout QSPI PMOD is used in this project for Flash/PSRAM over 1-bit SPI:

You can also wire Flash/PSRAM manually if you have spare components, like I did for my Tangy Tapeout FPGA testbed implementation:

Tangy Tapeout Breadboard

IO

#InputOutputBidirectional
0UART_RXUART_TXFLASH_CS_N
1STATE_0SPI_MOSI
2STATE_1SPI_MISO
3STATE_2SPI_SCK
4IR_OP_0SPI_WP_N
5IR_OP_1SPI_HOLD_N
6IR_OP_2PSRAM_CS_N
7HALTED

Chip location

Controller Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Analog Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Analog 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_teuscher_eml_fabric (EML Fabric — analog exp/ln compute cells) tt_um_wokwi_465656663515438081 (Convert binary to hex on 7 segments) tt_um_nikita_face_detect (FPGA Face Detection) tt_um_obstacle_avoider (Obstacle Avoider State Machine) tt_um_poket_animal (Poket Animal) tt_um_drewbabel_uart (Configurable FIFO-buffered UART with APB CSR) tt_um_wokwi_469163916296039425 (TT Workshop Test) tt_um_jonahsaunders_slsvga (tt_um_jonahsaunders_slsvga) tt_um_fatigue_monitor (Fatigue Monitor (PPG Pulse-Interval Variability)) tt_um_vedam_dual_port_ram (Dual Port RAM) tt_um_wokwi_469739097665887233 (Tiny Tapeout Template Copy) tt_um_spdif_to_i2s_kilpelaj (S/PDIF to I2S receiver) tt_um_morse_converter (ASCII to Morse Code Converter) tt_um_wokwi_469806914724000769 (Spin, Text and VGA) tt_um_wokwi_469701770572338177 (TinyTapeout) tt_um_garnetkoebel_communotron (Communotron) tt_um_wokwi_469449970323169281 (full adder) tt_um_duzabf_2026_ow (A WIP Online Workshop 2026 project) tt_um_wokwi_469807513638180865 (Tiny Tapeout NAK) tt_um_ttsky26c_oguz (ttsky26c-202607-mehmetoguzderin by Oguz) tt_um_kashif_fp4_sparse_tpu (FP4 Sparse Mini-TPU) tt_um_moein_maleki_arm16 (arm16) tt_um_wokwi_469453454643027969 (ON Check System) tt_um_felixcheng_neural_core (Neural Compute Core (V0.15)) tt_um_wokwi_469788774011248641 (Spin Display - select-reset-reverse) tt_um_wokwi_469449443070765057 (Samuel's first chip) tt_um_wokwi_469449007236383745 (testinttrsv01) tt_um_vga_ca (VGA cellular Automaton) tt_um_dosci_500hz (Digital Oscillator 500 Hz) tt_um_wokwi_469747443569078273 (XOR test project - Tiny Tapeout workshop) tt_um_wokwi_469585758593419265 (spinner) tt_um_fp16_mac (FP32 Math Unit) tt_um_1DC_vga_dyoa (VGA Design Your Own ASIC) tt_um_haydenevans_top (Systolic Processing Element) tt_um_wokwi_469806252715961345 (TT_Proj_SA) tt_um_wokwi_469448996577604609 (Tiny Tapeout - Reto) tt_um_ehofmannbr_pmodvga_06 (VGA Color Tiles) tt_um_lfglabs_lsc1u (leanSilicon LSC-1 Micro arithmetic kernel) tt_um_wokwi_469804280240495617 (Zetterling SRAM) tt_um_wokwi_469806066852696065 (TileTestchase) tt_um_wokwi_469449118072978433 (binary_add_v1) tt_um_voltage_amplifier_neuron (Voltage Amplfier Neuron) tt_um_wokwi_469449686545956865 (Tiny Tapeout Template Copy_JinoShiono) tt_um_wokwi_469448887171240961 (Tiny Tapeout - Mini CORDIC) tt_um_wokwi_469809033878555649 (Tiny Tapeout Yummy Chip - bgianfo) tt_um_sirajmuhammad_bpsk_mod (BPSK Baseband Modulator) tt_um_K_coder_9 (TENs device frequency controller) tt_um_wokwi_469758119198926849 (LL_6BitShiftRegister_ToggleEnabledFeedback) tt_um_Asaadkhex_6x6u (6x6 UART Bussbar Switch) tt_um_wokwi_469809198944364545 (tt8-8bit-cpu Copy) tt_um_wokwi_469710279607305217 (Tiny Tapeout Submission KL - SiliDize) tt_um_wokwi_469629799092815873 (2:1 Mux with differential outputs) tt_um_poundbrad_reciprocal_counter (Two-Channel Reciprocal Counter) tt_um_joonatanalanampa_cordic (CORDIC-1) tt_um_x4ntha_nova (Data General Nova 1200 CPU) tt_um_quick_bus (quick_bus) tt_um_wokwi_470058539448408065 (Nigel's Tiny Tapeout Project) tt_um_wokwi_470058244557293569 (Tiny Tapeout Kabisan) tt_um_wokwi_470058241869790209 (Abdi's desgin) tt_um_wokwi_470060107756808193 (Sukhraj Deol's Chip) tt_um_wokwi_470058578588614657 (The Chip of Master George Stead) tt_um_wokwi_470069286344622081 (Tiny Tapeout ISHA) tt_um_ucl_display (Flashing... lights) tt_um_wokwi_470058746279043073 (Arihant's first Wokwi design) tt_um_wokwi_470060103260512257 (Tiny Tapeout Jabriel Copy) tt_um_wokwi_470069460157662209 (haadi's tiny tapeout) tt_um_wokwi_470058418706939905 (Kitty) tt_um_wokwi_470058490118136833 (Iris) tt_um_wokwi_470060098828179457 (Temz_ tiny tapeout) tt_um_wokwi_470058023187099649 (Osman WOKWI project 1) tt_um_wokwi_470057988621827073 (Viraj Tiny Template Full Adder TEST) tt_um_wokwi_470069802034377729 (Tiny Tapeout Template Copy) tt_um_wokwi_470070136685362177 (full adder) tt_um_wokwi_470070449402211329 (Anastasia Copy (2)) tt_um_wokwi_470059864883484673 (Keyaan’s first Wokwi design) tt_um_wokwi_470071200164912129 (full adder tiny tapeout Copy) tt_um_wokwi_470060671178857473 (SBUSixth First Chip Design Mentored by Tiny Tapeout) tt_um_wokwi_470099562753182721 (Isaac Tiny Tapeout) tt_um_wokwi_470120538476737537 (efwz8voices) tt_um_lelo_gr01_analogicus (LELO-GR01) tt_um_lelo_gr04_analogicus (LELO-GR04) tt_um_lelo_gr02_analogicus (LELO-GR02) tt_um_pump_out (60 Hz RMS Pump-Out Controller) tt_um_urish_simon (Simon Says memory game) tt_um_lelo_gr03_analogicus (LELO-GR03) tt_um_wokwi_470299374901578753 (Shrimp) tt_um_vga_clock (VGA clock) tt_um_frequency_counter (Frequency counter) tt_um_z2a_rgb_mixer (RGB Mixer demo) tt_um_mattvenn_r2r_dac_3v3 (Analog 8 bit 3.3v R2R DAC) tt_um_rebeccargb_universal_decoder (Universal Binary to Segment Decoder) tt_um_rebeccargb_hardware_utf8 (Hardware UTF Encoder/Decoder) tt_um_rebeccargb_intercal_alu (INTERCAL ALU) tt_um_rebeccargb_vga_pride (VGA Pride) tt_um_ogggggish_ota_ldo (SSF Capless LDO) tt_um_hariri4534_audioplayback (audioplayback) tt_um_wokwi_470637150792846337 (Joni - Tiny Tapeout Teardown2026 Workshop) tt_um_wokwi_470635013242210305 (Tom's first Wokwi design) tt_um_wokwi_470635780983408641 (Tiny Tapeout-AyeshaTeardown26) tt_um_wokwi_470639152626282497 (KeKoaM Tiny Tapeout) tt_um_wokwi_470637073520124929 (Tiny Tapeout workshop) tt_um_toby43479_iox (IO Expander with PWM) tt_um_wokwi_470635764113915905 (Divider Demo) tt_um_wokwi_470635580461052929 (Mann-teardown-project) tt_um_wokwi_470639672984256513 (KCs 001 TinyTapeout Design) tt_um_wokwi_470635507665754113 (Tiny Tapeout Template Copy) tt_um_wokwi_470637047364443137 (Pixel-Curio-Chip) tt_um_terihear_tinytearout (TinyTearout) tt_um_wokwi_470643025042834433 (TT 2026) tt_um_wokwi_470637360757626881 (Tiny Tapeout Template Copy) tt_um_wokwi_470635627278929921 (Tiny Tapeout Workshop) tt_um_wokwi_474471160110403585 (Cylon-Scanner) tt_um_wokwi_470646659230201857 (bloopbloop) tt_um_pthomas_sigma_delta (Continuous-Time Sigma-Delta ADC (1st order)) tt_um_sky_tpu_3x3 (Sky TPU 3x3) tt_um_tpcannon7_fir (tinyfir) tt_um_bruniliomuy_top (Fir_Filter) tt_um_semiqa_diff_opamp (Diff-In-Diff-Out-OpAmp) tt_um_TinyProcessor_naiyar_ (TinyProcessor) tt_um_CCDmos3D (ADC for CCDmos3D pixel) tt_um_snn_lif_neuron (snn_lif_neurons) tt_um_galaguna_NanoSys_fit (Nano-120_CPU@ler.uam.mx) tt_um_rowles_regime (Single-Bit Macro Regime Classifier) tt_um_rowles_fedmodel (The Fed Model (F1/F2)) tt_um_sky26c (tt_sky26c) tt_um_aka_regfile_ecc (regfile_ecc) tt_um_fwilson12_mac (int8 MAC) tt_um_davidbroughsmyth_ecg_sar12 (heart_monitor_adc_art) tt_um_foxworks_picorv32 (TCD Foxworks PicoRV32) tt_um_saltworks_ndf_c32 (Neural dataflow fabric — bit-serial MAC cells on a self-routing switch) tt_um_yjeum11 (DTMF (Touch-Tone) decoder) tt_um_vedic_mult (4-bit Vedic Multiplier) tt_um_atx_phased_interferometer (Acoustic Interferometer) tt_um_tilesos_dual_adc (Dual-Path Noise-Shaping ADC) tt_um_darga_cirom (Darga CiROM digital read + ternary MAC) tt_um_azara_cirom (Azara CiROM ternary read) tt_um_spi_reg_bank (8-bit Modified RISC-V) tt_um_aialaqili_updown_counter (4-bit Up/Down Counter) tt_um_noahzperez29_riscv_core (Noah RISC-V Core) tt_um_fp8_fpu (FP8 (E4M3) Floating-Point Unit) tt_um_costinemanuelv_gps_daily_trigger (GPS Daily Trigger) tt_um_ja_achtung_1x1 (JA Achtung Compact) tt_um_ja_achtung_1x2 (JA Achtung Full) tt_um_pwm_spice (spice-pwm-tapeout) tt_um_wecallemjazzyfact_bgr_ldo (BGR + LDO 3.3V/1.8V Integrated IP) tt_um_lelo_temp_wulffern (LELO-TEMP) tt_um_wokwi_472389622799861761 (3-Bit 101 Pattern Detector) tt_um_LnL_SoC (Lab and Lectures SoC) tt_um_dash_lucas_risc (risc_processor) tt_um_serdes_ephotonics (UCIe-style SERDES with analog TX driver & RX slicer) tt_um_joram200 (Kalman Filter Hardware Accelerator) tt_um_colbywonn_poly_synth (Poly Synth v1.0) tt_um_nobleg30_uart_vga_scroller (UART VGA Text Scroller) tt_um_multi_precision_mult (Multi-Precision Multiplier) tt_um_pratibha_munnangi_qkt_mac (QKT MAC Accelerator) tt_um_akankaan_bf16_fma (BF16 Fused Multiply-Add (FMA)) tt_um_rtfce (RTFCE - Reconfigurable Temporal Fault/Constraint Engine) tt_um_hdc_classifier (HDC Classifier) tt_um_preethi8a_adaptive_lfsr_prng (Self-Seeding Adaptive 16-bit Galois LFSR PRNG) tt_um_dilip951_cpu_systolic_array (Reconfigurable mixed-precision 2x2 systolic MAC array) tt_um_pqc_ntt_bfly (Crypto-Agile NTT Butterfly (ML-KEM / ML-DSA / FN-DSA)) tt_um_mlkem_coefficient_integrity (Fault-Aware Constant-Time FO Backend for ML-KEM) tt_um_vital_ap (VITAL-AP: Adaptive Pixel Register) tt_um_olaf8 (OLAF-8: Bounded-Memory Online Adaptive Fuzzy Inference) tt_um_Median_MAD (Streaming Median-MAD Estimator) tt_um_tnt_mosbius (tnt's variant of SKY130 mini-MOSbius) tt_um_undip_ann_q610 (UNDIP ANN Accelerator (SPI + bring-up self-test)) tt_um_cpu8 (CPU8) tt_um_vaishnavipatil5_configurable_cam (Configurable CAM with Masked Pattern Matching and Priority Resolution) tt_um_gina_env_monitor (Environmental Mapping Processor) tt_um_manasvibhat_bloom_filter (Bloom Filter Membership Tester) tt_um_amazing_sage_snn (LIF Neuron SNN) tt_um_nkanderson_lut_snn (LUT Spiking Network Classifier) tt_um_bigmanraffa_clm (Clementine: 4-lane int8 SIMT GPU) tt_um_adityarprasad_fft (Adaptive-Precision FFT) tt_um_oscillating_bones (Oscillating Bones) tt_um_silicon_edge_ns_sar_adc (NS SAR ADC) tt_um_sishi888_tinymind (TinyMind SoC) tt_um_afra_123_ecc_memory (Runtime-Reconfigurable ECC Memory) tt_um_kenchangh_mnist (MNIST Digit Recognition) tt_um_ece298a_8_bit_cpu_top (8-Bit CPU) tt_um_libormiller_SIMON_V2 (SIMON V2) tt_um_WaiMingLee888_nanov_1tile (NanoV RV32E one-tile RISC-V processor) tt_um_four_bit_nn_accel (4-bit Neural Network Accelerator) tt_um_rsa_simple (RSA Simple Encryptor) tt_um_synapticrw_lif_neuron (LIF Neuron (SynapticRW Teardown 2026)) tt_um_smunigan_ipv4_filter (IPv4 Header Filter) tt_um_jjy_spi_watchdog (SPI-Configurable Watchdog Timer) tt_um_osian_beam_controller (Programmable Metasurface Beam Controller) tt_um_namramazhar_popcnt_shiftreg (17-bit Wallace-tree POPCNT with shift-register input) tt_um_obookstay_puf (An arbiter PUF) tt_um_arminkardovic_montenegro_securekey (Montenegro SecureKey) tt_um_rcyaon_droop (All-Digital Supply Droop Detector) tt_um_ctw_spms (CTW-SPMS — Programmable Smart Power Management & Supervisor) tt_um_taiwoopesade_tempo_detector_sky26c (Hardware Audio Tempo Detector) tt_um_wokwi_470059878406973441 (Ehan's first TinyTapeout Project) tt_um_wokwi_470637170309995521 (My First Wokwi Thing!) tt_um_wokwi_470637401137246209 (Teardown Tiny Tapeout) tt_um_wokwi_469443433165025281 (Tiny Tapeout First Design Beth Plummer) tt_um_wokwi_472423526521678849 (4-bit to 5x7 Matrix Decoder for Tiny Tapeout) tt_um_wokwi_470057961258181633 (Tiny Tapeout Template Kavana) tt_um_wokwi_470057993933917185 (ivane- Tiny Tapeout (full adder)) tt_um_wokwi_470088776251343873 (training_project_kaylem) tt_um_neuropong (NeuroPong) tt_um_tamagotchi (TamaGotThis) tt_um_group02_seethebeat (SeeTheBeat) tt_um_kul_chromechain (Chrome Chain) tt_um_baked_weights (Baked-Weights Shakespeare GPT) tt_um_gilangfajrul_sar_adc (sar-adc) tt_um_Logy_FMAC (FMAC) tt_um_porkfreezer_rrio_opamp (RRIO Op-amp) tt_um_diff_engine (DSLX finite_difference) tt_um_dragonochi (WISH) tt_um_siliconsonics (ultrasonic sonar: range and bearing) tt_um_kul_conway (Interactive Conway's Game of Life) tt_um_algofoogle_ttsky26c_analog (Assorted analog in 1 tile) tt_um_mariavictoriaalm_qubit_sim ( tt-2qubit-sim) tt_um_andre_dpe (Dot product engine) tt_um_rmranjitkarNULL_pong_top (last_minute_Pong) tt_um_SAR_ADC (CTW LDO and Dynamic Comparator) tt_um_fabulous_sky_26c (Tiny FABulous FPGA) tt_um_tomvdsch_tiny32_soc (Tiny32 RV32IMA Zephyr-target SoC) tt_um_np523_pong (Pong) tt_um_usfq_adc_procmon (USFQ 8-bit Tracking ADC and Process Variation Monitor) tt_um_rangfuu_alu (Tiny ALU PD) tt_um_wokwi_473800139156677633 (Tiny Snake with PRISM 8) tt_um_mini_nn (Four-MAC Core Neural Network Inference Engine) tt_um_kianv_rv32_regfile (KianV uLinux RISC-V regfile edition) tt_um_2048_vga_game (2048 sliding tile puzzle game (VGA)) tt_um_urish_rings (VGA Rings) tt_um_silicon_art_vga_screensaver (VGA Screensaver with Silicon Art ROM) tt_um_rom_vga_screensaver (VGA Screensaver with embedded bitmap ROM) tt_um_krisjdev_manchester_baby (Manchester Baby) tt_um_urish_sic1 (SIC-1 8-bit SUBLEQ Single Instruction Computer) tt_um_ThomasCowieEngineering_LMC (Little Man Computer CPU) tt_um_pranavUl_ascon_aead128 (Ascon bit-serial permutation engine) tt_um_orca (ORCA — Online Reconfigurable Circuit with Adaptation) tt_um_krisjdev_artwork (Silicon Artwork) tt_um_htfab_caterpillar (Simon's Caterpillar) tt_um_htfab_vga_tester (Video mode tester) Available Available Available Available Available Available Available Available Available Available