609 VSLC - Very Small Logic Controller with a timer and servo control

609 : VSLC - Very Small Logic Controller with a timer and servo control

Design render

How it works

The VSLC (Very Small Logic Controller) is a stack machine with 8 inputs and 8 outputs and two timers. It takes inspiration from relay logic, early PLCs and their processors, such as the Motorola MC14500B (known to me through the UE-1/UEVTC/UE1450). While not the first time I heard of relay logic, one of the more in depth views of it I've had was from Technology Connections video series on the logic inside an William's 1976 Aztec pinball machine

Another not-my-first-introduction, but Ben Eater's series on building a 6502-based computer and an 8-bit TTL computer reïnvigorated my interest in electronics and the low-level aspects of computer hardware.

My design goal was to have a small processor that could be programmed to handle small control tasks. Specifically, I wanted something that could run crossing gates on my model train layout. This requires sensing rising and falling edges of sensors, flashing lights, and actuating a servo.

Given the relay and PLC "heritage", I reference "scan cycles", "setting", and "resetting" registers. The scan cycle is one trip through the program and sees the input as it was at the start of the cycle. "Setting" a register turns it "on"/sets it to 1. "Resetting" is turning it off/setting it to 0. I try to refer to cycling the reset line of the module, i.e. rst_n as a "system reset" to avoid confusion. I am not a professional in industrial automation, just a hobbyist, if I'm using any terms wrong or confusingly please let me know.

Once powered on, the controller needs to be held in a system reset for at least a cycle.

On system reset, the start address is set to 0x0000. The controller will send a READ command (0x03), a 16-bit 0 address, and expects to receive a 2 byte scan cycle vector (i.e. the first instruction for subsequent runs), a 2 byte scan cycle end address (i.e. the last valid instruction), followed by instructions. Once the end address is reached a new scan cycle is initiated. A scan cycle begins by latching input while cycling the EEPROM chip select for 1 cycle, followed by a READ command (0x03) and the 16-bit cycle start vector.

During a cycle, the value of an input will be unchanging even if the actual input to the pin changes during the execution of the cycle. RISING and FALLING are defined as changes between cycle starts. If a full cycle happens during cycle execution, it will not be seen by the program.


How to test

Place a program on EEPROM (or an emulator), and use the IO pins.

Example 0 is a short and a good place to start.

The file examples/prog0.vslc is:

PUSH i0
DUP
POP o0
NOT
PUSH o1

This program begins by taking the value of input 0 at the last positive edge of the scan cycle clock and placing it on the stack.

top of stack: [i0](i0)

It then duplicates that value.

top of stack: [i0](i0) [i0](i0)

followd by popping one instance from the top of the stack and placing it in the output 0 register.

top of stack: [i0](i0)

The top of the stack is then inverted.

top of stack: /[i0](i0)

Finally, that value is popped to output register 1.

If o0 and 01 were attached to active-high LEDs and i0 attached to an active high momentary button, one LED would be on when the button isn't pressed. Once the button is pressed, that LED turns off and the other turns on. When the button is let go, the lights toggle.

To assemble the source code, we can run ./vslcc examples/prog0.vslc and get the output:

line_num=1 line='PUSH i0'
  cur_addr=00 => PUSH I0 => 00(00000000)
line_num=2 line='DUP'
  cur_addr=01 => DUP => b5(10110101)
line_num=3 line='POP o0'
  cur_addr=02 => POP O0 => 18(00011000)
line_num=4 line='NOT'
  cur_addr=03 => NOT => 8a(10001010)
line_num=5 line='PUSH o1'
  cur_addr=04 => PUSH O1 => 09(00001001)
cur_addr=9
start_addr=b'\x00\x04' end_addr=b'\x00\x08'

The compiler/assembler generates examples/prog0.eeprom.bin. Checking that it exists with ls -l examples/prog0.eeprom.bin

-rw-rw-r-- 1 jim jim 1024 Feb 13 20:28 examples/prog0.eeprom.bin

shows us that the file is 1kB (8kb) in size! The compiler generates a file adequate for a 8kb EEPROM, and pads the rest of the file with 0xff.

We can then look at the generated output with xxd examples/prog0.eeprom.bin| head -n 2

