290 8-Bit CPU

290 : 8-Bit CPU

Design render
  • Author: University of Waterloo - Fall 2024 ECE 298A
  • Description: A basic 8-bit CPU design building off the SAP-1
  • GitHub repository
  • Clock: 50000000 Hz

How it works

This project is a basic 8-bit CPU design building off the SAP-1. It is a combination of various modules developed as a part of the ECE298A Course at the University of Waterloo.

The control block is implemented using a 6 stage sequential counter for sequencing micro-instructions, and a LUT for corresponding op-code to operation(s).

The program counter enumerates all values between 0 and F (15) before looping back to 0 and starting again. The counter will clear back to 0 whenever the chip is reset.

The Instruction register stores the current instructions and breaks it up into the opcode and address, which are passed into corresponding locations

The 16 Byte memory module consists of 16 memory locations that store 1 byte each. The memory allows for both read and write operations, controlled by input signals, as well as data supplied by the MAR.

The MAR is a register which handles RAM interactions, namely specifying the address for store/load, as well as the data to be stored.

The 8-bit ripple carry adder assumes 2s complement inputs and thus supports addition and subtraction. It pushes the result to the bus via tri-state buffer. It also includes a zero flag and a carry flag to support conditional operation using an external microcontroller. These flags are synchronized to the rising edge of the clock and are updated when the adder outputs to the bus.

The Accumulator register functions to store the output of the adder. It is synchronized to the positive edge of the clock. The accumulator loads and outputs its value from the bus and is connected via tri-state buffer. The accumulator’s current value is always available as an output (and usually connected to the Register A input of the ALU)

The B register stores the second operand for ALU operations which is loaded from RAM.

The Output register outputs the value from register A onto the uo_out pins.

The 8 Bit Bus is driven by various blocks. We allow multiple blocks that are able to write using tri-state buffers.

Supported Instructions

Mnemonic Opcode Function
HLT 0x0 Stop processing
NOP 0x1 No operation
ADD {address} 0x2 Add B register to A register, leaving result in A
SUB {address} 0x3 Subtract B register from A register, leaving result in A
LDA {address} 0x4 Put RAM data at {address} into A register
OUT 0x5 Put A register data into Output register and display
STA {address} 0x6 Store A register data in RAM at {address}
JMP {address} 0x7 Change PC to {address}

Instruction Notes

  • All instructions consist of an opcode (most significant 4 bits), and an address (least significant 4 bits, where applicable)

Control Signal Descriptions

Control Signal Array Component Function
Cp 14 PC Increments the PC by 1
Ep 13 PC Enable signal for PC to drive the bus
Lp 12 PC Tells PC to load value from the bus
nLma 11 MAR Tells MAR when to load address from the bus
nLmd 10 MAR Tells MAR when to load memory from the bus
nCE 9 RAM Enable signal for RAM to drive the bus
nLr 8 RAM Tells RAM when to load memory from the MAR
nLi 7 IR Tells IR when to load instruction from the bus
nEi 6 IR Enable signal for IR to drive the bus
nLa 5 A Reg Tells A register to load data from the bus
Ea 4 A Reg Enable signal for A register to drive the bus
Su 3 ALU Activate subtractor instead of adder
Eu 2 ALU Enable signal for Adder/Subtractor to drive the bus
nLb 1 B Reg Tells B register to load data from the bus
nLo 0 Output Reg Tells Output register to load data from the bus

Sequencing Details

  • The control sequencer is negative edge triggered, so that control signals can be steady for the next positive clock edge, where the actions are executed.
  • In each clock cycle, there can only be one source of data for the bus, however any number components can read from the bus.
  • Before each run, a CLR signal is sent to the PC and the IR.

Instruction Micro-Operations

Stage HLT NOP STA JMP
T0 Ep, nLma Ep, nLma Ep, nLma Ep, nLma
T1 Cp Cp Cp Cp
T2 nCE, nLi nCE, nLi nCE, nLi nCE, nLi
T3 ** - nEi, nLma nEi, Lp
T4 - - Ea, nLmd
T5 - - nLr
Stage LDA ADD SUB OUT
T0 Ep, nLma Ep, nLma Ep, nLma Ep, nLma
T1 Cp Cp Cp Cp
T2 nCE, nLi nCE, nLi nCE, nLi nCE, nLi
T3 nEi, nLma nEi, nLma nEi, nLma Ea, nLo
T4 nCE, nLa nCE, nLb nCE, nLb -
T5 - Eu, nLa Su, Eu, nLa -

Instruction Micro-Operations Notes

  • First three micro-operations are common to all instructions.
  • NOP operation executes only the first three micro-operations.
  • Cp signal is not asserted during the HLT instruction in T2.
  • ** Halt internal register is set to 1. More on this later

Programmer

Stage Control Signals Programmer specific signals
T0 Ep, nLMA ready = 1
T1 Cp ready = 0
T2 - -
T3 nLmd read_ui_in = 1
T4 nLr read_ui_in = 0, done_load = 1
T5 - done_load = 0

Detailed Overview

T0: Control Signals the same as the typical default microinstruction \– load the MAR with the address of the next instruction. Assert ready signal to alert MCU programmer (off chip) that CPU is ready to accept next line of RAM data.

T1: Increment the PC, the same as the typical default microinstruction. De-assert ready signal since the MCU programmer is polling for the rising edge.

T2: Do nothing to allow an entire clock cycle for programmer to prepare the data.

T3: Load the MAR with the data from the bus. Also, assert the read_ui_in signal which controls a series of tri-state buffers, attaches the ui_in pins straight to the bus.

T4: Load the RAM from the MAR. De-assert the read_ui_in signal (disconnect the ui_in pins from driving the bus since the ui_in pin data might be now inaccurate). Assert the done_load signal to indicate to the MCU that the chip is done with the ui_in data.

