78 Blake2s

78 : Blake2s

Design render

Blake2s

This ASIC is a hashing accelerator for the Blake2 cryptographic hash function (RFC 7693).

It is a fully featured Blake2s implementation supporting both block streaming and using a secret key, with a maximum hash rate of 41.42 MB/s and a target operating frequency of 66 MHz.

Blake2s Algorithm

Blake2 is a cryptographic hash function used for applications such as digital signatures, integrity protection and message authentication. It comes in 2 variants, Blake2b and the less memory intensive Blake2s.

BLAKE2s
Block bytes bb = 64
Hash bytes 1 <= nn <= 32
Key bytes 0 <= kk <= 32
Input bytes 0 <= ll < 2**64

In Blake2s, data is processed in blocks of $bb = 64$ bytes, where each block is run through a compression function for multiple rounds of mixing operations.

Each Blake2s run can be configured with specific values for $kk$, $nn$, and $ll$.

The parameter $kk$ represents the optional key length in bytes ($[0;32]$), where $kk = 0$ means keyless hashing and $kk > 0$ enables keyed mode.

$nn$ specifies the output hash size in bytes ($[1;32]$), while $ll$ denotes the total input message length in bytes (up to $2^{64}-1$).

After processing all input data blocks, the final state is truncated to $nn$ bytes to produce the hash output.

Usage

The typical sequence to offload the hashing operation to the accelerator would go as follows:

  1. Reset the accelerator (necessary on init)
  2. Configure the hash parameters $kk$, $nn$, $ll$ (can be reused once configured)
  3. Stream the input data by blocks of 64 bytes
  4. Read the hash result

All data exchanges with the accelerator are in little endian, and when sending multiple-byte-long arrays, the lower indexes are sent first.

Notes:

  • Empty data transfer cycles, as in one or more clock cycles where valid_i would go low in the middle of the transfer of both the input data and the configuration, are supported.
Reset

In order to reset this accelerator to its default uninitialized state, deassert the rst_n signal for at least 5 clock cycles. During normal operations, rst_n should be set to 1.

During at least 5 clock cycles:

  • rst_n is set to 0
Example

Typical reset sequence:

rst waves

Sending the Configuration

The configuration packet is 10 bytes long and has the following format:

Configuration packet

$kk$ and $nn$ are both 8 bits wide, and $ll$ is 64 bits wide, and all use little endian.

Sending the configuration takes 10 data transfer cycles, during which:

  • valid_i is set to 1
  • cmd_i[1:0] is set to 0, indicating we are sending the configuration packet
  • data_i[7:0] sends the next byte of the configuration packet
Example

In this example we are sending the following configuration:

  • $kk = 1$ (1 Byte)
  • $nn = 32$ (1 Byte)
  • $ll = 67$ (8 Bytes)

config waves

Software

In the firmware, the send_config function defined in data_wr_utils.h is used to send a configuration to the accelerator.

void send_config(uint8_t kk, uint8_t nn, uint64_t ll, uint dma_chan, pinout_t *p, size_t pl, PIO pio, uint sm);

Parameters :

  • kk configuration value, key length
  • nn configuration value, final hash length in bytes
  • ll configuration value, raw data length
  • dma_chan is the DMA channel used to offload copying data between the memory and the RP2040's PIO
  • p is a pointer to the shared pre-allocated pool of memory we can temporarily use to allocate the necessary pinout_t
  • pio is the base address of the PIO where the data write program is running
  • sm is the index of the PIO state machine where the data write program is running
Sending Data

Just like in the original hashing algorithm, the stream of data to be hashed must first be padded with 0x00 to a multiple of 64 bytes, then starting from the lowest indexes first, blocks are sent one by one, one byte at a time.

The sequence to send a block is as follows:

  • Wait for ASIC to set ready_v_o to 1

Then, start the 64 data transfer cycles during which:

  • valid_i is set to 1
  • cmd_i[1:0] is set to :
    • 1 if this is the first data transfer cycle of the first block
    • 3 if this is the last data transfer cycle of the last block
    • 2 by default
  • data_i[7:0] contains the current data byte