00000000: 0004 0008 00b5 188a 09ff ffff ffff ffff  ................
00000010: ffff ffff ffff ffff ffff ffff ffff ffff  ................

we see the padded 0xffs. The actual program also seems to be 4 bytes longer than we would expect, as our program is 5 instructions long. The first 16-bits are the start address for a new cycle. The second 16-bits are the last valid program address, after which a new cycle should be started.

There is also a disassembler. We can try ./vslcd examples/prog0.eeprom.bin and get

; starting address is the default
; .start 4
PUSH i0
DUP
POP o1
NOT
PUSH o2
; ending address is the default
; .end 8

Nothing too exciting.

Once we start the controller, it will cycle the EEPROM chip select, start a scan cycle which will latch the input, send a read command (0x03) for address 0x0000, read the starting address of 0x0004, then the end address of 0x0008 then the end address of 0x0008. It will then begin executing the next byte it receives. It will continue to send the SPI clock and expect bytes in return. Once it has executed the instruction at the ending address, the EEPROM chip select is cycled and a new scan cycle is started which latches the input. The controller will then send the read command (0x03) for address 0x0004 and begin execution at the first byte it receives. This will continue until the controller is powered down.


External hardware

The controller expects something that presents as an EEPROM that accepts 16-bit addresses and will provide continous data while the clock and chip select are active.


General Architecture

  • Stack machine
  • Code executes until the end of code memory is reached, in which case a new cycle is started
  • 8 input bits/registers mapped to pins
  • 8 output bits/registers mapped to pins
  • 16 bit data stack
  • 1 timer/counter with clock divisor
  • 1 timer/counter for driving a servo

Opcodes

General Decoding rules
  • Bit 7
  • 0: Register Operations
  • Bit 6
    • 00: IO Registers
    • 01: Special Function Registers (SFR)
  • Bit 5,4 * 00 Push * 01 Pop * 10 Set * 11 Reset
  • 1: Operations
  • Bit 6
  • 0: Logical Operations These all write to the top of stack. The shifts below are the final shifts, not the number of pops before the operation pushes. e.g. NOT conseptually does a pop and then a push, which is a shift of 0. * Bit 5,4
    • 00: No Shift
    • 01: Shift 1 Right
    • 10: Reserved
    • 11: Shift 1 Left * Bits 3,2,1,0: Truth table. The result is bit 3 - {nos, tos}
  • 1: Other * Bit 5
    • 0: Temporal (Rising/Falling)
    • Bit 4 - Expected previous state
    • 1: Other
    • Bit 4:
    • 0: Set Parameters
    • 1: Other
Register Operations
PUSH reg    0000 IRRR
POP  reg    0001 1RRR
SET  reg    0010 1RRR
RESET reg   0011 1RRR
PUSH sfr    0100 RRRR
POP sfr     0101 RRRR
SET sfr     0110 RRRR
RESET sfr   0111 RRRR
Logical Operations
AND         1010 0001
NAND        1010 1110
OR          1010 0111
NOR         1010 1000
XOR         1010 0110
BICOND      1010 1001
IMPL        1010 1101
NIMPL       1010 0010
CONV        1010 1011
NCONV       1010 0100

DUP         1000 1100
OVER        1000 1010
DROP        1010 1010
ZERO        1011 0000
ONE         1011 1111
NOT         1001 0011
OVERNOT     1010 0101
Temporal Operations
RISING  reg 1100 IRRR
FALLING reg 1101 IRRR
Parameters

These are followed by a byte with the value to set

SPARAM0 parm 1110 0PPP XXXX XXXX
SPARAM1 parm 1110 1PPP XXXX XXXX
Other
CLR         1111 0000
SETALL      1111 0001
SWAP        1111 0010
ROT         1111 0011
NOP         1111 1111

Special Function Registers SFR

  • 0x0 Timer Enable
  • 0x1 Timer Output
  • 0x2 Servo Enable
  • 0x3 Servo Value
  • 0x4 Servo Output

