228 MC14500B Extended 1-bit Microcontroller SoC

228 : MC14500B Extended 1-bit Microcontroller SoC

Design render

How it works

This project transforms the classic 1-bit Motorola MC14500B Industrial Control Unit (ICU) architecture into a complete, independent System on Chip (SoC) micro-computer scaled across a 1x2 tile layout footprint. It is explicitly target-hardened for the TTIHP26b (IHP 130 nm BiCMOS SG13G2) silicon shuttle run.

The SoC operates completely autonomously, executing an internal, preloaded program code layout without needing external microcontrollers or clock-stretching hardware logic to drive its execution pipeline.

Core Architectural Features:

  • Sub-Core CPU: Fully independent 1-bit MC14500B CPU running the original 16-opcode Boolean logic Instruction Set Architecture (ISA).
  • Program Counter (PC): An internal 6-bit sequential stepping address counter register that loops through the 64-word program memory space.
  • On-Chip ROM Program Memory: 64 Words x 8-bit instruction bus width. Instructions use a split-bus strategy where the upper nibble ([7:4]) represents the CPU opcode, and the lower nibble ([3:0]) maps the data address operand.
  • On-Chip Data RAM Scratchpad: 8 independent, single-bit internal static register memory cells (4'h0 to 4'h7). Addresses 4'h8 to 4'hF are not general RAM — they are memory-mapped peripherals and reserved space (see below).

