FPGA or MCU? Choosing by parallelism, timing and cost
“Should this be an FPGA or a microcontroller?” is one of the highest-leverage early decisions in a hardware project, and it’s usually made on vibes — FPGAs feel intimidating, MCUs feel familiar, so the MCU wins by default. That’s often right, but sometimes it ships a product that can’t meet timing or burns a CPU at 100% doing something an FPGA would do in one clock. The decision isn’t about which is “more powerful”; it’s about a single structural difference in how they compute, and the trade-offs that fall out of it.
One ALU over time vs a fabric over space
A microcontroller has a CPU: a small number of execution units that run instructions one after another, reusing the same ALU every cycle. An FPGA is the opposite — a sea of configurable logic cells you wire into dedicated hardware, where many operations happen at the same instant, each in its own piece of silicon.
Figure 1 — The whole difference in one picture. A CPU time-shares one unit across operations; an FPGA gives each operation its own hardware and runs them simultaneously.
That’s the entire mental model. A CPU spends time to do many things; an FPGA spends space. Everything else — why FPGAs crush high-rate signal processing, why they’re cycle-deterministic, why they cost more and take longer to develop — follows from it. A CPU doing four operations needs four cycles; an FPGA does four (or four hundred) operations in the same cycle, as long as you have the fabric to lay them out.
The trade-offs that fall out
Because the CPU is sequential and the FPGA is spatial, each is dramatically better at opposite kinds of work:
Figure 2 — The same structural difference, applied. The MCU wins on cost, ecosystem and ease; the FPGA wins on parallel throughput and hard-deterministic timing.
The points that decide most projects:
- Throughput and latency. An FPGA processes data at the rate it arrives, with a fixed, cycle-exact latency — no operating system, no interrupt jitter, no cache surprises. For a CPU, throughput is capped by clock × cores, and worst-case latency depends on whatever ISR happens to be running. If you need to react to an edge in a handful of nanoseconds, or sustain a data rate a CPU + DMA can’t keep up with, that’s FPGA territory.
- Determinism. Because the logic is physical, an FPGA’s timing is the same every time. An MCU is fast on average but has jitter — fine for most control, fatal for some signal paths.
- Development effort. This is the real cost of an FPGA. You write HDL (Verilog/ VHDL), think in clock domains, and fight timing closure — getting the design to meet its clock across the chip. An MCU is C, a vendor HAL, and a debugger you already know; you’re running in an afternoon.
- Cost and power. MCUs are cheap and sip power for control workloads; FPGAs cost more per unit and generally draw more. (Per-operation at high rates an FPGA can be more efficient — but for a thermostat it’s absurd overkill.)
So which one?
The honest default is MCU until something forces your hand — cost, ecosystem and time-to-market almost always favour it. Reach for an FPGA when the problem is parallel or the timing is too tight for software:
Figure 3 — A practical guide. Sequential control and ecosystems → MCU; parallel, line-rate, cycle-deterministic work → FPGA; both at once → an SoC FPGA.
And you don’t always have to choose. SoC FPGAs (Xilinx Zynq, Intel Agilex SoC, Microchip PolarFire SoC) put hard ARM cores and programmable fabric on one die — you run Linux or your control loop on the CPU and offload only the hot, parallel path to the fabric, talking over an on-chip bus. It’s the best of both worlds at the cost of the most complexity, and it’s why so many high-end radios, cameras and motor drives look like “a processor with an FPGA bolted on” — because that’s exactly what they are.
Field notes
- Default to an MCU; justify the FPGA. The question isn’t “could an FPGA do this?” (it can) — it’s “does the problem need parallelism or timing a CPU can’t give?” If not, you’ll ship faster and cheaper in C.
- The classic FPGA wins are line-rate and parallel I/O: high-speed serial, multi-channel ADC capture, video pipelines, many independent PWM/encoder channels, and protocol bridges — things that are “one clock” in hardware but a CPU-melting loop in software.
- Budget for timing closure, not just coding. The HDL is the easy part; getting a big design to meet timing across clock domains is the schedule risk. (Clock-domain crossing is its own deep topic — and its own bug class.)
- Consider an SoC FPGA before splitting into two chips. One die with ARM + fabric is often simpler than an MCU plus a separate FPGA wired together.
- Match the tool to the bottleneck. If the CPU is at 100% shuffling a fast data stream, that’s the signal to move that stream into fabric — not necessarily the whole design.