211 Multi Pattern LED Sequencer

211 : Multi Pattern LED Sequencer

Design render
  • Author: Francisco Javier Rodriguez Navarrete
  • Description: Project for the MPLS LED lights
  • GitHub repository
  • Clock: 10000000 Hz

How it works

The 'tt_um_MultiPatternLEDSequencer_RSYO3000.v' is just a wrapper for the tinytapeout I/O. Inside this, theres a top wrapper for the project called 'MultiPatternLEDSequencer.v' that connects to the tinytapeout wrapper and instances the following modules: 'PLL_10MHztoNHz.v' and 'MPLS.v'

The 'PLL_10MHztoNHz.v' contains a verilog that can change the 10MHz frequency input to 1Hz, 2Hz 5Hz and 50Hz, to see the LEDs with various frequencies via the ('clk_selector') signal.

The 'MPLS.v' is the main module, it uses a combination of counters, feedback loops, and pattern selection logic to generate different LED patterns. The pattern selection signal ('pattern_sel') determines which LED pattern to display.

  • The 'demo_counter' is used to cycle through all the available patterns when ('pattern_sel') is 31.

  • The 'pattern_counter' and 'oh_counter' are used to generate specific timing sequences for the LED patterns.

  • The 'lfsr_reg' implements a Linear Feedback Shift Register (LFSR) to generate pseudo-random sequences.

  • A 'case' selects from the selected ('pattern_sel') to display the selected pattern out of the 30 available patterns through the 8 outputs. The 30 patterns are the following ones:

    • Pattern 0: All LEDs OFF Turn off all the LEDs.

    • Pattern 1: All LEDs ON Turn on all the LEDs at once.

    • Pattern 2: Blinking LEDs Make the LEDs alternate between on and off, creating a blinking effect.

    • Pattern 3: Running lights The LEDs move in a sequence, like lights running down a line.

    • Pattern 4: Alternating LEDs Alternate the LEDs in an on-off pattern.

    • Pattern 5: Negative running lights Similar to pattern 3, but with the LEDs off where they were on, and vice versa.

    • Pattern 6: KR effect The LEDs flicker and shift, producing a mysterious "Knight Rider" effect.

    • Pattern 7: Bouncing lights Lights bounce back and forth.

    • Pattern 8: LED wave effect Create a wave-like pattern that travels along the LEDs.

    • Pattern 9: Alternating LED groups Divide the LEDs into groups of 2 that alternate turning on and off.

    • Pattern 10: Heartbeat Make the LEDs pulse in a heartbeat-like rhythm.

    • Pattern 11: p-Random LFSR LEDs Use a random number generator to make the LEDs light up in a pseudo-random pattern.

    • Pattern 12: XOR All XOR all counters, creating a unique show.

    • Pattern 13: Binary counter Display a binary counting sequence on the LEDs.

    • Pattern 14: Clockwise LED rotation Rotate the LEDs in a clockwise direction.

    • Pattern 15: XOR Pattern XOR between one hot counter and binary counter.

    • Pattern 16: Bouncing lights Similar to pattern 7, but with a slightly different bounce effect.

    • Pattern 17: Diagonal Bounce Make the LEDs bounce diagonally across the LEDs.

    • Pattern 18: Circular Bounce Create a circular bounce effect, like lights moving in a loop.

    • Pattern 19: Random Bounce The LEDs bounce pseudo-randomly.

    • Pattern 20: Negative Diagonal Bounce Like pattern 17, but with the LEDs off where they were on, and vice versa.

    • Pattern 21: Accelerating Bounce The bouncing effect speeds up over time.

    • Pattern 22: Gravity Effect LEDs appear to "fall" downward, creating a gravity-like effect.

    • Pattern 23: Spring Effect Like pattern 8, but with a spring-like bounce in the wave effect.

    • Pattern 24: Reflecting Bounce Create a bouncing pattern that reflects off the edges.

    • Pattern 25: Double Bounce Similar to pattern 17, but with the middle LEDs on.

    • Pattern 26: Wave Bounce A wave-like pattern that bounces back and forth.

    • Pattern 27: Breathing Effect Make the LEDs "breathe" by gradually brightening and dimming.

    • Pattern 28: Alternating Binary and One-Hot Switch between binary counting and one-hot encoding.

    • Pattern 29: Alternating LFSR and One-Hot Alternate between the LFSR sequence and one-hot encoding.

    • Pattern 30: Alternating LFSR and Binary Switch between the LFSR sequence and binary counting.

    • Pattern 31: DEMO This mode cycles through all the available patterns automatically, showcasing the variety of the patterns.

How to test

To test the MPLS module, follow these steps:

  • To create a simulation displaying all the patterns, run the target "make mpls_sim" in the src folder, this will run the testbench via icarus verilog for all patterns with a fixed time of simulation enough to see the patterns.

  • There is another target that simulates the PLL and 10MHz to 1Hz, 2Hz, 5Hz and 50Hz with the MPLS module by using "make tt_sim" in the src folder, running this one is not recommended since its meant for long testing and the VCD file can go up to 16GB if you let it run everything.