T5: De-assert done_load signal.

Programmer Notes

The MCU must be able to provide the data to the ui_in pins (steady) between receiving the ready signal (assume worst case end of T0), and the bus needing the values (assume worst case beginning of T3).

Therefore, the MCU must be able to provide the data at a maximum of 2 clock periods.

IO Table: CB (Control Block)

Name Verilog Description I/O Width Trigger
clk clk Clock signal I 1 Edge Transition
resetn rst_n Set stage to 0 I 1 Active Low
opcode opcode Opcode from IR I 4 NA
out control_signals Control Signal Array O 15 NA
programming programming Programming mode I 1 Active High
done_load done_load Executed Load during prog O 1 Active High
read_ui_in read_ui_in Push ui_in onto bus O 1 Active High
ready ready_for_ui Ready to prog next byte O 1 Active High
HF HF Halting flag O 1 Active High

IO Table: PC (Program Counter)

Name Verilog Description I/O Width Trigger
bus bus[3:0] Connection to bus IO 4 NA
clk clk Clock signal I 1 Falling Edge
clr_n rst_n Clear to 0 I 1 Active Low
cp Ep Allow counter increment I 1 Active High
ep Cp Output to bus I 1 Active High
lp Lp Load from bus I 1 Active High

PC (Program Counter) Notes

  • Counter increments only when Cp is asserted, otherwise it will stay at the current value.
  • Ep controls whether the counter is being output to the bus. If this signal is low, our output is high impedance (Tri-State Buffers).
  • When CLR is low, the counter is cleared back to 0, the program will restart.
  • The program counter updates its value on the falling edge of the clock.
  • Lp indicates that we want to load the value on the bus into the counter (used for jump instructions). When this is asserted, we will read from the bus and instead of incrementing the counter, we will update each flip-flop with the appropriate bit and prepare to output.
  • The least significant 4 bits from the 8-bit bus will be used to store the value on the program counter (0-15). Will be read from (JMP asserted) and written to (Ep asserted).
  • clr_n has precedence over all.
  • Lp takes precedence over Cp.

IO Table: Instruction Register (IR)

Name Verilog Description I/O Width Trigger
bus bus Connection to bus IO 8 NA
clk clk Clock signal I 1 Rising Edge
clear ~rst_n Clear to 0 I 1 Active High
opcode opcode Opcode from IR O 4 NA
n_load nLi Load from Bus I 1 Active Low
n_enable nEi Output to bus O 1 Active Low

Instruction Register (IR) Notes

  • The A Register updates its value on the rising edge of the clock.
  • nEi controls whether the instruction is being output to the bus[3:0]. If this signal is high, our output is high impedance (Tri-State Buffers).
  • nLi indicates that we want to load the value on the bus into the IR. When this is low, we will read from the bus and write to the register.
  • When clear is high, the opcode is cleared back to NOP.
  • IR always outputs the current value of the register to CB.

IO Table: RAM

Name Verilog Description I/O Width Trigger
addr mar_to_ram_addr Address for read/write I 4 NA
data_in mar_to_ram_data Data for write I 8 NA
data_out bus Connection to bus O 8 NA
lr_n nLr Load data from MAR I 1 Active Low
ce_n nCE Output to bus I 1 Active Low
clk clk Clock Signal I 1 Rising edge
rst_n '1' Clear RAM I 1 Active Low

RAM Notes

  • Addressing: The memory is 4-bit addressable, where the address specifies which register (out of 16) is being accessed for reading or writing.
  • Write operation: A byte of data is written to specific register in RAM, where the location is determined by the address. Requires write enable lr_n signal as active (low) and the clock edge to occur.
  • Read operation: Data can be read from a specific register in RAM determined by the input address. Requires chip enable ce_n signal as active (low). The data is output on the bus, and it is updated on the clock edge.
  • Output: Data is presented on the bus line when the chip is enabled for reading, and high-impedance (Z) otherwise.
  • RAM is never reset, rather, we always flash it.

IO Table: MAR

Name Verilog Description I/O Width Trigger
bus bus Connection to bus IO 8 NA
clk clk Clock signal I 1 Rising Edge
addr mar_to_ram_addr Address for read/write O 4 NA
data mar_to_ram_data Data for write O 8 NA
n_load_data nLmd Load data from Bus I 1 Active Low
n_load_addr nLma Load address from Bus I 1 Active Low

MAR Notes

  • The MAR updates its value on the rising edge of the clock.
  • nLmd indicates that we want to load the value on the bus into the data register. When this is low, we will read from the bus and write to the register.
  • nLma indicates that we want to load the value on the bus[3:0] into the address register. When this is low, we will read from the bus and write to the register.
  • MAR always outputs the current value of the data and address registers to the RAM module.

IO Table: ALU (Adder/Subtractor)

Name Verilog Description I/O Width Trigger
clk clk Clock Signal I 1 Rising edge
enable_out Eu Output to bus I 1 Active High
Register A reg_a Accumulator Register I 8 NA
Register B reg_b Register B I 8 NA
subtract sub Perform Subtraction I 1 Active High
bus bus Connection to bus O 8 NA
Carry Out CF Carry-out flag O 1 Active High
Result Zero ZF Zero flag O 1 Active High

ALU (Adder/Subtractor) Notes

  • Eu controls whether the counter is being output to the bus. If this signal is low, our output is high impedance (Tri-State Buffers).
  • A Register and B Register always provide the ALU with their current values.
  • When sub is not asserted, the ALU will perform addition: Result = A + B
  • When sub is asserted, the ALU will perform subtraction by taking 2s complement of operand B: Result = A - B = A + !B + 1
  • Carry Out and Result Zero flags are updated on rising clock edge.

IO Table: Accumulator (A) Register