The ready_v_o signal indicates the accelerator is ready to receive data. In order to improve performance, users can skip waiting for this signal to be re-asserted between each byte transfer and can safely proceed with sending the entire block as soon as the ready_v_o signal is observed at 1.

⚠️ Critical Timing Requirement: When using the optimization, since it takes 2 clock cycles for the new value of ready_v_o to be written on the output pin, users must guarantee at least a 30ns gap (for 66MHz) between the end of the previous block write and the evaluation of the next ready_v_o signal. The current firmware guarantees such a gap.

Single Block Example

This is an example of a simple data transfer sequence where the entirety of the data fits within a single block.

Given there is a single block, meaning it is both the first and last block, the mode_i control bits are set to 1 on the first cycle and 3 on the last cycle.

single block data transfer example

Multi-Block Example

In this example we are sending two blocks of data.

This example shows the data transfer associated with the configuration waves used as an example above ($kk = 1, nn = 32, ll = 67$).

The first block contains the key of size $kk = 1$ byte, the key's contents are 'a' and padded with 0x00 up to 64 bytes.

After the first block has finished sending, we wait until the accelerator asserts the ready_v_o signal before starting the second transfer.

The second block contains the $ll - (kk>0?64:0)$, here 3, bytes of data "abc", again padded with 0x00 until 64 bytes.

multi block data transfer example

Software

In the firmware, for sending data to the accelerator we use the send_data function defined in the data_wr_utils.h header.

void send_data(uint8_t *data, size_t dl, pinout_t *p, size_t pl, uint dma_chan, PIO pio, uint sm);

Parameters :

  • data is a pointer to the raw data (not extended to a multiple of 64 bytes) to be hashed
  • dl is the data length in bytes
  • p is a pointer to the shared pre-allocated pool of memory we can temporarily use to allocate the necessary pinout_t
  • dma_chan is the DMA channel used to offload copying data between the memory and the RP2040's PIO
  • pio is the base address of the PIO where the data write program is running
  • sm is the index of the PIO state machine where the data write program is running
Slow Output Mode

For the sky130b shuttle, although the maximum stable GPIO input switching frequency is 66 MHz, due to a weak driver on the output buffer path resulting in much higher slew rate, the current maximum output stable supported transitioning frequency is 33 MHz.

In order to allow more room for experimenting with the limits of the maximum stable output switching rate while supporting a more stable operating mode, the "slow output" mode was added to this design.

⚠️ Users simply looking to reliably use the accelerator should always have the slow output mode set.

This mode can be enabled by setting output_mode_i[1:0] at any time while the accelerator is hashing or receiving data, but for more reliability, we recommend the user simply clamp these pins using the GPIO.

Setting the slow output mode:

  • output_mode_i[1:0] is set to 3

Setting the default fast output mode:

  • output_mode_i[1:0] is set to 0
Reading the Hash

After the accelerator finishes hashing the last block, it will begin streaming out the final hash result.

In Blake2, the $nn$ configuration parameter specifies how many bytes long the resulting hash should be. This accelerator follows this convention and will only return $nn$ bytes as a result.

Since this accelerator was designed to interface with an embedded MCU and not another accelerator or an FPGA, the accelerator asserts the hash_v_o signal ahead of starting to stream out the result. This is done so that we can allow the RP2040 PIO to detect the start of the result sequence and initiate capturing the data. Because of this, this accelerator is tightly co-designed with the RP2040 in mind and cannot be ported to other MCU families, as it is reliant on a 15ns/30ns (if slow mode is set) reaction time, followed by very timing-accurate capture of the GPIO values. See firmware/data_rd.pio for this PIO assembly program.

If slow output mode is set (see the previous section about it), all data steps in the data output sequence take 2 clock cycles; otherwise, each step takes 1 cycle.

The hash read sequence has 2 parts:

  1. h_v_o (hash_v_o) is set to 1 for 1 step (1/2 clock cycles) in order to let the PIO initiate data capture
  2. The hash result is streamed over $nn$ steps:
    • h_v_o (hash_valid_o) is set to 1
    • h_o (hash_o[7:0]) contains the hash result
Example Hash result in slow output mode

