487 Multi-Protocol Communication Controller

487 : Multi-Protocol Communication Controller

Design render
  • Author: Chirantan J Tilavalli
  • Description: Supports UART, SPI and I2C transmission modes using a compact single-module design.
  • GitHub repository
  • Open in 3D viewer
  • Clock: 1000000 Hz

Multi-Protocol Communication Controller

Description

The Multi-Protocol Communication Controller is a compact digital communication module designed for Tiny Tapeout. The controller supports three commonly used serial communication protocols: UART, SPI, and I2C. A protocol is selected using dedicated mode control inputs, allowing the same hardware to operate in different communication modes.

This project demonstrates finite state machine (FSM) based protocol control, serial data transmission, and multiplexed protocol selection while fitting within a Tiny Tapeout 1x1 tile.

How it works

The design accepts a 4-bit input data value, a start signal, and two mode selection bits.

Protocol Selection
MODE[1:0] Protocol
00 UART
01 SPI
10 I2C
11 Reserved

When the START signal is asserted, the controller loads the input data and begins transmission according to the selected protocol.

Inputs
Input Description
DATA0-DATA3 4-bit data input
START Starts transmission
MODE0 Protocol select bit 0
MODE1 Protocol select bit 1
RESET Resets the controller
Outputs
Output Description
UART_TX UART transmit output
SPI_MOSI SPI master output
SPI_SCLK SPI serial clock
SPI_CS SPI chip select
I2C_SDA I2C data line
I2C_SCL I2C clock line
BUSY Transmission in progress
DONE Transmission completed

The controller uses a simple state machine consisting of IDLE, LOAD, SEND, and DONE states to manage the communication process.

How to test

UART Test
  1. Apply RESET.
  2. Set MODE = 00.
  3. Load DATA[3:0] with a test value.
  4. Assert START for one clock cycle.
  5. Observe UART_TX output.
  6. Verify BUSY becomes high during transmission.
  7. Verify DONE becomes high after transmission completes.
SPI Test
  1. Apply RESET.
  2. Set MODE = 01.
  3. Load DATA[3:0] with a test value.
  4. Assert START.
  5. Observe SPI_MOSI, SPI_SCLK, and SPI_CS.
  6. Verify BUSY and DONE operation.
I2C Test
  1. Apply RESET.
  2. Set MODE = 10.
  3. Load DATA[3:0] with a test value.
  4. Assert START.
  5. Observe I2C_SDA and I2C_SCL outputs.
  6. Verify BUSY and DONE operation.
Simulation

Run the Tiny Tapeout cocotb tests:

cd test
make -B

The supplied cocotb testbench automatically verifies UART, SPI, and I2C operating modes.

External hardware

No external hardware is required. The design can be fully verified through simulation using the provided cocotb testbench.

IO

#InputOutputBidirectional
0DATA0UART_TX
1DATA1SPI_MOSI
2DATA2SPI_SCLK
3DATA3SPI_CS
4STARTI2C_SDA
5MODE0I2C_SCL
6MODE1BUSY
7RESETDONE

Chip location