Name Verilog Description I/O Width Trigger
clk clk Clock Signal I 1 Rising edge
bus bus Connection to bus IO 8 NA
load nLa Load from bus I 1 Active Low
enable_out Ea Output to bus I 1 Active High
Register A reg_a Accumulator Register O 8 NA
clear rst_n Clear Signal I 1 Active Low

Accumulator (A) Register Notes

  • The A Register updates its value on the rising edge of the clock.
  • Ea controls whether the counter is being output to the bus. If this signal is low, our output is high impedance (Tri-State Buffers).
  • nLa indicates that we want to load the value on the bus into the A Register. When this is low, we will read from the bus and write to the register.
  • When CLR is low, the register is cleared back to 0.
  • (Register A) always outputs the current value of the register to the ALU.

IO Table: B Register

Name Verilog Description I/O Width Trigger
bus bus Connection to bus IO 8 NA
clk clk Clock Signal I 1 Rising edge
n_load nLb Load from bus I 1 Active Low
value reg_b B Register value O 8 NA

B Register Notes

  • The B Register updates its value on the rising edge of the clock.
  • nLb indicates that we want to load the value on the bus into the B Register. When this is low, we will read from the bus and write to the register.
  • B Register always outputs the current value of the register to the ALU.

IO Table: Output Register

Name Verilog Description I/O Width Trigger
bus bus Connection to bus IO 8 NA
clk clk Clock Signal I 1 Rising edge
n_load nLo Load from bus I 1 Active Low
value uo_out B Register value O 8 NA

Output Register Notes

  • The Output Register updates its value on the rising edge of the clock.
  • nLo indicates that we want to load the value on the bus into the B Register. When this is low, we will read from the bus and write to the register.

How to test

Provide input of op-code. Check that the correct output bits are being asserted/de-asserted properly.

Setup

  1. Power Supply: Connect the chip to a stable power supply as per the voltage specifications.
  2. Clock Signal: Provide a stable clock signal to the clk pin.
  3. Reset: Ensure the rst_n pin is properly connected to allow resetting the chip.

Testing Steps

  1. Initial Reset:

    • Perform a sync reset by pulling the rst_n pin low, waiting for 1 clock signal, and then pulling pulling the rst_n high to initialize the chip.
  2. Load Program into RAM:

    • Use the ui_in pins to load a test program into the RAM. Ensure the programming pin is high during this process.

    • Perform a sync reset by pulling the rst_n pin low, waiting for 1 clock signal, and then pulling pulling the rst_n high to initialize the chip.

    • Wait for the ready_for_ui signal to go high, indicating that the CPU is ready to accept data.

    • Provide the first byte of data on the ui_in pins.

    • Wait for the done_load signal to go high, indicating that the data has been successfully loaded into the RAM.

    • Repeat the process for each byte of data:

      • Wait for ready_for_ui to go high.
      • Provide the next byte of data on the ui_in pins.
      • Wait for done_load to go high.
    • Example program data:

          0x10,  # NOP
          0x73,  # JMP 0x3
          0x00,  # HLT
          0x4F,  # LDA 0xF
          0x2E,  # ADD 0xE
          0x6D,  # STA 0xD
          0x50,  # OUT
          0x3F,  # SUB 0xF
          0x50,  # OUT
          0x4D,  # LDA 0xD
          0x50,  # OUT
          0x72,  # JMP 0x2
          0x10,  # NOP
          0x00,  # Padding/empty instruction
          0x02,  # Constant 2 (data)
          0x01   # Constant 1 (data)
      
  3. Run Test Program:

    • Set the programming pin low to exit programming mode.
    • Perform a sync reset by pulling the rst_n pin low, waiting for 1 clock signal, and then pulling pulling the rst_n high to initialize the chip.
    • Monitor the uo_out and uio_out pins for expected outputs.
    • Verify the control signals and data outputs at each clock cycle.
  4. Functional Tests:

    • Perform specific functional tests for each instruction (e.g., ADD, SUB, LDA, STA, JMP, HLT).
    • Verify the correct execution of each instruction by checking the output and control signals.