Parameter

  • 0x0 SPI Clock Divider (Not Implemented)
  • 0x1 Timer0 Clock Divider (4 bits)
  • 0x2 Timer0 Counter A (Not Implemented)
  • 0x3 Timer0 Counter B (Not Implemented)
  • 0x4 Servo0 Clock Divider (Not Implemented)
  • 0x5 Servo0 Frequency Value (Not Implemented)
  • 0x6 Servo0 Reset Value (Not Implemented)
  • 0x7 Servo0 Set Value (4 bits)

Timer

Due to space constraints, the timer will only output a 50% duty cycle signal and has a period of 366 timer-ticks long. The clock divider for the timer can be adjusted from 0 (input clock) to 16 (input clock / 2<sup>16</sup>). At 12MHz, the default clock divider of 14 cycles the timer at 2Hz.

The timer's output is always avaiable on uio_out[4]. The complement is available on uio_out[5]. There is a cycle of dead-time inserted between transitions.

SFR

  • 0x00 Timer Enable - When set the timer will count
  • 0x01 Timer Output - The current output of the timer (even when disabled). This is available to the program.

Parameters

  • 0x1 Timer0 Clock Divider (4 bits)
  • 0x2 Timer0 Counter A (Not Implemented)
  • 0x3 Timer0 Counter B (Not Implemented)

Servo

The servo timer is designed to produce a 50Hz with a duty-cycle between 5% and 13% or pulse-length of between 1ms and 2.6ms. The servo can be set to one of two positions based on the value of the servo's value SFR. Due to space constraints, only the set value (i.e. when the servo's value is 1) can be changed. The reset value is fixed at 11 (1ms pulse). The set value can be set to any value up to 31 (2.6ms pulse). The default set value is 23 (1.9ms pulse). Servos typically accept between 1ms and 2ms to go from 0° and 180°. Practically, this leaves 12 steps (of 15° each) between the servo's home position and max rotation.

The servo's output is always available on uio_out[6];

SFR

  • 0x2 Servo Enable - Turns the servo counter on when set.
  • 0x3 Servo Value - Place the servo at either its set or reset position.
  • 0x4 Servo Output - The output of the timer. (Even when the servo is disabled.) This is available to the program.

Parameter

  • 0x4 Servo0 Clock Divider (Not Implemented)
  • 0x5 Servo0 Frequency Value (Not Implemented)
  • 0x6 Servo0 Reset Value (Not Implemented)
  • 0x7 Servo0 Set Value (4 bits)

Assembler

The compiler will generate a 1kB .eeprom.bin containing the code, and a .final.vslc with the post-processed code.

Comments

Anything after a semicolon, ; on a line will be ignored.

.define

.define alias original

Allows aliasing values and register names.

Example
.define leftsensor i0
push leftsensor

is equivilent to

push i0

.logic

Allows writing propositional logic statments that will compile to assembly. Parentheses, ( and ), logical-and &, logical-or |, xor ^, and logical-not ~ are supported. Other values are assumed to be register names and may be aliased via a .define.

Example

See examples/prog2.vslc and examples/prog2.final.vslc for an example of implementing a counter and 7-segment decoder.

.define segC o2

.define t0 s6
.define t1 s7
.define t2 s8
.define t3 s9

.logic (~t3 & t2) | (t3 & ~t2) | (~t1 & t0) | (~t2 & ~t1) | (~t2 & t0)
 POP segC

will compile to

PUSH S9
NOT
PUSH S8
AND
PUSH S9
PUSH S8
NOT
AND
PUSH S7
NOT
PUSH S6
AND
PUSH S8
NOT
PUSH S7
NOT
AND
PUSH S8
NOT
PUSH S6
AND
OR
OR
OR
OR
POP o2

IO