IO

#InputOutputBidirectional
0N/CLED[7]
1pattern_sel[4]LED[6]
2pattern_sel[3]LED[5]
3pattern_sel[2]LED[4]
4pattern_sel[1]LED[3]
5pattern_sel[0]LED[2]
6clk_selector[1]LED[1]
7clk_selector[0]LED[0]

Chip location

Controller Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux tt_um_chip_rom (Chip ROM) tt_um_factory_test (TinyTapeout 04 Factory Test) tt_um_vga_clock (VGA clock) tt_um_seven_segment_seconds (7 segment seconds) tt_um_marno_factorize (Number Factorizer) tt_um_sorter (Odd even sorter) tt_um_bulls_and_cows (The Bulls and Cows game) tt_um_loopback (TinyTapeout 04 Loopback Test Module) tt_um_devinatkin_arduino_vga (VGA Output for Arduino) tt_um_wokwi_371604537887211521 (Digital Cipher & Interlock System) tt_um_urish_simon (Simon Says game) tt_um_wokwi_372184284115580929 (YKM 7-seg driver) tt_um_currymottled (Configurable PID Block) tt_um_yeokm1_pwm_audio (PWM audio) tt_um_dcb277_ALU (4-bit ALU) tt_um_rgb_mixer (RGB Mixer) tt_um_loopback (TinyTapeout 04 Loopback Test Module) tt_um_algofoogle_raybox_zero (raybox-zero) tt_um_morningjava_top (ChipTune) tt_um_loopback (TinyTapeout 04 Loopback Test Module) tt_um_eldritch_pwm_peripheral (OpenSource PWM Peripheral) tt_um_phansel_laplace_lut (Experiment Number Six: Laplace LUT) tt_um_ks_pyamnihc (Karplus-Strong String Synthesis) tt_um_dlmiles_tt04_poc_usbdev (USB Device) tt_um_thorkn_pwmaudio (Audio-PWM-Synth) tt_um_wokwi_374029622762967041 (German Traffic Light) tt_um_dandy_dance (Dandy VGA) tt_um_robojan_top (Tiny Breakout) tt_um_vc_cpu (VC 16-bit CPU) tt_um_MichaelBell_nanoV (Risc-V Nano V) tt_um_urish_usb_cdc (USB CDC (Serial)) tt_um_tiny_processor (Tiny processor) tt_um_f_hal_fft (fft-4-tt) tt_um_tomkeddie_a (LED Panel Driver) tt_um_wokwi_370722051572189185 (OSU Counter) tt_um_wokwi_370796071922577409 (Even digits) tt_um_wokwi_370709383347782657 (Traffic light) tt_um_wokwi_371425977920989185 (Tutorial4) tt_um_riceshelley_tinyFPGA (Grain-Flex-FPGA) tt_um_mgyenik_bfcpu (BFCPU) tt_um_machinaut_systolic (AI Decelerator) tt_um_wokwi_374140166551523329 (Tiny (3-bit) LFSR) tt_um_jk2102 (Pulsed Plasma Thruster (PPT) Controller) tt_um_jayraj4021_SAP1_cpu (SAP-1 CPU) tt_um_wokwi_370533670565165057 (Impulse counter) tt_um_ashleyjr_delay_line (Delay Line) tt_um_simplepiano (Simple Piano) tt_um_wokwi_374292646686728193 (Ripple-Carry Adder) tt_um_led_multiplexer_display (Led Multiplexer Display) tt_um_mjbella_led_matrix_driver (LED Matrix Driver) tt_um_fifo_stevej (8-bit FIFO with depth 16.) tt_um_robojan_pong_top (Pong) tt_um_wokwi_374962052813090817 (8 panel display"") tt_um_wokwi_370690644715216897 (Traffic Light) tt_um_wokwi_374494377414857729 (Model Railway turntable polarity controller) tt_um_wokwi_347144898258928211 (Customizable UART string tx) tt_um_wokwi_347497504164545108 (7-Seg 'Tiny Tapeout' Display) tt_um_wokwi_347140425276981843 (UART character tx) tt_um_wokwi_347417602591556180 (Padlock) tt_um_noritsuna_8bitcounter_AI (8bits Counter by AI) tt_um_fm_transmitter (FM Transmitter) tt_um_wokwi_369864099838656513 (Test 4x4 memory) tt_um_htfab_rotfpga2 (ROTFPGA v2) tt_um_losaias (Arithmetic logic unit of four operations between two 8-bit numbers) tt_um_fir_top (FIR Filter) tt_um_santacrc_tamagotchi (Tamagotchi) tt_um_4_LUT_Baungarten (LFMPDM (Lightning Fast Matrix Programmable Design Module)) tt_um_RELOG_10M_Juan_Garcial (7 SEGMENTS CLOCK) tt_um_MultiPatternLEDSequencer_RSYO3000 (Multi Pattern LED Sequencer) tt_um_pwm (Generador de PWM) tt_um_chip_SP_measure_delay (Multi stage path for delay measurements.) tt_um_chip_SP_Soy_de_Zacapa (ASCII Text Printer Circuit) tt_um_fing_synchronizer_hga (Clock synchronizer) tt_um_db_PWM (Simple PWM Generator) tt_um_RS_Vfreq (CLK Frequency Divider) tt_um_ja_TrafficLight (UIS Traffic Light) tt_um_adder_NestorMatajira (4 bit adder ) tt_um_ALU_NicolasOrcasitas (8-bit ALU) tt_um_ccollatz_SergioOliveros (Collatz Conjecture) tt_um_wokwi_370011087462055937 (8 bit 4 data sorting network) tt_um_wokwi_374968111036708865 (BCD to 7 segments) tt_um_wokwi_374967675785369601 (4 bit full adder) tt_um_wokwi_374974793636964353 (Circuito Religioso) tt_um_wokwi_374815911155542017 (Demultiplexor NAND) tt_um_wokwi_374903567624066049 (Sumador/Sustractor de 3 bit con acarreo y prestamo) tt_um_wokwi_374515580784897025 (Hardware Lock) tt_um_wokwi_374909346558831617 (Custom falling and rising edge detection) tt_um_alu (4-bit-alu) tt_um_pong_neopixel (Angardo's pong) tt_um_LEOGLM_hamming_code_top ((11,7) hamming code encoder and decoder with UART) tt_um_adriannovosel_top (Impulse counter) tt_um_wokwi_374969806854695937 (State machine of an impulse counter) tt_um_wokwi_375061599421794305 (Logic Circuit 1) tt_um_biased_trng (Variable Duty-Cycle TRNG) tt_um_top (Modem Multimodo) tt_um_wokwi_372347167704674305 (SAR ADC Backend) tt_um_wokwi_375176944142127105 (FCFM 7-segment display) tt_um_rodrigomunoz1_rotempsensor_top (another ring oscillator based temperature sensor) tt_um_USM_temp_sens_hyst (RO-based temperature sensor with hysteresis) tt_um_FSM (Microrobotics FSM) tt_um_wokwi_375042398768251905 (MINI ALU) tt_um_wokwi_374778387606763521 (PWM Quisquilloso) tt_um_CPU (CPU 8 bit) tt_um_simple_processor_pablopabota (A Risc-V Instruction memory i2c programmer) tt_um_wokwi_375246321309880321 (IFSC 6-bit Locker) tt_um_wokwi_375217288209912833 (Randomizer and status checker) tt_um_wokwi_375245713375900673 (Simulador de cruzamento de semáforo) tt_um_wokwi_374636462642973697 (Full_adder_carry_juang_garzons) tt_um_ternaryPC_radixconvert (4-trit balanced ternary program counter and convertor) tt_um_darkfsegura_collatz (uDATAPATH_Collatz) tt_um_wokwi_375174630101280769 (Adder) tt_um_wokwi_375163050120587265 (Binary to 7 segment) tt_um_wokwi_375165100039571457 (Neuron) tt_um_silva (Later) tt_um_shift (serializer) tt_um_alu4_alonso59 (4-bits 1-channel PWM and ALU 4 bits) tt_um_mod_u_cnt_BCD (up-down counter with parallel load and BCD output) tt_um_ciro (Later) tt_um_control (Contador con carga) tt_um_onehot (onehot_decoder) tt_um_santiago (CDMA Transmitter/Receiver) tt_um_divider_urielcho (clock divider) tt_um_pwl_RaulprTech (reciprocal) tt_um_fabian (Later) tt_um_thezoq2_tmng (Time Multiplexed Nand-gate) tt_um_uninorte (Octal classifier) tt_um_dlmiles_muldiv4 (MULDIV unit (4-bit signed/unsigned)) tt_um_rs_write_decodifier_fjrn_cinvestav (RS Write Decodifier) tt_um_BounceFSM_RSX92 (Password FSM) tt_um_priority_decoder_Juan_Garcial (Priority e) tt_um_FreqMeter_Juan_Garcial (frecuencimeter) tt_um_sahrdayalfsr (lfsr random number generator) tt_um_i2c (i2c_6 bits) tt_um_wokwi_375227079413963777 (Fastest Finger) tt_um_wokwi_375300958229329921 (Fastest Finger (Clocked)) tt_um_zeptobars (Oscillators II) tt_um_rebot449_lingret_ALU_Top (Simple ALU) tt_um_loopback (TinyTapeout 04 Loopback Test Module) tt_um_wokwi_375288605206694913 (Adjustable Frequency LED Chaser) tt_um_wokwi_375310871188385793 (Simple QSPI DAC) tt_um_quardinlyttle_top (AQALU) tt_um_wokwi_375326293008530433 (Simple TMR) tt_um_chiplet_jtag (Poor Person's Boundary Scan) tt_um_wokwi_375248885704300545 (Probador de lógica básico) tt_um_rejunity_telluride2023_neuron (LIF Neuron, Telluride 2023) tt_um_kpwebb_adder (rusty_adder) 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 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 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 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 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 Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available