Example Test Cases

  • HLT Instruction: Example program data:

        0x4E,  # LDA 0xE
        0x50,  # OUT
        0x00,  # HLT
        0x4F,  # LDA 0xF
        0x50,  # OUT
        0x00,  # HLT
        0x00,  # Padding/empty instruction
        0x00,  # Padding/empty instruction
        0x00,  # Padding/empty instruction
        0x00,  # Padding/empty instruction
        0x00,  # Padding/empty instruction
        0x00,  # Padding/empty instruction
        0x00,  # Padding/empty instruction
        0x00,  # Padding/empty instruction
        0x09,  # Constant 9 (data)
        0xFF   # Constant 255 (data)
    

    This program should first output 9 and then NOT change that to 255. HF should be set to 1

  • NOP Instruction: Example program data:

        0x42,  # LDA 0x2
        0x50,  # OUT
        0x10,  # NOP / Constant 16 (data)
        0x1F,  # NOP
        0x1F,  # NOP
        0x1F,  # NOP
        0x1F,  # NOP
        0x1F,  # NOP
        0x1F,  # NOP
        0x1F,  # NOP
        0x1F,  # NOP
        0x1F,  # NOP
        0x4E,  # LDA 0xF
        0x50,  # OUT
        0x1F,  # NOP
        0x1F,  # NOP / Constant 31 (data)
    

    This program should flash the lower 4 bits of the output register on and off with different on/off times

  • NOP Instruction: Example program data:

        0x42,  # LDA 0x2
        0x50,  # OUT
        0x10,  # NOP / Constant 16 (data)
        0x1F,  # NOP
        0x1F,  # NOP
        0x1F,  # NOP
        0x1F,  # NOP
        0x1F,  # NOP
        0x1F,  # NOP
        0x1F,  # NOP
        0x1F,  # NOP
        0x1F,  # NOP
        0x4E,  # LDA 0xF
        0x50,  # OUT
        0x1F,  # NOP
        0x1F,  # NOP / Constant 31 (data)
    

    This program should flash the lower 4 bits of the output register on and off with different on/off times

  • ADD Instruction Example program data:

        0x50,  # OUT
        0x2E,  # ADD 0xE
        0x70,  # JMP 0x0
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0x01,  # Constant 1 (data)
        0xFF,  # Padding/empty instruction
    

    This program should add 1 to the A register, display it and loop back to the start. The output should be a counter from 0 to 255, then repeat.

    CF should be set to 1 when the A register overflows, and 0 when it doesn't. CF=1 happens when the A register is 255 and 1 is added to it.

    ZF should be set to 1 when the A register is 0, and 0 otherwise.

  • SUB Instruction Example program data:

        0x50,  # OUT
        0x3E,  # SUB 0xE
        0x70,  # JMP 0x0
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0x01,  # Constant 1 (data)
        0xFF,  # Padding/empty instruction
    

    This program should subtract 1 to the A register, display it and loop back to the start. The output should be a counter from 255 to 0, then repeat.

    CF should be set to 1 when the A register overflows, and 0 when it doesn't. CF=0 happens when the A register is 0 and 1 is subtracted from it.

    ZF should be set to 1 when the A register is 0, and 0 otherwise.

  • LDA Instruction

    See above for example program data.

  • OUT Instruction

    See above for example program data.

  • STA Instruction

    Example program data:

        0x4E,  # LDA 0xE
        0x2F,  # ADD 0xF
        0x5F,  # OUT
        0x6E,  # STA 0xF
        0x2F,  # ADD 0xE
        0x5F,  # OUT
        0x00,  # HLT
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0x09,  # Constant 9 (data)
        0xFF   # Constant 255 (data) -> Constant 8 (data)
    

    This program should load 9 to the A register, add 255 to it, resulting in 8 (CF should set to 1) display it, store it in 0xF, add 9 to it, resulting in 17 (CF should set to 0) and display it. Then, it should halt, and set HF to 1.

  • JMP Instruction

    Example program data:

        0x44,  # LDA 0x4
        0x5F   # OUT
        0x7D,  # JMP 0xD
        0x0F,  # HLT
        0x00,  # Constant 0 (data)
        0xFF,  # Constant 5 (data)
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0xFF,  # Padding/empty instruction
        0x45,  # LDA 0x5
        0x5F   # OUT
        0x0F,  # HLT
    

    This program should load 0x4 (0) to the A register, display it, NOT HALT, jump to 0xD, then load 0x5 (255) to the A register, display it, and halt. HF should be set to 1.

Acknowledgements

  • Darius Rudaitis, Eshann Mehta: RAM
  • Evan Armoogan, Catherine Ye: PC
  • Damir Gazizullin, Owen Golden: ALU, Accumulator
  • Roni Kant, Jeremy Kam: MAR, B Register, Output Register, Instruction Register
  • Gerry Chen, Siddharth Nema: Control Block and Programmer
  • ECE 298A Course Staff: Prof. John Long, Prof. Vincent Gaudet, Refik Yalcin

IO

#InputOutputBidirectional
0prog_in_0output_register_0in_programming
1prog_in_1output_register_1out_ready_for_ui
2prog_in_2output_register_2out_done_load
3prog_in_3output_register_3out_CF
4prog_in_4output_register_4out_ZF
5prog_in_5output_register_5out_HF
6prog_in_6output_register_6
7prog_in_7output_register_7

Chip location