Memory & I/O Mapping Matrix:

  • Data Registers 4'h0 to 4'h7: General-purpose single-bit read/write internal scratchpad data storage registers.
  • Rising Edge Detector (4'h8): Hardware edge capture module that latches a rising-edge event on ui_in[0], live and independent of CPU stepping. Read the flag at address 8; write 1 to address 8 to clear it (once per instruction).
  • Programmable Clock Divider (4'h9): Read/write control bit for CPU execution speed. Writing 1 parks the CPU's instruction-fetch pipeline so it advances roughly once every 4096 real clock cycles instead of every cycle; writing 0 returns to full speed.
  • Hard-Wired Zero (4'hA to 4'hB): Always read as 0; writes have no effect.
  • Output Latch Array (4'hC): A dedicated 8-bit shift register drives the parallel output bus (uo_out[7:0]). Each STO/STOC to address 4'hC shifts one new bit in; it is not a mirror of the scratchpad RAM.
  • Parallel Input Taps (4'hD to 4'hF): Only the top three bits of the physical input bus — ui_in[5], ui_in[6], and ui_in[7] — are captured, once per CPU instruction step (one cycle of latency), and exposed read-only at addresses 4'hD, 4'hE, and 4'hF respectively. ui_in[4:0] are not addressable by the core.
  • Real-Time Signal Monitors: The bidirectional bus pins (uio_out) are configured as outputs for physical logic analyzer probing: uio_out[5:0] breaks out the Program Counter, and uio_out[7] breaks out the core write-enable strobe. uio_out[6] is unused (always 0).

Writes to the scratchpad and peripheral registers fire exactly once, on the first real clock edge after an instruction becomes current — this is decoupled from the clock divider. So a STO/STOC that gets parked by the divider for many physical clock cycles still commits its write immediately and then holds steady, rather than repeating on every physical edge or waiting for the divider's next pulse.

How to test

The design can be evaluated via behavioral RTL simulations, gate-level netlists, or directly on the physical hardware breakout board once manufactured.

Behavioral & Gate-Level Simulation (cocotb)

The integrated test framework uses Python-driven cocotb test scripts to step through clock events and monitor responses.

  1. Navigate your terminal environment into the test suite boundary: cd test
  2. Run the automated testing routine: make

The test harness sets up a stable 50 MHz simulation clock, executes a hardware reset, streams static bit patterns into the dedicated input pins, and verifies that the resulting parallel output states and instruction stepping lines align with the embedded ROM execution sequence.

Manual Hardware Testing

  1. Power-Up Reset Sequence: Drive the rst_n pin low, establish a stable running clock frequency source on the clk pin, and then return the rst_n pin high to begin the execution sequence.
  2. Signal Stimulus: Apply static or dynamic digital logic high/low voltages to individual lines across the dedicated parallel input bus (ui_in).
  3. Trace Observation: Monitor the uo_out parallel output bus pins using an oscilloscope or logic analyzer. Watch the output registers change state as the internal MCU loops through its ROM program, executes bitwise operations, and stores results back into the parallel latch array.

External hardware

This SoC is designed to be self-contained for standard verification loops, but can easily interface with basic external digital hardware components:

  • Logic Analyzer / Oscilloscope: Connect to the bidirectional bus pins (uio[7:0]) to capture physical trace files of the internal execution loop, track program counter stepping, and verify timing margins.
  • Parallel Input Switches: Connect a standard 8-pin DIP switch module or sensor array to the dedicated inputs (ui[7:0]) to feed parallel runtime data into the internal register mapping space.
  • LED Driver Array: Connect low-power LED diagnostic indicators to the dedicated output port pins (uo[7:0]) to display register processing states in real time.

IO

#InputOutputBidirectional
0ext_in[0]ext_out[0]pc_out[0]
1ext_in[1]ext_out[1]pc_out[1]
2ext_in[2]ext_out[2]pc_out[2]
3ext_in[3]ext_out[3]pc_out[3]
4ext_in[4]ext_out[4]pc_out[4]
5ext_in[5]ext_out[5]pc_out[5]
6ext_in[6]ext_out[6]rr_out
7ext_in[7]ext_out[7]write_pulse

Chip location

Controller Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Analog Mux Mux Mux Mux Mux Mux Mux Mux tt_um_chip_rom (Chip ROM) tt_um_factory_test (Tiny Tapeout Factory Test) tt_um_ieee_LDO (LDO) tt_um_chip_ieee_analog (IEEE Bandgap Reference) tt_um_snn_voice_calculator_mauro_ciccone (snn-voice-calculator) tt_um_hx2003_delay (4 Channel - 32 Tap Programmable Delay with Delay Locked Loop Calibration) tt_um_adxl362_test (tt_um_adxl362_test) tt_um_larsnit_cfar (1D CA/GO/SO CFAR radar detector) tt_um_abeccari_swsynth (Sine Wave Synthesizer) tt_um_dpi_adexp (AdExp DPI Neuron ) tt_um_140oo041_fpu130 (FPU-130) tt_um_blonghi_uart (uart) tt_um_directsgg_mini_proceo_8bit (Mini 8-bit Processor) tt_um_umaece1982_lfsr (Low-Power LFSR-Based Test Pattern Generator) tt_um_deploy_timer (launch deployment timer) tt_um_urish_simon (Simon Says memory game) tt_um_nimelli_kinematic_wave_engine (Kinematic Wave Engine) tt_um_multi_seg_monitor (Multi Segment Monitor) tt_um_UART_TX (project) tt_um_crc8_lfsr (CRC-8 Serial LFSR) tt_um_tinynpu4 (TinyNPU4) tt_um_alu_bns (6-bit multi function ALU ( eldawly_V2) ) tt_um_echoworld424_tpv (Timing-Prediction Test Vehicle) tt_um_gyro_lockin (Laser Gyro Lock-in Readout Core) tt_um_josue_olivos_sar_adc (4-Bit Charge-Redistribution SAR ADC Controller) tt_um_flower (VGA Flower) tt_um_vperumal_l1_fabric (Scalable Banked L1 Memory Fabric for Edge AI) tt_um_preinception_top (Preinception: Simple Compute Accelerator) tt_um_italu (iTALU: Interactive Testable Arithmetic Logic Unit) tt_um_neuron (4-Input Signed Neuron / Perceptron) tt_um_4tap_mac (4-Tap Signed MAC Unit) tt_um_mac_engine (DSP MAC Engine) tt_um_crypto_led_demo (QAMER CryptoUART: Encrypted UART with LED Status) tt_um_layernorm (LayerNorm) tt_um_ez130_8t_mystery (EZ130 8T Mystery Circuit) tt_um_sent2spi (SENT Receiver with SPI Interface) tt_um_llr_hepiarisc (Hepiarisc with SPI flash) tt_um_rebeccargb_vga_pride (VGA Pride) tt_um_hasi_ising (Oscillator Ising Machine) tt_um_c061618g2 (Circuitli C061618G2) tt_um_tiny_dram_pim (Tiny Dual-Channel DRAM-PIM Controller + PU) tt_um_Tbilisi_CORDIC_Engine (Tbilisi CORDIC Engine) tt_um_rahulmascarenhas_folded_nn (Frozen ternary backbone + loadable head) tt_um_miniMAC (miniMAC_IHP26b) tt_um_rumcajs (IEEE DOORSH) tt_um_sg13g2_mystery (SG13G2 Mystery Circuit) tt_um_ULSR88 (ULSR demo) tt_um_ez130_7t_mystery (EZ130 7T Mystery Circuit) tt_um_tinyopt4 (ieee_tt_tinyopt4) tt_um_vga_example (IEEE VGA Animated Beach) tt_um_hyphen133_drone_detection (IEEE Acoustic Drone Detector) tt_um_nuatlabs_fifo_pwm (Async FIFO with CDC + PWM Peripheral) tt_um_nuatlabs_uart (8N1 UART Transceiver) tt_um_eeg_threshold_detector (IEEE Digital EEG Threshold Event Detector) tt_um_smart_traffic (Smart Traffic Light Controller) tt_um_94442024_mini_cpu (Mini 8-bit Accumulator CPU) tt_um_wokwi_475369131246576641 (IEEE_UPB_TT_1) tt_um_aion (AION) tt_um_rebeccargb_hardware_utf8 (Hardware UTF Encoder/Decoder) tt_um_rebeccargb_universal_decoder (Universal Binary to Segment Decoder) tt_um_rebeccargb_intercal_alu (INTERCAL ALU) tt_um_flappy_bird (IEEE Flappy Bird VGA Game) tt_um_oryan01_alu (ALU CASS PUCV) tt_um_S4xU4 (S4xU4) tt_um_vga_ca (Space CA) tt_um_llr_simplenpu (simple SPI flash streaming NPU) tt_um_pucv_pspwm (3LFCC PS-PWM Modulator) tt_um_yuri_fpga (Tiny FPGA) tt_um_mikailgedik_inverted_inverters (Inverted inverters) tt_um_esauqch_hamming74 (Hamming(7,4) encoder/decoder (IEEE)) tt_um_hackin7_analog_experiments (TinyAnalogExperiments) tt_um_snake (snake game) tt_um_mini_kraken (Kraken IO Subprocessor) tt_um_fabien_pio (AstraPIO) tt_um_chiplab (ChipLab) tt_um_wokwi_475490677474407425 (Tiny_Divider) tt_um_c061618g2tr (Circuitli C061618G2TR) tt_um_catalinlazar_nanopio (nanoPIO) tt_um_catalinlazar_uart_spi_i2c_bridge (UART-SPI-I2C Bridge) tt_um_enzonappi_sent_i2c (SENT to I2C bridge) tt_um_kush1434_proof (Proof) tt_um_schwallsunk_signal_discriminator (Highspeed voltage discriminator) tt_um_tiarinix_ttihp_verilog_template (8-bit educational SAP-style CPU) tt_um_vga_glyph_mode (BOOTCAMP) tt_um_GiulioGirelli_packet_processor (Configurable Low-Latency Match-Action Packet Processor) tt_um_vga_tictactoe (Tic Tac Toe) tt_um_vga_dvd_player (DVD player) tt_um_clea_katseye_rain (KATSEYE) tt_um_romd_uart_hello (UART Hello World) tt_um_vga_snake (CDM PYTHON GAME) tt_um_vga_slot_machine (tt_um_vga_slot_machine) tt_um_jet_seq8b (SEQ8 Programmable Sequencer) tt_um_kibo_leak_inspect (KIBO Leak-Inspection Target Controller (VGA)) tt_um_endless_runner (Endless Runner) tt_um_omega_infinity_kaoru (OMEGA INFINITY KAORU 3D Metal Grid Processor) tt_um_nikleberg_mixer (Mixer) tt_um_lahnb_sgdma (TinyDMA: A Descriptor-Based Dual-PSRAM Memory Mover) tt_um_gstj_lockin (Digital IQ Lock-in (IEEE)) tt_um_benpayne_ps2_decoder (PS/2 Keyboard Decoder for 68k) tt_um_cass_s_ui_neuron_lif (Neurona LIF con Aprendizaje STDP Dinamico (IEEE)) tt_um_vga_glyph_mode_CDM_Matrix (CDM Matrix) tt_um_qd39l_xor_stream (Fixed-ROM XOR Stream Engine) tt_um_conv3x3 (3x3 Clock Rate Streaming Input Convolution Engine) tt_um_mc14500b_soc_extended (MC14500B Extended 1-bit Microcontroller SoC) tt_um_vga_hypno_spiral (tt_um_vga_hypno_spiral) tt_um_mattizen_morse_tree (Morse Tree LED Decoder) tt_um_CDM (Colegio de Muntinlupa DVD-like Display) tt_um_romd_uart_loader (UART SPI RAM Loader) tt_um_TscherterJunior_stapel_geraet (stapel gerät) tt_um_das2225_dna_accel (DNA_Accel) tt_um_tinysoc (TinySoC) tt_um_barrel_shifter (Barrel Shifter) tt_um_approx_mac_coprocessor (Approximate DSP: Time-Multiplexed MAC Coprocessor) tt_um_joesagents_market_split_oracle (Market-split oracle) tt_um_mgpauly1458_ringmeter (Ring oscillator frequency meter) tt_um_pettit_prism_lite (PRISM with Risc-V (TinyQV) SoC) tt_um_workshop_cpu (IEEE Workshop Simple CPU) tt_um_algofoogle_analog_junk (Simple comparator + 2 DACs analog layout in a 1x1 tile) tt_um_lkhanh_cordic (TinyQV SoC (Dual Memory Backend)) tt_um_4x4npu (4x4NPU: Dual-Lane INT4 Neural Accelerator) tt_um_abiaselli_izh_bridge_3x2 (Izhikevich event bridge (4 contexts)) tt_um_fabulous_ihp_26b (Tiny FABulous FPGA) tt_um_zanderivo_voronoi (Four-Metric VGA Nearest-Prototype Visualizer)