FPGA vs Microcontroller (MCU)
Compare the fundamental architectures, execution models, performance characteristics, and cost profiles of FPGAs and microcontrollers to know exactly when to use each.
Two Fundamentally Different Machines
A microcontroller (MCU) and an FPGA are both programmable silicon devices, but they represent completely different philosophies of computation. Understanding the distinction at the architectural level — not just as a checklist — is what separates engineers who make good technology choices from those who reach for the wrong tool.
An MCU implements the Von Neumann architecture: a fixed CPU core, fixed memory (Flash + SRAM), and fixed peripherals (UART, SPI, I2C, ADC). You write firmware in C/C++ that the CPU executes sequentially — one instruction at a time. The hardware never changes; only the software changes. An ARM Cortex-M4 running at 168 MHz executes at most one instruction per clock cycle (with limited 2-wide superscalar on some variants). It's fast, but fundamentally sequential.
An FPGA implements a configurable dataflow architecture: you describe hardware circuits in RTL (VHDL or Verilog), synthesize them into gates and flip-flops, and the FPGA fabric becomes that circuit. There is no instruction pointer. Every LUT, flip-flop, and DSP slice in your design evaluates every clock cycle simultaneously. You're not programming a computer — you're designing a computer.
Architecture Side by Side
Microcontroller (MCU)
- Fixed CPU core (ARM Cortex-M, RISC-V, AVR)
- Fixed on-chip Flash memory (16KB–2MB)
- Fixed on-chip SRAM (4KB–1MB)
- Fixed peripherals: UART, SPI, I2C, USB, ADC, PWM
- Fixed clock domains (usually 1–3)
- Sequential instruction execution
- Interrupt-driven event handling
- Power: µW (sleep) to ~500mW (active)
- Cost: $0.10–$20 per unit
- Dev language: C/C++/MicroPython
FPGA
- Configurable LUT array (thousands to millions of LUTs)
- Programmable Block RAM (BRAM, 36Kb per block)
- Hardened DSP slices (18x18 or 27x18 multipliers)
- Flexible I/O supporting 100+ voltage standards
- Multiple independent clock domains (hundreds)
- True parallel evaluation every clock cycle
- Hardware interrupt response (zero latency)
- Power: 100mW–10W typical
- Cost: $5–$500+ per unit
- Dev language: VHDL, Verilog, SystemVerilog, HLS
Internal Architecture Comparison
Performance: Clock Speed vs Actual Throughput
Clock speed comparisons between MCU and FPGA are misleading without context. An MCU at 480 MHz (STM32H7) is impressive — but it executes one instruction per cycle. An FPGA at 250 MHz might have 10,000 DSP slices all running multiply-accumulate simultaneously. The relevant metric is work done per second, not cycles per second.
For a 16-channel audio mixer running 256-tap FIR filters per channel: an MCU needs to execute 16 × 256 × 48,000 = 196.6 million MACs per second. An STM32H7 at 480 MHz with DSP instructions can sustain roughly 480 MMAC/s — it handles the load, but uses ~40% of CPU time on filtering alone, leaving little headroom. An FPGA implements 16 × 256 = 4,096 parallel MAC units, completing all 16 filter channels simultaneously in a single clock cycle at any frequency above 50 kHz — leaving 99.9% of the FPGA fabric available for other functions.
Head-to-Head: Capability Radar
Comprehensive Comparison Table
| Parameter | Microcontroller (MCU) | FPGA |
|---|---|---|
| Architecture | Von Neumann — fixed CPU, fixed memory | Dataflow — configurable logic fabric |
| Execution Model | Sequential instruction fetch/decode/execute | Parallel — all logic evaluates every clock cycle |
| Clock Speed | 8 MHz – 480 MHz (single core) | 50 MHz – 700 MHz per clock domain (hundreds of domains) |
| Parallel Operations | 1–8 (with SIMD/DSP instructions) | Thousands to millions simultaneously |
| Programming Language | C, C++, Assembly, MicroPython, Rust | VHDL, Verilog, SystemVerilog, HLS (C++), Vivado IP |
| Memory | Fixed Flash (16 KB–2 MB) + SRAM (4 KB–1 MB) | Configurable BRAM (kilobits–megabits), distributed RAM, external DDR |
| Power (active) | 1 mW – 500 mW | 100 mW – 10 W (design-dependent) |
| Power (sleep) | 1 µW – 100 µW | ~50 mW static (SRAM cells always powered) |
| Unit Cost | $0.10 – $20 | $5 – $500+ |
| Boot/Start Time | <1 ms (from cold) | 10–100 ms (bitstream load from SPI Flash) |
| Custom Interfaces | Limited to built-in peripherals; bit-bang costly | Any voltage standard, any protocol, any timing |
| Real-Time Timing | Yes (bare metal), No (with RTOS jitter) | Absolute — hardware guarantees timing |
| Development Time | Hours to days (familiar toolchain) | Days to months (RTL + synthesis + P&R + timing closure) |
| Debugging | Easy — JTAG/SWD, printf, GDB | Complex — ILA (Integrated Logic Analyzer), simulation required |
| Best For | Control logic, UI, simple protocols, IoT, low power | Data processing, custom protocols, high throughput, parallel algorithms |
A: Yes — via bit-banging (software toggling of GPIO pins). But this approach ties up 100% of the CPU during transmission, adds timing jitter from interrupt latency, and cannot exceed a few MHz. An FPGA implements the protocol as dedicated hardware with zero CPU overhead, deterministic timing, and can run at hundreds of MHz. For production systems where the CPU needs to do other work, FPGA wins.
Selection Guide: MCU or FPGA?
Knowledge Check
- MCU executes instructions sequentially; FPGA evaluates all logic in parallel
- MCU executes in parallel; FPGA executes sequentially
- Both execute instructions sequentially but at different speeds
- Both evaluate all logic in parallel simultaneously
- Microcontroller with SIMD extensions
- FPGA with custom parallel logic fabric
- MCU with dual-core symmetric multiprocessing
- MCU with DMA controller offload
- True — especially in sleep modes, MCUs reach µW; FPGAs have ~50 mW static power minimum
- False — FPGAs are always more power efficient due to parallelism
- True — MCUs always consume less power regardless of the task
- False — they consume exactly the same power for equivalent tasks
- C, C++, Python
- Assembly and machine code
- VHDL, Verilog, SystemVerilog (and HLS for C++ synthesis)
- Java and Kotlin (for JVM-based toolchains)
- Microcontroller — low power sleep, built-in BLE radio, simple task, µA sleep current
- FPGA — more flexible, can implement custom BLE stack in hardware
- FPGA with external BLE module — best of both worlds
- Either — they perform identically for this use case
- Artix-7
- Kintex UltraScale
- Zynq-7000 and Zynq UltraScale+ MPSoC
- Virtex UltraScale+