Controller Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Analog Mux 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 (TinyTapeout Factory Test) tt_um_led_matrix_ayla_lin (32x8 LED Matrix Animation) tt_um_urish_charge_pump (Dickson Charge Pump) tt_um_rebeccargb_tt09ball_screensaver (TT09Ball VGA Screensaver) tt_um_urish_simon (Simon Says memory game) tt_um_rebeccargb_tt09ball_gdsart (TT09Ball GDS Art) tt_um_rebeccargb_vga_pride (VGA Pride) tt_um_levenshtein (Fuzzy Search Engine) tt_um_rebeccargb_colorbars (Color Bars) tt_um_jamesrosssharp_1bitam (1bit_am_sdr) tt_um_mattvenn_double_inverter (Analog double inverter) tt_um_htfab_hybrid (Telephone hybrid) tt_um_mattvenn_analog_ring_osc (Ring Oscillators) tt_um_brandonramos_opamp_ladder (2-bit Flash ADC) tt_um_wokwi_411783629732984833 (BINCounterAndGates) tt_um_rebeccargb_hardware_utf8 (Hardware UTF Encoder/Decoder) tt_um_patdeegan_anamux (Analog MUX module) tt_um_MichaelBell_hs_mul (8b10b decoder and multiplier) tt_um_rebeccargb_styler (Styler) tt_um_rebeccargb_vga_timing_experiments (VGA Timing Experiments) tt_um_rebeccargb_universal_decoder (Universal Binary to Segment Decoder) tt_um_rebeccargb_intercal_alu (INTERCAL ALU) tt_um_toivoh_pio_ram_emu_example (pio-ram-emulator example: Julia fractal) tt_um_2048_vga_game (2048 sliding tile puzzle game (VGA)) tt_um_tobimckellar_top (Simple PWM Module) tt_um_JesusMinguillon_freqSweep (freqSweep) tt_um_led_cipher (LED Bitserial Cipher) tt_um_wokwi_412367067047460865 (achasen workshop validation) tt_um_wokwi_412635532198550529 (tt09-pettit-wokproc-trainer) tt_um_my_elevator (Elevator Design) tt_um_wokwi_413387014781302785 (L display) tt_um_wokwi_413387348132056065 (S-R latch) tt_um_wokwi_413387032609197057 (Gabe's Big AND) tt_um_wokwi_413387015959903233 (Secret Code) tt_um_wokwi_413387076188030977 (joes-first-tiny-tapeout) tt_um_wokwi_413387481972305921 (Abey's 1st Chip Design) tt_um_wokwi_413391266378724353 (patrick's project) tt_um_wokwi_413387120998931457 (Shadoff Test) tt_um_wokwi_413387462882977793 (Tiny Tapeout Take 2) tt_um_wokwi_413387224567846913 (Speller) tt_um_wokwi_413387065339458561 (APA102 to WS2812 Translator) tt_um_wokwi_413387064715554817 (RAYS FIRST TAPEOUT rev 2) tt_um_wokwi_413387352465821697 (6 Bit shift register) tt_um_wokwi_413385294512575489 (Duffy) tt_um_wokwi_413387190167208961 (Will It NAND?) tt_um_wokwi_413386988538584065 (Bad Logic) tt_um_wokwi_413387186248679425 (Drew's First Wokwi Design) tt_um_wokwi_413387152803294209 (Pseudo Random Generator Using 2 Ring Oscillators) tt_um_wokwi_413387214966034433 (JonsFirstTapeout) tt_um_wokwi_413386991502909441 (SPI Logic Analyzer with Charlieplexed Display) tt_um_wokwi_413387122850717697 (And Gates that don't do much) tt_um_wokwi_413387009513254913 (SimplePattern) tt_um_wokwi_413387093939376129 (sphereinabox hello) tt_um_wokwi_413386973689694209 (Input Counter) tt_um_rburt16_opamp_3stage (OpAmp 3stage) tt_um_alf19185_ALU (4 bit ALU ) tt_um_rtfb_collatz (Collatz conjecture brute-forcer) tt_um_senolgulgonul (Senol Gulgonul tt09) tt_um_tnt_rom_test (TT09 SKU130 ROM Test) tt_um_tnt_rom_nolvt_test (TT09 SKY130 ROM Test (no LVT variant)) tt_um_Esteban_Oman_Mendoza_maze_2024_top (Space Detective Maze Explorer) tt_um_sebastienparadis_hamming_top (Hamming Code (7,4)) tt_um_couchand_analog_switch (Analog Switch) tt_um_prefix8 (tiny-tapeout-8bit-GPTPrefixCircuit) tt_um_lif_tk (LIF on a Ring Topology) tt_um_asheldon44_dsm_decimation_filter (Delta-Sigma ADC Decimation Filter) tt_um_juarez_jimenez (an lfsr with synaptic neurons (excitatory or inhibitatory)) tt_um_lif_clarencechan28 (Perceptron) tt_um_uart_mvm (Matmul System) tt_um_lif_sfiguerr (Adaptive Leaky Integrate and Fire Neuron) tt_um_algofoogle_tt09_ring_osc (Verilog ring oscillator) tt_um_pid_controller (PID Controller) tt_um_frequency_counter (Frequency Counter SSD1306 OLED) tt_um_delta_liafn (Delta RNN and Leaky Integrate-and-Fire Nueron Circuit) tt_um_devinatkin_basys3_uart (Basys 3 Over UART Link) tt_um_array_mult_structural_GnahsLliw (Array Multiplier) tt_um_array_mult_structural_sarahherrera (Array Multiplier) tt_um_a3_array_multiplier (Array multiplier) tt_um_a_4_array_multiplier (Array Multiplier) tt_um_secA_group5_array_multiplier (ECE-2204 4x4 Array Multiplier) tt_um_A_6_array_multiplier (ECE2204 4x4 Array Multiplier) tt_um_a_0_array_multiplier (Array Multiplier) tt_um_array_mult_structural (ece2204 project for tapeout) tt_um_m4rthaswur1d (4x4 array multiplier) tt_um_arry_mult_structural (4-bit-array-multiplier) tt_um_LabA_Group11 (Array_Multiplier) tt_um_pwm_top (Generador PWM multiproposito con frecuencia y ciclo de trabajo modulable) tt_um_lfsr_stevej (Linear Feedback Shift Register) tt_um_jamesrosssharp_tiny1bitam (Tiny 1-bit AM Radio) tt_um_instrumented_ring_oscillator (instrumented_ring_oscillator) tt_um_lif1 (STDP Circuit) tt_um_wokwi_413871526879619073 (4-1 mux) tt_um_wokwi_413872016164217857 (2bit adder) tt_um_alif (3 Neuron ALIF) tt_um_tiny_ternary_tapeout (T3 (Tiny Ternary Tapeout)) tt_um_snn_with_delays_paolaunisa (ChatGPT-generated Spiking Neural Network with Delays) tt_um_kmakise_sram (OpenRAM SRAM macro) tt_um_secA_11_nyancar_alanz23 (ece2204_4x4_mult) tt_um_arandomdev_fir_engine_top (FIREngine) tt_um_b_0_array_multiplier (Lab B Group 1 Array Multiplier) tt_um_b_2_array_multiplier (Array Multiplier) tt_um_b_6_array_multiplier (4x4 Array Multiplier) tt_um_multiplier (4x4 Array Multiplier) tt_um_b_12_array_multiplier (ECE2204 4x4 Array Multiplier) tt_um_wokwi_413686101237123073 (comparator) tt_um_B_14_array_multiplier (4x4 Array Multiplier) tt_um_secB_15_array_multiplier (Array Multiplier) tt_um_array_mult_joe_leighthardt (4 bit array multiplier) tt_um_carryskip_adder8 (8-bit carry-skip) tt_um_riscv_mini (RISC-V Mini) tt_um_CLA8 (8-bit Carry Look-Ahead Adder) tt_um_hybrid_adder (Hybrid_Adder_8bit) tt_um_C_1_4bit_multiplier (my_4bit_multiplier) tt_um_c_2_array_mult (4-bit-multiplier) tt_um_c7_array_mult (4-bit Multiplier) tt_um_4x4multiplier (4x4multiplier) tt_um_c13_array_mult (4-bit Multiplier) tt_um_arrayMultFajrSahana (4x4 Multiplier) tt_um_wokwi_413916532008126465 (tt09 kathyhtt ) tt_um_wokwi_413919522908184577 (TINY TAPE OUT) tt_um_wokwi_413923260134423553 (TinyTapeout1) tt_um_wokwi_413919531169918977 (FB GDS) tt_um_wokwi_413919794360480769 (Metastable Chip) tt_um_four_bit_multiplier_nasan016_npham2003 (4-bit Multiplier) tt_um_wokwi_413919484652961793 (halfadder+not) tt_um_wokwi_413918279810604033 (MuxLED) tt_um_wokwi_413919458626244609 (Jacks First Project) tt_um_wokwi_413919492911554561 (Half adder) tt_um_wokwi_413919972072132609 (Andrew Vo - Repository) tt_um_wokwi_413919970097662977 (Dipankar's first Wowki design) tt_um_wokwi_413923245817165825 (Hamad's design) tt_um_wokwi_413919502227108865 (Encoder) tt_um_wokwi_413923188546028545 (GDS) tt_um_wokwi_413920370058172417 (2 Bit Times 2 Bit Plus 4 Bit MAD and 5 Bit Binary to 7 Segment Display) tt_um_wokwi_413918244906651649 (Not Good BCD Decoder) tt_um_wokwi_413919507057902593 (tinytapeoutkr) tt_um_wokwi_413920096493033473 (My First ASIC) tt_um_wokwi_413921849611724801 (Yared Fente's Tiny Tapeout) tt_um_wokwi_413918243645213697 (Yohan Tiny Tapeout Project) tt_um_wokwi_413919889872144385 (Tiny Tapeout) tt_um_4x4_array_multiplier_NuKoP (4 x 4 array multiplier NuKoP) tt_um_wokwi_413920489444856833 (Samson's Tiny Tapout Project) tt_um_wokwi_413923702485727233 (tinytapeout) tt_um_wokwi_413919752282163201 (Trubick - Tiny Tapeout Logic Gate) tt_um_wokwi_413925554587918337 (D_flipflop_hold_test) tt_um_wokwi_413919500942601217 (Bit Counter) tt_um_wokwi_413919666547418113 (Full bit adder) tt_um_wokwi_413920825278643201 (Encoder) tt_um_wokwi_413919543420439553 (Big J's Big Circuit) tt_um_wokwi_413919927206703105 (AndLogicPass) tt_um_wokwi_413920640800531457 (Half Adder) tt_um_wokwi_413917903548951553 (Jordan) tt_um_wokwi_413919465666386945 (OR gate) tt_um_wokwi_413920442846133249 (TinyTapeOut) tt_um_wokwi_413920033033205761 (Tiny Tapeout-Huerta) tt_um_wokwi_413923202390383617 (Light LED) tt_um_wokwi_413923150973445121 (Zero to Nine Display Count) tt_um_wokwi_413919565287453697 (APTT) tt_um_wokwi_413919777312727041 (Tahiti) tt_um_wokwi_413920089540972545 (Secret Initial) tt_um_wokwi_413919675346023425 (GJAA Design) tt_um_wokwi_413919847886104577 (Logic Gates) tt_um_wokwi_413921288682183681 (My First TinyTapeout) tt_um_wokwi_413919524873217025 (1st) tt_um_wokwi_413919454053401601 (JCB First WOKWI Design) tt_um_wokwi_413923045171059713 (Logic Gates 7-Segment Display) tt_um_wokwi_413919767806333953 (BadeTP) tt_um_wokwi_413919428470231041 (Lynn's TinyTapeout Design) tt_um_wokwi_413929752291913729 (project) tt_um_wokwi_413923521595851777 (Nathan's chip) tt_um_wokwi_413920340558577665 (Light) tt_um_uart_mvm_sys (Matmul System) tt_um_wokwi_413407859783959553 (Redco) tt_um_wokwi_413849515516143617 (Two PFD) tt_um_wokwi_413919454138338305 (Letter H) tt_um_wokwi_413960876763056129 (Binary to 7 Segment Display Decoder) tt_um_MichaelBell_hd_8b10b (8b10b decoder and multiplier) tt_um_program_counter_top_level (Test Design 1) tt_um_murmann_group (Decimation Filter for Incremental and Regular Delta-Sigma Modulators) tt_um_adder_accumulator_sathworld (adder-accumulator) tt_um_control_block (8-Bit CPU) tt_um_LFSR_Encrypt (LFSR Encrypter) tt_um_cdc_test (SkyKing Demo) tt_um_two_lif_stdp (Two LIF Neurons with STDP Learning) tt_um_underserved (ITS-RISCV) tt_um_mbkmicdec_ringosc (Time_Domain_Comparator_ITS) tt_um_znah_vga_ca (znah_vga_ca) tt_um_tim2305_adc_dac (tt_um_tim2305_adc_dac) tt_um_mikegoelzer_7segmentbyte (7-Segment Byte Display) tt_um_idann (Forward Pass Network for Simple ANN) tt_um_micro_tiles_container (Micro tile container) tt_um__kwr_lfsr__top (Multi-LFSR) tt_um_wokwi_413923639862662145 (xor gate with registered output ) tt_um_carryskip_adder9 (carry skip adder) tt_um_mroblesh (Frequency Encoder and Decoder) tt_um_wokwi_411379488132926465 (Semana UCU Verilog) tt_um_rejunity_atari2600 (Atari 2600) tt_um_rejunity_z80 (Zilog Z80) tt_um_b_8_array_multiplier (4 by 4 Array Multiplier) tt_um_C8_array_mult (4-bit multiplier) tt_um_tt09_array_multiplier (Array Multiplier) tt_um_array_mult_structural_sectionD_group3 (4-bit Array Multiplier) tt_um_d_4_array_multiplier (ECE-UY 2204 4x4 Array Multiplier) tt_um_couchand_cora16 (CORA-16) tt_um_secd_8_array_mult (array_multiplier) tt_um_kashmaster_carryskip (8-bit-CARRY_SKIP) tt_um_tiny_ternary_tapeout_csa (T3 (Tiny Ternary Tapeout) CSA ) tt_um_array_secD7 (Tiny Tapeout Group 7 Lab D) tt_um_chip4lyfe (Leaky Integrate Fire Neuron) tt_um_ronikant_jeremykam_tinyregisters (Tiny Registers) tt_um_c_4_4b_mult (4bit multiplier) tt_um_section_d_group_fifteen_array_mult_structural (ECE2204MultiplierProject) tt_um_VanceWiberg_top (Team 17's 8 bit DAC) tt_um_claudiotalarico_counter (4-bit up/down binary counter) tt_um_wokwi_413471588783557633 (TT Test) tt_um_gmejiamtz (Configurable Logic Block) tt_um_I2C (I2C and SPI) tt_um_perceptron_mtchun (Perceptron Neuron) tt_um_histogramming (Histogramming) tt_um_SarpHS_array_mult (4-bit Multiplier) tt_um_gfcwfzkm_scope_bfh_mht1_3 (Basic Oszilloscope and Signal Generator) tt_um_MichaelBell_rle_vga (RLE Video Player) tt_um_ece298a_8_bit_cpu_top (8-Bit CPU) tt_um_Coline3003_top (15 channels emission counter) tt_um_wokwi_414107691971107841 (Steven's Wokwi Test) tt_um_dlmiles_dffram32x8_2r1w (Tiny RAM DFF 2r1w) tt_um_urish_sic1 (SIC-1 8-bit SUBLEQ Single Instruction Computer) tt_um_Coline3003_spect_top (Spectrogram extractor, 2 channels) tt_um_c1_array_mult_structural (Lab C 4x4 Mult-Array) tt_um_CarrySelect8bit (carry_select) tt_um_koggestone_adder8 (test_friday2) tt_um_Rapoport (Perceptron) tt_um_cellular_alchemist (Hopfield Network with Izhikevich-type RS and FS Neurons) tt_um_wokwi_414120207283716097 (fulladder) tt_um_wokwi_414120357164073985 (2-Bit-Adder) tt_um_wokwi_414121442515858433 (Mini-Adder and Clock Divider) tt_um_wokwi_414121715329142785 (Sigma-Delta ADC) tt_um_wokwi_414120407679244289 (3bitFullAdder) tt_um_wokwi_414121532514097153 (TinyTapeout workshop - Wokwi 8 Bit LFSR) tt_um_wokwi_414120518107969537 (4 bit adder) tt_um_wokwi_414120696731857921 (Broken Two Bit Adder) tt_um_wokwi_414120263584922625 (8 bit LFSR) tt_um_wokwi_414121421011660801 (2_bit_7seg) tt_um_wokwi_414120404427608065 (7-seg display checker) tt_um_wokwi_414120472316644353 (tt09-4bit-adder-dhags) tt_um_wokwi_414120591467404289 (XorTree) tt_um_wokwi_414124872671308801 (Morse Code for J and R) tt_um_wokwi_414125777368065025 (Tiny_Tapeout_Adder!) tt_um_wokwi_414120492890759169 (Manchester Encoder) tt_um_wokwi_414120201832165377 (Odd or even) tt_um_wokwi_414125058137148417 (Adbe_Project) tt_um_wokwi_414120372939908097 (Full Adder) tt_um_wokwi_414120379026893825 (TT-Farhad) tt_um_wokwi_414120157271867393 (Four Bit Adder) tt_um_wokwi_414124843472659457 (2 bit adder) tt_um_wokwi_414120239772801025 (AND and NOT gate testing) tt_um_wokwi_414124597390729217 (Kanoa's first Wokwi deseign Tinytapeout 2024 Nonsense) tt_um_wokwi_414120415300298753 (add it) tt_um_wokwi_414117926152578049 (one) tt_um_wokwi_414120459831246849 (Full Adder) tt_um_wokwi_414117854728812545 (four flip flops) tt_um_wokwi_414120320168203265 (Tiny Tapeout 9 Template) tt_um_wokwi_414120583702696961 (half adder) tt_um_tinysynth (Tinysynth) tt_um_wokwi_414120349028170753 (LCA’s first Wokwi design) tt_um_wokwi_414120435997105153 (7-bit arbiter) tt_um_wokwi_414120378768943105 (Counter) tt_um_wokwi_414120800422397953 (Full adder Design) tt_um_wokwi_414118423095874561 (Vincent's First Design) tt_um_wokwi_414120248222232577 (A Tale of Two NCOs) tt_um_a1k0n_nyancat (VGA Nyan Cat) tt_um_tommythorn_workshop (Workshop demo) tt_um_lrc_stevej (LRC - Longitudinal Redundancy Check generator) tt_um_wokwi_414120202583995393 (print) tt_um_wokwi_414120500233937921 (hello) tt_um_wokwi_414120569974735873 (Full Adder) tt_um_wokwi_414120295047458817 (NAND-Equ) tt_um_wokwi_414120388391730177 (adder-tt09) tt_um_wokwi_414120414884012033 (Ripple counter) tt_um_wokwi_414120509472942081 (rand) tt_um_wokwi_414121555407659009 (rhTinyTapeout) tt_um_wokwi_414120432405727233 (chip) tt_um_wokwi_414122362169493505 (NAND Flip-Flop) tt_um_shifter (Shifter) tt_um_wokwi_414124428088683521 (seven) tt_um_wokwi_414120513895838721 (gatesoup) tt_um_wokwi_414120303651028993 (Tiny Tapeout 9 Template Version 1 Tata Luka) tt_um_wokwi_414122607025630209 (UART TX) tt_um_wokwi_414120368966850561 (my First WokWi Design) tt_um_wokwi_414120299211357185 (Tiny Tapeout 9) tt_um_schoeberl_test (tinydsp-lol) tt_um_anislam (Leaky integrate and fire spiking neural network) tt_um_wokwi_414126546375915521 (2-bit Full Adder) tt_um_wokwi_414174625969437697 (Name Speller) tt_um_wokwi_414127944900611073 (gta6) tt_um_ericsmi_mips (mips.sv) tt_um_systolicLif (Basic model for Systollic array implementation of LIF) tt_um_algofoogle_tt09_ring_osc2 (Verilog ring oscillator V2) tt_um_dff_mem (dff_mem) tt_um_nomuwill (16 Bit Izhikevich Neuron) tt_um_digital_clock_example (7-Segment Digital Desk Clock) tt_um_udxs (Basic Perceptron + ReLU) tt_um_matrix_mult (Basic Matrix-Vector Multiplication) tt_um_db_MAC (8 bit MAC Unit) tt_um_anas_7193 (Programmable PWM Generator) tt_um_flyingfish800 (Verilog test project) tt_um_project (Basic LIF Neuron) tt_um_lifn (Integrate-and-Fire Neuron Circuit) tt_um_wokwi_413921836641882113 (ovl abc chip) tt_um_mickey_pll (pll) tt_um_rejunity_e2m0_x_i8_matmul (E2M0 x INT8 Systolic Array) tt_um_michaelmcculloch_alu (Michaels Tiny Tapeout ALU) tt_um_dog_BILBO (8-bit CBILBO) tt_um_stochastic_integrator_tt9_CL123abc (Stochastic Integrator) tt_um_vga_clock (VGA clock) tt_um_z2a_rgb_mixer (RGB Mixer demo) tt_um_samkho_two_channel_square_wave_generator (TwoChannelSquareWaveGenerator) tt_um_mattvenn_r2r_dac_3v3 (Analog 8 bit 3.3v R2R DAC) tt_um_b_10_array_multiplier (Lab B Group 10 Array Multiplier) tt_um_urish_giant_ringosc (Giant Ring Oscillator (3853 inverters)) tt_um_htfab_caterpillar (Simon's Caterpillar) tt_um_anders_tt_6502 (tt6502) tt_um_wokwi_414123795172381697 (TinySnake) tt_um_oscillating_bones (Oscillating Bones) tt_um_r2r_dac (4-bit R2R DAC) tt_um_tinytinfoil_saradc_dac (Noise test for a CDAC capacitor chain) tt_um_purdue_socet_uart (SoCET UART) tt_um_rejunity_sn76489 (Classic 8-bit era Programmable Sound Generator SN76489) tt_um_rejunity_ay8913 (Classic 8-bit era Programmable Sound Generator AY-3-8913) tt_um_tommythorn_cgates (Cgates) tt_um_09eksdee (eksdee) tt_um_13hihi31_tdc (Time to Digital Converter) tt_um_rejunity_decoder (ternary, E1M0, E2M0 decoders) tt_um_analog_example (Digital OTA) tt_um_kailinsley (Dynamic Threshold Leaky Integrate-and-Fire) tt_um_C6_array_multiplier (tt09-C6-array-multiplier) tt_um_rejunity_vga_test01 (VGA Drop (audio/visual demo)) tt_um_wallento_4bit_toycpu (4-Bit Toy CPU) tt_um_warp (Warp) tt_um_algofoogle_tt09_ring_osc3 (Verilog ring oscillator V3) tt_um_kev_ma_matmult222 (2-bit 2x2 Matrix Multiplier) tt_um_wokwi_414041465275103233 (SK Test Workshop) tt_um_rejunity_vga_logo (VGA Tiny Logo (1 tile)) tt_um_toivoh_demo (Sequential Shadows [TT08 demo competition]) tt_um_liaf (A simple leaky integrate and fire neuron) tt_um_wokwi_413879612498222081 (Clocked Display) tt_um_wokwi_413919625901452289 (Encoder) tt_um_wokwi_413919442353385473 (Encoder) tt_um_wokwi_413919540668975105 (First Tapeout Chip - OCR) tt_um_wokwi_413918022277139457 (Half Adder) tt_um_wokwi_414120435095328769 (Kai's Death Adder) tt_um_wokwi_413919775044656129 (Kevin Project) tt_um_lif_network_MR (Leaky Neuron Network) tt_um_lsnn_hschweig (Neuromorphic Hardware for SNN LSTM) tt_um_wokwi_413387065963362305 (Project) tt_um_Nishanth_RISCV (RISCV Processor Design) tt_um_wokwi_413883347321632769 (Test_project) tt_um_KoushikCSN_RISCV (RISCV Processor Design) tt_um_wokwi_414120868401584129 (Tian TT9) tt_um_wokwi_414120391864616961 (Tiniest of tapeouts) tt_um_wokwi_414120458938907649 (Who knows what's happening Tiny Tapeout) tt_um_wokwi_413919833599252481 (YoshiTP) tt_um_wokwi_414118269335820289 (chip_fab) tt_um_wokwi_414121281003682817 (dummy) tt_um_wokwi_414124471705253889 (sarah's first chip) tt_um_ccu_goatgate (tiny cipher 4 bit key) tt_um_wokwi_414120526876163073 (2 input multiplexor) tt_um_lif_ZB (Tutorial: Simple LIF Neuron) Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available