#InputOutputBidirectional
0InputOutputEEPROM /CS
1InputOutputSPI COPI
2InputOutputSPI CIPO
3InputOutputSPI CLK
4InputOutputTimer Output
5InputOutputComplementry Timer Output
6InputOutputServo Output
7InputOutput(unused)

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 (Tiny Tapeout Factory Test) tt_um_oscillating_bones (Oscillating Bones) tt_um_urish_charge_pump (Dickson Charge Pump) tt_um_sonos_flash_party (SONOS Flash Party) tt_um_4Bit_SAR_ADC (4-Bit Successive Approximation ADC) tt_um_cw_vref (Current-Mode Bandgap Reference) tt_um_tt08_aicd_playground (AICD Playground) tt_um_tnt_diff_rx (TT08 Differential Receiver test) tt_um_rejunity_vga_logo (VGA Tiny Logo (1 tile)) tt_um_tommythorn_maxbw (Asynchronous Multiplier) tt_um_rebeccargb_universal_decoder (Universal Binary to Segment Decoder) tt_um_mattvenn_rgb_mixer (RGB Mixer demo5) tt_um_rebeccargb_hardware_utf8 (Hardware UTF Encoder/Decoder) tt_um_find_the_damn_issue (Find The Damn Issue) tt_um_brandonramos_VGA_Pong_with_NES_Controllers (VGA Pong with NES Controllers) tt_um_kb2ghz_xalu (4-bit minicomputer ALU) tt_um_rebeccargb_intercal_alu (INTERCAL ALU) tt_um_a1k0n_demo (Demo by a1k0n) tt_um_rburt16_bias_generator (Bias Generator) tt_um_zec_square1 ("SQUARE-1": VGA/audio demo) tt_um_jmack2201 (Sprite Bouncer with Looping Background Options) tt_um_ran_DanielZhu (Dice) tt_um_gfg_development_tinymandelbrot (TinyMandelbrot) tt_um_LnL_SoC (Lab and Lectures SoC) tt_um_htfab_pi_snake (Pi Snake) tt_um_quarren42_demoscene_top (asic design is my passion) tt_um_crispy_vga (Crispy VGA) tt_um_MichaelBell_canon (TT08 Pachelbel's Canon demo) tt_um_shuangyu_top (Calculator) tt_um_wokwi_407306064811090945 (DDR throughput and flop aperature test) tt_um_08_sws (Sine Wave Synthesizer) tt_um_favoritohjs_scroller (VGA Scroller) tt_um_tt08_wirecube (Wirecube) tt_um_vga_glyph_mode (Glyph Mode) tt_um_a1k0n_vgadonut (VGA donut) tt_um_roy1707018 (RO) tt_um_analog_factory_test (TT08 Analog Factory Test) tt_um_sign_addsub (CMOS design of 4-bit Signed Adder Subtractor) tt_um_patater_demokit (Patater Demo Kit Waggling Rainbow on a Chip) tt_um_algofoogle_tt08_vga_fun (TT08 VGA FUN!) tt_um_simon_cipher (simon_cipher) tt_um_thexeno_rgbw_controller (RGBW Color Processor) tt_um_demosiine_sda (DemoSiine) tt_um_bytex64_munch (Munch) tt_um_alexjaeger_ringoscillator (5MHz Ring Oscillator) tt_um_cfib_demo (cfib Demoscene Entry) tt_um_wokwi_407852791999030273 (Simple 8 Bit ALU) tt_um_Richard28277 (4-bit ALU) tt_um_betz_morse_keyer (Morse Code Keyer) tt_um_nvious_graphics (nVious Graphics) tt_um_tiny_pll (Tiny PLL) tt_um_ezchips_calc (8-Bit Calculator) tt_um_hack_cpu (HACK CPU) tt_um_noritsuna_Vctrl_LC_oscillator (Voltage Controlled LC-Oscillator) tt_um_ring_divider (Divided Ring Oscillator) tt_um_morningjava_r2r_from_matt (Bucket Brigade) tt_um_ephrenm_tsal (TSAL_TT) tt_um_kapilan_alarm (Alarm Clock) tt_um_stochastic_addmultiply_CL123abc (Stochastic Multiplier, Adder and Self-Multiplier) tt_um_wokwi_407760296956596225 (tt08-octal-alu) tt_um_dlfloatmac (DL float MAC) tt_um_wakki_0123_Raw_Transistors (Raw_Transistors) tt_um_faramire_rotary_ring_wrapper (Rotary Encoder WS2812B Control) tt_um_devstdin_LDO_OSC (LDO BG IREF OSC) tt_um_frequency_counter (Frequency Counter SSD1306 OLED) tt_um_rom_test (TT08 SKY130 ROM 'YOLO' Test) tt_um_i2c_peripheral_stevej (i2c peripherals: leading zero count and fnv-1a hash) tt_um_yuri_panchul_schoolriscv_cpu_with_fibonacci_program (schoolRISCV CPU with Fibonacci program) tt_um_yuri_panchul_adder_with_flow_control (Adder with Flow Control) tt_um_brailliance (Brailliance) tt_um_nyan (nyan) tt_um_MichaelBell_mandelbrot (VGA Mandelbrot) tt_um_ssp_opamp (2-stage Opamp Designs) tt_um_fountaincoder_top_ad (pulse_add) tt_um_edwintorok (Rounding error) tt_um_mac (MAC) tt_um_dpmu (DPMU) tt_um_JAC_EE_segdecode (7 Segment Decode) tt_um_wokwi_408118380088342529 (Traffic-light-sequence) tt_um_shiftreg_test (TT08 SKY130 Shift Register 'YOLO' Test) tt_um_yuri_panchul_sea_battle_vga_game (Sea Battle) tt_um_benpayne_ps2_decoder (PS2 Decoder) tt_um_meriac_play_tune (Super Mario Tune on A Piezo Speaker) tt_um_comm_ic_bhavuk (Comm_IC) tt_um_daosvik_aesinvsbox (AES Inverse S-box) tt_um_wokwi_408216451206371329 (Logic Test) tt_um_micro_tiles_container (Micro tile container) tt_um_cattuto_sr_latch (TT08 - experiments with latch-based shift registers) tt_um_rejunity_vga_test01 (VGA Drop (audio/visual demo)) tt_um_silice (Warp) tt_um_wokwi_408231820749720577 (Abacus Lock) tt_um_jayjaywong12 (mulmul) tt_um_emmyxu_obstacle_detection (Obstacle Detection) tt_um_neural_navigators (Neural Net ASIC) tt_um_a1k0n_nyancat (VGA Nyan Cat) tt_um_rebeccargb_styler (Styler) tt_um_resfuzzy (resfuzzy) tt_um_cejmu (CEJMU Beers and Adders) tt_um_16_mic_beamformer_arghunter (16 Mic Beamformer) tt_um_pdm_pitch_filter_arghunter (PDM Pitch Filter) tt_um_pdm_correlator_arghunter (PDM Correlator) tt_um_ddc_arghunter (DDC) tt_um_i2s_to_pwm_arghunter (I2S to PWM ) tt_um_georgboecherer_vco (Analog Voltage Controlled Oscillator) tt_um_supermic_arghunter (Supermic ) tt_um_dmtd_arghunter (DMTD ) tt_um_htfab_bouncy_capsule (Bouncy Capsule) tt_um_samuelm_pwm_generator (PWM generator) tt_um_mattvenn_analog_ring_osc (Ring Oscillators) tt_um_toivoh_demo_deluxe (Sequential Shadows Deluxe [TT08 demo competition]) tt_um_faramire_stopwatch (Simple Stopwatch) tt_um_micro_tiles_container_group2 (Micro tile container (group 2)) tt_um_johshoff_metaballs (Metaballs) tt_um_top (Flame demo) tt_um_NicklausThompson_SkyKing (SkyKing Demo) tt_um_Electom_cla_4bits (4-bit CLA) tt_um_vga_cbtest (Generate VGA output for Color Blindness Test) tt_um_zoom_zoom (Zoom Zoom) tt_um_dpmunit (DPM_Unit) tt_um_clock_divider_arghunter (Clock Divider ) tt_um_dlmiles_poc_fskmodem_hdlctrx (FSK Modem +HDLC +UART (PoC)) tt_um_emilian_muxpga (TinyFPGA resubmit for TT08) tt_um_pyamnihc_dummy_counter (Dummy Counter) tt_um_whynot (Why not?) tt_um_sudana_ota5t_1 (5-T OTA) tt_um_dlmiles_tt08_poc_uart (UART) tt_um_dendraws_donut (donut) tt_um_wokwi_408237988946759681 (Counter) tt_um_tmkong_rgb_mixer (RGB Mixer) tt_um_bgr_agolmanesh (Bandgap Reference) tt_um_z2a_rgb_mixer (RGB Mixer demo) tt_um_vga_clock (VGA clock) tt_um_synth_simple_mm (synth_simple) tt_um_gus16 (GUS16 CPU) tt_um_rejunity_ternary_dot (Ternary 128-element Dot Product) tt_um_virantha_enigma (Enigma - 52-bit Key Length) tt_um_atomNPU (AtomNPU) tt_um_alphaonesoc (AlphaOneSoC) tt_um_gxrii_spi_sevenseg (SPI 7-segment display) tt_um_urish_simon (Simon Says memory game) tt_um_branch_pred (TinyTapeout Minimal Branch Predictor) tt_um_xor_encryption (Xor-Logic) tt_um_MAC_Accelerator_OnSachinSharma (MAC Operation) tt_um_moody_mimosa (Moody-mimosa) tt_um_wrapper (6Digit7SegClock) tt_um_MichaelBell_tinyQV (TinyQV Risc-V SoC) tt_um_devmonk_ay8913 (Classic 8-bit era Programmable Sound Generator AY-3-8913) tt_um_toivoh_demo (Orion Iron Ion [TT08 demo competition]) tt_um_mattvenn_r2r_dac_3v3 (Analog 8 bit 3.3v R2R DAC) tt_um_2048_vga_game (2048 sliding tile puzzle game (VGA)) tt_um_test_commit (Microrobotics-Basic-IPs) tt_um_jimktrains_vslc (VSLC - Very Small Logic Controller with a timer and servo control) tt_um_gamepad_pmod_demo (Gamepad Pmod Demo) tt_um_mattvenn_adjustable_psu_counter (Adjustable supply digital counter) tt_um_tinytapeout_logo_screensaver (VGA Screensaver with Tiny Tapeout Logo) tt_um_mattvenn_spi_test (SPI test) tt_um_huffman_coder (Huffmann_Coder) tt_um_multiplier (Vedic multiplier) tt_um_wokwi_422964384478997505 (NAND) tt_um_wokwi_422964754310747137 (DaliaProjekt) tt_um_wokwi_422957918936350721 (TinyTapeout 4 bit ripple carry adder) tt_um_wokwi_422961309631153153 (Tinytapeout_design_ANP) tt_um_wokwi_422957954050029569 (Extremely cool stuff (secret)) tt_um_wokwi_422964381148718081 (test/15/02/25) tt_um_wokwi_422959954857061377 (example1) tt_um_wokwi_422960174616660993 (First design) tt_um_schoeberl_wildcat (Wildcat RISC-V) tt_um_wokwi_422962760920307713 (4 Bit Adder with Overflow Counter) tt_um_kentrane_tinyspectrum (Tiny piano) tt_um_wokwi_422962914561876993 (Emil Njor's Design) tt_um_i2c_regf (Asynchronous I2C Registerfile Interface) tt_um_wokwi_422960054456096769 (3-bit register print) tt_um_wokwi_422960130190575617 (Four basic building blocks) tt_um_wokwi_422965035809389569 (3 Bit Adder) tt_um_wokwi_422958894385882113 (TinyChipDesign) tt_um_tappu_tobias1012 (Tappu) tt_um_wokwi_422960332734617601 (Enter-Code) tt_um_wokwi_422960080008854529 (Special code for letter n) tt_um_wokwi_422957657550394369 (Full Adder) tt_um_mp_lif_schor (mp_LIF_neuron) tt_um_wokwi_422962959838345217 (Holm's TinyTapeOut 4-bit adder) tt_um_asgerwenneb (Custom SRAM) tt_um_wokwi_422960491546730497 (ANDNOT) tt_um_Strider93 (digital LIF Neuron) tt_um_wokwi_422960078645704705 (Hero on Tape) tt_um_wokwi_422959974126748673 (my_own_chip) tt_um_wokwi_422968416190311425 (Encoder) tt_um_wokwi_422962904571040769 (simplePass) tt_um_keszocze_ssmcl (SSMCl) tt_um_luke_clock (TT10_Luke_Clock) tt_um_enjens (Verilog based clock to 7-segment counter) tt_um_wokwi_422968696249282561 (Simple NAND 2) tt_um_wokwi_422960085743520769 (Adder) tt_um_UartMain (XOR Cipher) tt_um_torurstrom_async_lock (Asynchronous Locking Unit) tt_um_larva (LaRVa CPU) tt_um_zhouzhouthezhou_adder (tt10_zhouzhouthezhou_adder) tt_um_bg_DanielZhu123 (Bandgap) tt_um_jp_cd101_saw (KCH CD101 Saw Synth) tt_um_hpdl1414_uart_atudoroi (TT10 HPDL 1414 Uart) tt_um_jun1okamura_test0 (7-segment with LFSR) tt_um_strau0106_simple_viii (simple-viii) tt_um_obriensp_jtag (JTAG TAP) tt_um_10_vga_crossyroad (Crossyroad) tt_um_bilal_trng (TRNG) tt_um_space_invaders_game (Space Invaders ASIC) tt_um_sushi_demo (zc-sushi-demo) tt_um_kch_cd101 (kch cd101) tt_um_uart_bgdtanasa (ttUART) tt_um_zedulo_spitest1 (SimpleSPIdev) tt_um_daobaanh_rng (RNG_test) tt_um_mattvenn_level_shifter (Level Shifter) tt_um_gcd_stephan (15bit GCD) tt_um_alexandercoabad_mixedsignal (Mixed-Signal) tt_um_spacewar (XY Spacewar) tt_um_gregac_tiny_nn (Tiny Neural Network Accelerator) tt_um_log_afpm (16-bit Logarithmic Approximate Floating Point Multiplier) tt_um_rkarl_Spiral (TT_spiralPattern) tt_um_led_jellyant (ledtest) tt_um_project (Simple shift Reg) tt_um_DaDDS (DaDDS) tt_um_nithishreddykvs (Pulse Width Modulation) tt_um_monishvr_fifo (Synchronous FIFO) tt_um_reemashivva_fifo (Asynchronous FIFO) tt_um_save_buffer_hash_table (Tiny Hash Table) tt_um_drum_goekce (DRUM) tt_um_rte_sine_synth (Sine Synth) tt_um_simon2024_c_element_top (Muller C-element) tt_um_tiny_shader_mole99 (Tiny Shader) tt_um_flummer_ltc (Linear Timecode (LTC) generator) tt_um_bitty (Bitty) tt_um_ole_moller_priority_encoder_to_7_segment_decoder (Priority-encoder) tt_um_algofoogle_vga (IHP VGA demo) tt_um_ultra_tiny_cpu (UltraTiny-CPU) tt_um_uwasic_dinogame (UW ASIC - Optimized Dino) tt_um_Qwendu_spi_fpu (SPI FPU) tt_um_rte_eink_driver (E-ink display driver) tt_um_urish_sic1 (SIC-1 8-bit SUBLEQ Single Instruction Computer) tt_um_kianV_rv32ima_uLinux_SoC (KianV uLinux SoC) tt_um_autosel (I2C EEPROM Project Selection) tt_um_tnt_rom_test (TT09 SKY130 ROM Test) tt_um_tnt_rom_nolvt_test (TT09 SKY130 ROM Test (no LVT variant)) tt_um_tt_tinyQV (TinyQV SoC with additional peripherals) tt_um_htfab_dg_dac (Dempsey-Gorman DAC) tt_um_algofoogle_raybox_zero (raybox-zero TTCAD25a edition) tt_um_htfab_checkers (Overengineered Checkers) tt_um_sky130_as_sc_hs (sky130_as_sc_hs test) tt_um_sky130_as_sc_hs_dyn_test (sky130_as_sc_hs dyn test) tt_um_rejunity_z80 (Zilog Z80) tt_um_tnt_rf_yolo_test (TTCAD25a SKY130 RF YOLO Test) tt_um_2x2MatrixMult_Vort3xed (UART Matrix Multiplier) tt_um_zerotoasic_logo_screensaver (VGA Screensaver with Zero to ASIC Logo) tt_um_rejunity_lgn_mnist (LGN hand-written digit classifier (MNIST, 16x16 pixels)) tt_um_wokwi_422192563267712001 (Padlock) tt_um_rc_oscillators (R-C Oscillators) tt_um_tnt_ff_yolo_test (TTCAD25a SKY130 FF YOLO Test) 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