In this example, slow output mode is set, and the accelerator is returning a hash result of $nn = 32$ bytes long.

Slow read waves output

Example Hash result in fast output mode

In this example, the defatul fast output mode is used, and the accelerator is returning a hash result of $nn = 32$ bytes long.

Fast read waves output

Software

In order to capture this hash result, given the high-speed nature of the transfer and the precision needed in the capture, the entire capture sequence is offloaded to the PIO. Additionally, since, depending on the configured $nn$, the PIO RX FIFO (internal rx buffer) might be too small to store all of the hash result, a DMA stream is set up to automatically transfer RX FIFO entries to memory.

Given there is only on the order of 1.5µs between the last data transfer cycle of the last block and the start of the hash result, and given this is not remotely enough time for our MCU to reliably set up a new data capture, the hash result read must be set up before the last data transfer cycle. In practice, in the firmware we use setup_rd_dma_hash_stream to set up this DMA stream before the start of any input data streaming, see firmware/main.c.

Unlike the input data streaming from the MCU to the accelerator, the hash result is a gapless stream where data is transferred at every step. As such, it is very important that the MCU be able to stream uninterrupted without dropping any of the result bytes. Because of this, the DMA stream between the PIO SM used for reading and the memory is set up to be of the highest priority.

Set up DMA stream to capture the hash result, part of data_rd_utils.h:

void setup_rd_dma_hash_stream(uint dma_chan, uint nn, uint8_t* buffer, size_t bl, PIO pio, uint sm);

Parameters:

  • dma_chan - high priority DMA channel used to read from the PIO SM to memory
  • nn - hash result length in bytes
  • buffer - pointer to the target location in memory the DMA should write to
  • bl - buffer length in bytes
  • pio - base address of the PIO performing the hash read operation
  • sm - index of the PIO state machine currently running with the hash read program

Given all the reading and transfer operations were already handled under the hood by the PIO and DMA, the read_hash function only needs to wait for the end of the DMA transfer operations and copy the hash result written by the DMA into the hash buffer.

Read the hash result from the DMA target memory location, part of data_rd_utils.h:

void read_hash(uint8_t* hash, uint8_t nn, uint8_t* buffer, size_t bl, uint dma_chan);

Parameters:

  • hash - pointer to the buffer to which the hash result will be copied
  • nn - hash result length in bytes
  • buffer - pointer to the target location in memory the DMA should write to
  • bl - buffer length in bytes
  • dma_chan - high priority DMA channel used to read from the PIO SM to memory

IO