Controller 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 (Tiny Tapeout Factory Test) tt_um_Vincent2405_adder_tree (BSD Convolution Adder Tree) tt_um_BastiBudde_i2c_slave_sensor (I2C Slave Template with Emulated Sensor) tt_um_60hz_load (60 Hz Grid-Forming ASIC with Dump-Load Control) tt_um_spi_config_reg (Simple SPI configuration for analog designs) tt_um_ex_drosen766 (Project) tt_um_spi_cpu_top (SPI-CPU) tt_um_d5smith_mfa (Music for ASICs) tt_um_i2c_master (I2C Master Controller) tt_um_aswarby_mac (Aswarby INT8 MAC) tt_um_arrakeen_spsram_direct (TT-Arrakeen-SPSRAM-direct) tt_um_alu (8-bit Interactive ALU) tt_um_JCT_PoC (ttgf jct PoC) tt_um_jct_lea (LEA-128) tt_um_cwru_cpu (CWRU CPU) tt_um_teapot (100Mbps Ethernet Accelerator Wrapper) tt_um_jte_cordic (CORDIC sin/cos generator) tt_um_aidenkoch4 (Three Channel RGB PWM Controller) tt_um_pschuetz_tremolo (Tremolo guitar pedal ASIC) tt_um_jsabree11_fibonacci_checker (fibbonaci_tt) tt_um_connerdaehler_boop (Procedural ASIC) tt_um_Kieckenwama_Traffic_LIGHT_FSM (Traffic Light FSM) tt_um_KimLuu02_WashingMachine_FSM (WashingMachine_FSM) tt_um_PaulineKreis_PWM_Analyser (PWM-Analyser) tt_um_PWM (PWM Generator) tt_um_wokwi_466666882406199297 (Simple Sprinkler) tt_um_rebeccargb_universal_decoder (Universal Binary to Segment Decoder) tt_um_rebeccargb_hardware_utf8 (Hardware UTF Encoder/Decoder) tt_um_spi_master (SPI Master Slave Communication) tt_um_likitha_trng (Secure TRNG Entropy Generator) tt_um_wnn (8-bit WNN Pattern Recognizer) tt_um_raksha (Raksha) tt_um_uart_soc (UART_SOC) tt_um_ecdsa_verify (ECDSA Verification) tt_um_ecc_processor (ECC Processor) tt_um_fast_auth (Fast Authentication Accelerator) tt_um_karthik_trng (TRNG using Ring Oscillator) tt_um_push (Secure V2X Mini Demonstrator) tt_um_santosh_aes_sbox (AES S-Box Accelerator) tt_um_hardware_anomaly_detection (Hardware Anomaly Detection) tt_um_multi_protocol (Multi-Protocol Communication Controller) tt_um_pqc_ntt_butterfly (PQC NTT Butterfly Core) tt_um_cambridge_nlfsr (Programmable Chaotic NLFSR) tt_um_4b_accumulator_cpu (4 bit Accumulator CPU) tt_um_spi_slave (SPI Slave with 8-Register File) tt_um_geeta_doddamani_lfsr (4-bit Maximum-Length LFSR) tt_um_ecc_accelerator (ECC Scalar Accelerator) tt_um_egurapha_chacha20 (ChaCha20) tt_um_configurable_pwm (Configurable PWM Generator) tt_um_Arctic0 (Arctic0 16-bit CPU) tt_um_comp8 (8-bit Comparator) tt_um_pwm_cit (Configurable 8-bit PWM Generator) tt_um_rameshwar_door_lock (Digital Door Lock) tt_um_sandy_venky (8-bit LFSR Circuit) tt_um_ljhahne_pong (Pong) tt_um_v2x_warning (V2X Collision Warning) tt_um_ecc_scalar_mult (ECC Scalar Multiplication) tt_um_fhw_appel_spiPWMio (spiPWMio) tt_um_arrakeen_spsram_direct_sramrules (TT-Arrakeen-SPSRAM-direct-sramrules) tt_um_arrakeen_spsram_direct_5v (TT-Arrakeen-SPSRAM-direct-5V) tt_um_LukeSilva_cartrip (Car Trip) tt_um_coffeepot (100Mpbs 3 port Ethernet switch) tt_um_emiliopeju_lightscan (Lightscan) tt_um_Alanduan21_triad01_top (triad01) tt_um_lif_snn (4-Neuron LIF Spiking Neural Network) tt_um_smerity_mandelbrot (Smerity-Mandelbrot) tt_um_elvtide01_7SegmentDice (7SegmentDice) tt_um_elemental_harmony (Elemental Harmony Game) tt_um_pattern_gen (Programmable Waveform and PWM Generator) tt_um_antimatter15_pdm_vad (PDM Voice Activity Detector) tt_um_layla_spike_detector (Neural Spike Detector) tt_um_detronyx_arith_lab (Detronyx Arithmetic Lab Tile) tt_um_hasheddan_nni (Nearest Neighbor Interpolation) tt_um_brisq (BRISQ) tt_um_santhosh_spike_codec_gf (Neuromorphic Spike Codec (GF180)) tt_um_santhosh_aer_router_gf (Asynchronous-AER Spike Router (4-phase REQ/ACK, 16-entry routing table, GF180)) tt_um_santhosh_snn_wta_gf (Spiking Neural Network WTA Inference Engine (GF180)) tt_um_santhosh_cim_bist_gf (CIM Controller with BIST and Fault Map (GF180)) tt_um_santhosh_neuro_puf_gf (Neuromorphic PUF (distinct-tap LFSR arbiter + memristor XOR, GF180)) tt_um_detronyx_uart_trace_exerciser (Detronyx UART Trace Exerciser) tt_um_ro_puf (Tiny RIng Oscillator PUF) tt_um_franretfie_top (Quadrature sine generator) tt_um_cherny_xor_8bi (XORing given bits) tt_um_mealycpp_ascon_sdmc_uart (ASCON Integrated Crypto Processor) tt_um_reflex_s4 (AER Reflex Chip - MCP2515 CAN gateway) tt_um_polytrig_core (PolyTrig Digital Waveform Synthesis Core) tt_um_waferspace_vga_screensaver (Wafer.space Logo VGA Screensaver) tt_um_2048_vga_game (2048 sliding tile puzzle game (VGA)) tt_um_urish_simon (Simon Says memory game) Available