#InputOutputBidirectional
0data_i[0]hash_o[0]valid_i[0]
1data_i[1]hash_o[1]cmd_i[0]
2data_i[2]hash_o[2]cmd_i[1]
3data_i[3]hash_o[3]ready_v_o
4data_i[4]hash_o[4]output_mode_i[0]
5data_i[5]hash_o[5]output_mode_i[1]
6data_i[6]hash_o[6]
7data_i[7]hash_o[7]hash_valid_o[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 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_oscillating_bones (Oscillating Bones) tt_um_sonos_flash_party (SONOS Flash Party) tt_um_tinyflash (Tiny Chaos) tt_um_tnt_rf_test (TTSKY25A Register File Test) tt_um_wokwi_442983115801432065 (TimosChip) tt_um_wokwi_442977603880750081 (My first Wokwi project) tt_um_wokwi_442980274206980097 (Lauflicht_HTL_Leonding) tt_um_wokwi_442985235137668097 (Chip) tt_um_wokwi_442977476137901057 (Paircheck) tt_um_seven_segment_games (7-segment-games) tt_um_wokwi_442977465750697985 (Auberger tiny tapeout) tt_um_wokwi_442983567899298817 (Template copy) tt_um_wokwi_442977846716359681 (Tiny Tapeout) tt_um_wokwi_442983760106473473 (Tiny Tapeout Test) tt_um_Max00Ker_Traffic_Light (Traffic Light Controller) tt_um_wokwi_442983721200099329 (Piffl first Wokwi project) tt_um_strasti (8-Bit ALU) tt_um_wokwi_442977509323262977 (simple adder and subtractor) tt_um_wokwi_442977852139597825 (The Ultimate ASIC) tt_um_wokwi_442984105081776129 (Test project) tt_um_wokwi_442977495241922561 (First Wokwi design) tt_um_wokwi_442977534651634689 (Tiny Tapeout Wokwi Bsp) tt_um_pwm_led_top (PWM_LED_dimmer) tt_um_classic_vga_clock (tt_classic_vga_clock_by_TT) tt_um_wokwi_442977463421808641 (Patrick first TT chip) tt_um_wokwi_442983748797580289 (Simple Logic-Gate Controlled LEDs) tt_um_timba307_LEDSpinner (jku-sky-LEDSpinner) tt_um_wokwi_442977533467790337 (4 Bit Counter) tt_um_wokwi_442977645972707329 (Davids first Wokwi design) tt_um_wokwi_442977436543634433 (2 Bit Counter) tt_um_wokwi_442977452121292801 (Shift_Register) tt_um_wokwi_442976058838162433 (7segCounter) tt_um_wokwi_442977493563151361 (7SegDec) tt_um_Lukasseirl (Tiny_Tapeout_Scoreboard) tt_um_dip_switch_game_TobiasPfaffeneder (Can you count binary?) tt_um_wokwi_442977704392041473 (test-project.) tt_um_wokwi_442984054310760449 (TinyTapeout Wokwi) tt_um_cpu_fabianp1704 (8-Bit-CPU) tt_um_wokwi_442977579441572865 (Hamming (7,4) Encoder and Decoder) tt_um_wokwi_442977842875423745 (Tiny Tapeout) tt_um_wokwi_442977476963131393 (Test) tt_um_s_grundner (Polyphonic MIDI-Synth) tt_um_wokwi_442987128372461569 (counter7seg) tt_um_wokwi_442977648674888705 (tt-test) tt_um_wokwi_442977792040445953 (tiny tapeout test gates) tt_um_lukasdragoste_vga_patterns (VGA Pattern Generator) tt_um_wokwi_442983161563395073 (tt_primitiv_rotating_7segment) tt_um_attention_top (transformer-attention-engine) tt_um_wokwi_442977515486800897 (Austrochip 2025 Tiny Tapeout Project) tt_um_endecoder_workfefra (EnDecoder) tt_um_wokwi_442977774857423873 (first-chip-project) tt_um_wokwi_442983487202965505 (EmilsChip) tt_um_wokwi_442984104166367233 (Austrochip 2025 Workshop Design) tt_um_wokwi_442978797853619201 (Full Adder) tt_um_wokwi_442983541057844225 (First Wokwi design) tt_um_df_top (Digital Filter) tt_um_tiny_4bit_alu (4-Bit ALU) tt_um_wokwi_442987944543304705 (Lauflichterweitung) 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_wokwi_442987201599784961 (Tiny tapeout test gates) tt_um_wokwi_442977606409919489 (Tiney Tapeout Test Gates) tt_um_wokwi_442977490552687617 (Tiny Tapeout Projekt) tt_um_wokwi_442987575358494721 (Tiny Tapeout Template) tt_um_wokwi_442987960046504961 (Lauflicht_Erweiteung_HTL_LEONDING) tt_um_urish_simon (Simon Says memory game) tt_um_FG_TOP_Dominik_Brandstetter (Function Generator) tt_um_vga_clock (VGA clock) tt_um_z2a_rgb_mixer (RGB Mixer demo) tt_um_felixzhou_spi_slave_ctrl (spi_slave_ctrl) tt_um_Jsilicon (Jsilicon) tt_um_wokwi_413387009513254913 (SimplePattern) tt_um_wokwi_445165988923203585 (Crazy logic gates) tt_um_wokwi_445172771884208129 (TinyTapeoutProject) tt_um_wokwi_445163720250008577 (base-4-circuit-addition) tt_um_wokwi_445163803460843521 (tiny tapeout) tt_um_wokwi_445163742018450433 (Simon Memory Game) tt_um_wokwi_445163652263454721 (Minhala's tinytapeout) tt_um_wokwi_445163607540610049 (Leena and Gabby's coding masterpiece) tt_um_wokwi_445163940815949825 (doritos) tt_um_wokwi_445164514940747777 (DAMTinyTape) tt_um_wokwi_445163656445179905 (Test) tt_um_wokwi_445163922612663297 (Chip Design (Working title)) tt_um_wokwi_445171727534897153 (FlippyFlop) tt_um_wokwi_445172053537213441 (Chip-Test) tt_um_wokwi_445163628668378113 (4 switch, seven segment display) tt_um_wokwi_445174163497792513 (T Flip Flop) tt_um_wokwi_445164196289996801 (Tiny Tapeout Test Gates) tt_um_wokwi_445165735970991105 (tiny tapout test gates) tt_um_wokwi_445163669892121601 (Nicky - Tiny Tapeout) tt_um_wokwi_445163874814362625 (Tiny Tapeout Test Gates) tt_um_wokwi_445163790648286209 (AnalogClockTest1) tt_um_wokwi_445173979376212993 (EJ Wokwi proj.) tt_um_wokwi_445172860504617985 (Tiny_Tapeout_Test_Gates) tt_um_wokwi_445163677488010241 (Bob design) tt_um_wokwi_445171420903985153 (Fawwaz's Project) tt_um_wokwi_445256090314494977 (Tiny Tapeout Hackathon UofT Day 2 Template) tt_um_wokwi_445254767859645441 (flipper 1 to 5) tt_um_wokwi_445256131623154689 (Tiny tapeout test gates) tt_um_wokwi_445254731311517697 (Single Digit Sums by Mark Angelov) tt_um_wokwi_445255383410583553 (Overly Complicated Light Switch) tt_um_wokwi_445254813154997249 (Tiny Tapeout Gates) tt_um_wokwi_445255110472500225 (chipchip) tt_um_wokwi_445255067501843457 (Semi-Conductor Design) tt_um_wokwi_445254767711795201 (WOKWI Design - Joelle) tt_um_wokwi_445254845860088833 (Johans Wokwi design) tt_um_wokwi_445254714007910401 (Arjun's 1st Wokwi design) tt_um_wokwi_445254980988014593 (Tiny Tapeout Test Gates) tt_um_wokwi_445254976953093121 (Inverting Numbers) tt_um_wokwi_445254908700218369 (Tinytapeoutchipnikki) tt_um_wokwi_445254867374774273 (Hardware Hackday Test Gates) tt_um_wokwi_445255496359022593 (gds) tt_um_wokwi_445265377104476161 (WokwiDesign) tt_um_wokwi_445256528755654657 (sigma uncount) tt_um_wokwi_445255578007454721 (Tiny Tapeout Test Gates) tt_um_wokwi_445265925317879809 (tinytapeout) tt_um_wokwi_445260761196909569 (Tiny Tapeout Template Copy) tt_um_wokwi_446565876953355265 (Tiny Tapeout Project - Binary to Decimal Display) tt_um_wokwi_445255326319805441 (Svens Woki design) tt_um_wokwi_445255081544375297 (Tiney Tapeout Semiconduxtor) tt_um_wokwi_445266058506969089 (Wowki) tt_um_wokwi_445262455513487361 (Tiny Tapeout Test Games) tt_um_wokwi_445264784091688961 (Wokwicreation) tt_um_wokwi_445276353959823361 (Jarle Chip) tt_um_wokwi_444910895295771649 (Project Title) tt_um_wokwi_445263189281882113 (FullAdder) tt_um_wokwi_445254953748100097 (Tiny Tapeout Test Gates) tt_um_wokwi_444269677791635457 (Ring Counter) tt_um_rebeccargb_arrow_board (Arrow Board) tt_um_sergejsumnovs_spi_slave (Cynergy4MIE SPI Slave Component) tt_um_rebelmike_femtorv (FemtoRV register file test) tt_um_wokwi_445163733427466241 (my first wokwi design) tt_um_tnt_rf_validation (TTSKY25B Register File Validation) tt_um_pongsagon_tinygpu_v2 (Tiniest GPU V2) tt_um_rc_servo_motor_xy_ea (rc_servo_motor_xy) tt_um_htfab_asicle2 (Asicle v2) tt_um_dumb_turing_yliu_hashed (DUMB-Turing) tt_um_wokwi_446363696828310529 (sparkhom SR flip flop) tt_um_wokwi_446364165240923137 (TinyTapeout) tt_um_wokwi_446645853372820481 (JBs first chip) tt_um_wokwi_446907838117673985 (miloh-tinytapeout-supercon2025) tt_um_wokwi_446363880417243137 (test) tt_um_wokwi_446363782054494209 (4-bit Johnson Counter) tt_um_wokwi_446847576277095425 (Tiny Tapeout 20251031) tt_um_wokwi_446363829539267585 (AndNand) tt_um_wokwi_446363784753530881 (LeviathonGds) tt_um_wokwi_446363928119066625 (mysteryform) tt_um_wokwi_447138553926768641 (Digit Fidgit) tt_um_6502_chip_select (6502 Chip Selector) tt_um_wokwi_446363731295014913 (Tiny Tapeout Binary to Decimal) tt_um_wokwi_446363984157070337 (HAD TT) tt_um_wokwi_446364133350576129 (Tiny Tapeout Workshop Supercon 25) tt_um_bmellor_lightsout (Lights-Out) tt_um_wokwi_446363771447095297 (Simple Tapped Delay Line) tt_um_sleepy_module (Sleepy Chip) tt_um_camdenmil_sky25b (OctoPWM) tt_um_wokwi_446363844132307969 (wokwi-adder) tt_um_wokwi_446362347802682369 (DETDFF (Tiny Tapeout)) tt_um_arko (Arko) tt_um_wokwi_446363696538901505 (Fastest Finger First) tt_um_wokwi_446363830909757441 (My Tiny Tapeout) tt_um_wokwi_446363833426340865 (First WOWKI Project) tt_um_wokwi_446364777751946241 (Seven Segment Display Driver) tt_um_wokwi_446359782214875137 (Jon_And_Angie_08281999) tt_um_wokwi_446368563224770561 (TinyTapeout2) tt_um_wokwi_446373432938861569 (j-initial-cycler) tt_um_kianV_rv32ima_uLinux_SoC (KianV uLinux SoC) tt_um_kercrafter_leds_racer (LEDs Racer) tt_um_four_bit_cpu_top_level (4Bit_CPU) tt_um_yorimichi_kittscanner (kitt_scanner) tt_um_devmonk_ay8913 (Classic 8-bit era Programmable Sound Generator AY-3-8913) tt_um_tinytapeout_logo_screensaver (VGA Screensaver with Tiny Tapeout Logo) tt_um_TinyWhisper (Tiny Whisper) tt_um_markr_transientshaper (Audio Transient Shaper) tt_um_urish_sic1 (SIC-1 8-bit SUBLEQ Single Instruction Computer) tt_um_essen (Blake2s) tt_um_baud_rate_cdr (Baud-Rate PAM4 Clock and Data Recovery (CDR)) tt_um_b2nch_DreiMann_top (DreiMann) tt_um_tt05_analog_test (TT25 3B DAC and RingO) tt_um_wokwi_446424200424416257 (JK flip-flop) tt_um_willwhang (60/50Hz AC clock) tt_um_toivoh_delta_sigma (Noise shaping delta-sigma DAC) tt_um_wokwi_444123325639097345 (tinytapeout test gates) tt_um_lime_cic_filter (lime_cic_filter) tt_um_VHDL_PWM_DEMUX (PWM Generator) tt_um_VHDL_FSM (FSM) tt_um_vhdl_ALU_top (6bit ALU) tt_um_proppy_bytebeat (bytebeat) tt_um_femto (UNAL's RISCV ) tt_um_ag2048_tiny_calculator (Tiny Calculator) tt_um_alexlowl_myTTproject (myTTproject) tt_um_relax (Relax_Oscillator) tt_um_tiny_shader_v2_mole99 (Tiny Shader v2) tt_um_mattvenn_r2r_dac_3v3 (Analog 8 bit 3.3v R2R DAC) tt_um_evm (Electronic Voting Machine) tt_um_top_axis_uart (AXIS_UART_TTO) tt_um_nco (Numerically Controlled Oscillator) tt_um_morse (Morse Code Converter) tt_um_tiny_hardware_authentication_engine (Tiny Hardware Authentication Engine) tt_um_mattvenn_analog_ring_osc (Ring Oscillators) tt_um_eestevez3_SAR_ADC (8 Bit SAR ADC) tt_um_wokwi_446992736864284673 (Binary Counter) tt_um_patrick_lin_git_mcht_trx (Manchester Encode/Decode with built-in 5X PLL) tt_um_bleeptrack_nn1 (Negative Nature #1) tt_um_bleeptrack_nn2 (Negative Nature #2) tt_um_bleeptrack_nn3 (Negative Nature #3) tt_um_bleeptrack_nn4 (Negative Nature #4) tt_um_underserved (TTSKY25b-RISCV-Core) tt_um_axc1271_tinypong (Tiny Pong) tt_um_Electom_cla_4bits (4-bit CLA) tt_um_zerotoasic_logo_screensaver (VGA Screensaver with Zero to ASIC Logo) tt_um_wokwi_446364830841352193 (Flip the Flop) tt_um_instrumented_ring_oscillator_two (instrumented_ring_oscillator_two) tt_um_tadc_its (Time Domain ADC) tt_um_seven_segment_animations (7-Segment-Animations) tt_um_urish_spell (SPELL) tt_um_algofoogle_vga_matrix_dac (Analog VGA CSDAC experiments (TTSKY25b)) tt_um_cejmu_wspr (CEJMU WSPR Encoder) tt_um_wokwi_442987636779898881 (tt-wokwi) tt_um_wokwi_442977691824856065 (Numbers) tt_um_wokwi_442988211554861057 (Siebensegment_Chip) tt_um_wokwi_442982978057266177 (Kleine Tapeout Vorlagen-Kopie) tt_um_wokwi_442977531497515009 (Tiny Tapeout meli) tt_um_wokwi_442985098452614145 (Template) tt_um_wokwi_442983461306274817 (Tiny tapeout test) tt_um_wokwi_442983243536903169 (Tiny Tapeout Template Hammer) tt_um_wokwi_442979151350678529 (TestGDS) tt_um_wokwi_442982637762839553 (Arjun's First Template Copy) tt_um_tnt_mosbius (tnt's variant of SKY130 mini-MOSbius) tt_um_project (in-81004-1 silicon) tt_um_wokwi_442977548950021121 (Digital_gate) tt_um_wokwi_442987226036856833 (TinyTapeoutTest) tt_um_wokwi_442987174502478849 (4 bit adder) tt_um_wokwi_442984695522496513 (Test) tt_um_wokwi_442977682425413633 (JKU Matt Venn workshop simple project) tt_um_wokwi_442987801460891649 (Tiny Tapeout Template Copy) tt_um_rh_bf_top (TinyBF) tt_um_wokwi_442977585335625729 (WokWi Test) tt_um_wokwi_442977456053457921 (Wokwi Template) tt_um_wokwi_442979336364610561 (ShilpaTinytapeout) tt_um_kianv_rv32_regfile (KianV uLinux RISC-V regfile edition) tt_um_PWM (PWM_selector) tt_um_wokwi_445338187869298689 (WokwiPWM) tt_um_wokwi_447051835034957825 (TicTacToe) tt_um_chrimenz_tinyturing (Tiny Turing Machine) tt_um_emilian_opamp_3v3 (3V3 Opamp and DRAM cell) tt_um_jakedrew_qei (QEI (Quadrature Encoder Interface)) tt_um_wokwi_442977503814034433 (Tiny Tapeout Test Gates) tt_um_wokwi_442978871257096193 (fdfs) tt_um_wokwi_445163636148924417 (not a dumpster fire ) tt_um_wokwi_445175272109059073 (Tiny Takeout Test Gates) tt_um_wokwi_445163800203964417 (Four-bit adder tiny tapeout) tt_um_wokwi_445163606906219521 (Secret Password) tt_um_wokwi_445172222101072897 (Tiny Tapeout Template Project) tt_um_wokwi_445163763917969409 (Tiny Tapeout Binary to 7SD) tt_um_wokwi_445172941748296705 (Anushka and Tina Wokwi) tt_um_wokwi_445163964149915649 (Tahmid and Sunny's First Wokwi Design) tt_um_verilog_meetup_template_project_example (Verilog Meetup Template Project Example) tt_um_brainfck_asic (Brainf*ck ASIC) tt_um_wokwi_446363834407809025 (RHYTHM LOOPER and RANDOMIZER 9000) tt_um_technology_characterization (SKY130 technology characterization) tt_um_mosbius (mini mosbius) tt_um_bouncing_squares (Bouncing squares) tt_um_PseudoSM_ASIC (PSM_asic) tt_um_enjimneering_tts_top (TinyTapeStation) tt_um_morse_it (MORSEASCII) tt_um_vga_projekt_ed_nkpng (vga_projekt_ed_nkpng) tt_um_uart_temp_sens (Uart and Temperature sensor) tt_um_ragnar_lucasnilsson954 (RagnarMegaRaknare) tt_um_react_test_saksh156 (React Chip) tt_um_mastermind (Mastermind) tt_um_synth_magmusson (hardcoded sequencer) tt_um_hammal_fir_filter (FIR Filter) tt_um_tinytone (tt-tinytone) tt_um_julke_gussinatorn2 (JulkeGussinatorn 2.0) tt_um_se_opamps (ttsky25_se_opamps) tt_um_unclegravity_7seg_counter (7-Segment Counter) tt_um_wokwi_445256658591419393 (Andrew chip design) tt_um_counter_isaharp (Counter) tt_um_wokwi_445254959452357633 (Anton's-Hardware-Hack) tt_um_wokwi_445256643197274113 (SignalSorter) tt_um_wokwi_445265826672030721 (The Adder) tt_um_wokwi_445175605912766465 (Tiny Tapeout Hradware Workshop Vaibhav) tt_um_fkd_xorshift (xorshift) tt_um_wokwi_445255035084055553 (Tiny Tapeouts Chip Design) tt_um_wokwi_445254913718704129 (Tiny Tapeout Test Gates) tt_um_wokwi_445254916601240577 (cirucuit) tt_um_wokwi_442988784492711937 (test) tt_um_rejunity_ym2413_ika_opll (YM2413 FM synthesis audio chip) tt_um_top_general (Dual-Channel PWM with SPI Control + Extra Test Logic) tt_um_proppy_megabytebeat (megabytebeat) tt_um_rom_vga_screensaver (VGA Screensaver with embedded bitmap ROM) tt_um_sky25a_nurirfansyah_nauta (Nauta OTA with digital trimming) tt_um_mattvenn_relax_osc (Relaxation oscillator) tt_um_pantelis300_nco (NCO) tt_um_ieeeuoftasic_simproc (SimProc (Simple Processor)) tt_um_rejunity_vga_playground (My (S)VGA Playground) tt_um_Onchip_VCOx2 (Onchip - Ring VCO 11 stages x2) tt_um_dlmiles_dffram32x8_2r1w (Tiny RAM DFF 2r1w) tt_um_Onchip_BandGap (OnChip - Bandgap Reference) tt_um_kianv_bare_metal (KianV RISC-V RV32E Baremetal SoC) tt_um_pommarkus_i2c_slave (I2C Slave) tt_um_MichaelBell_tinyQV (TinyQV Risc-V SoC) tt_um_reservoir (EZ Reservoir) tt_um_morse_w_serial (Morse Code Detector (With Serial RX)) tt_um_dyno (dyno-tt) tt_um_libokuohai_asap_cpu_v1 (ASAP CPU v1) tt_um_2048_vga_game (2048 sliding tile puzzle game (VGA)) tt_um_quick_cpu (4 hour CPU) tt_um_tv_b_gone_rom (TV-B-Gone-EU (ROM Macro variant)) tt_um_flappy_vga_cutout1 (Flappy VGA) tt_um_Sai222777 (XOR Stream Cipher) tt_um_ring_osc3 (Verilog Multistage Oscillator with Enable and Counter) 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