FPGA architecture
How an FPGA is built from the look-up table up to the die, and why the shape of the silicon decides what your design can do.
Overview
An FPGA is a large array of small programmable logic cells, a programmable wiring network to join them, and a set of harder blocks (memory, multipliers, clock managers, transceivers) dropped into the array where the vendor thinks they will earn their area. This hub is for anyone who wants to understand what the synthesiser is actually targeting, so that the numbers in a utilisation report and the red paths in a timing report make sense.
The architecture matters because every design decision is a decision about silicon. A 64-bit adder costs a run of carry chain. A 2 KB lookup costs one block RAM, whether you use all of it or not. A clock that crosses the whole die costs a global buffer and some skew. Once you can see the fabric, you can predict cost before you build, and you can read a vendor datasheet without being misled by headline numbers.
Key ideas
The logic cell: LUT, flip-flop and carry
The LUT is a tiny memory. A 6-input LUT holds 64 bits and can implement any Boolean function of six inputs by storing its truth table. Next to it sits a flip-flop, so that the output can be registered, and a dedicated carry path so that adders and counters do not have to be built out of general LUTs. AMD groups eight such cells into a CLB slice pair. Altera calls its cell an adaptive logic module (ALM), which is a fracturable 8-input structure that can act as one large or two smaller LUTs. Lattice, Gowin and Efinix mostly use 4-input LUTs, which are smaller and cheaper but need more of them for the same function. Comparing “logic cells” across vendors is therefore approximate at best.
Routing and the bitstream
Most of the area and most of the delay in an FPGA is wiring, not logic. Every cell connects through programmable multiplexers to tracks of different lengths, and the placer and router spend their time picking which tracks to use. On a typical design, routing delay is comparable to or larger than LUT delay, which is why a design that is “only 30 % full” can still fail timing when the logic is spread across the die. The chosen state of every mux, every LUT table and every flip-flop option is written to configuration memory at power-up. Most devices hold that memory in SRAM, which is why they need an external flash or a host to load them. Some Lattice, Microchip and Gowin parts use flash or antifuse configuration and come up without a loader.
Hard blocks: block RAM, DSP and clocking
Block RAM (BRAM) is a column of true dual-port memories, typically 18 Kb or 36 Kb each on AMD parts and 20 Kb (M20K) on Altera. DSP slices contain a multiplier (27 by 18 bits on AMD UltraScale, variable precision on Altera) with a pre-adder and an accumulator, pipelined to run at the fabric’s top clock. Clock management tiles (MMCM and PLL on AMD, IOPLL and fPLL on Altera) synthesise clocks and remove skew, and a tree of global and regional buffers distributes them. The I/O ring adds programmable standards, delay lines, serialisers and, on larger parts, gigabit transceivers. The ratio of these blocks to plain logic is the real difference between device families, and it is the ratio your application cares about.
Newer tile types
Larger devices add coarser structures. AMD Versal places an array of vector processors (AI Engines) and a network on chip beside the fabric. Altera Agilex has hardened memory controllers and a hyper-registered routing fabric. Achronix has machine-learning processors and a network on chip in Speedster7t. Lattice and Efinix instead keep tiles small and spend area on low power. Which of these is “better” depends entirely on the workload.
Where to start
The beginner track builds this picture one lesson at a time:
- /learn/beginner/01-what-is-an-fpga/ places FPGAs between microcontrollers and ASICs.
- /learn/beginner/02-how-an-fpga-is-programmed/ follows a bitstream from file to configuration memory.
- /learn/beginner/03-combinational-logic-and-luts/ builds Boolean functions out of LUTs.
- /learn/beginner/04-registers-clocks-and-state/ adds the flip-flop and the clock.
- /learn/beginner/09-memories-block-ram-and-fifos/ uses block RAM properly.
Intermediate lessons on routing, clocking and hard-block inference are coming.
Tools and vendors
| Vendor | Logic cell | Block RAM | DSP | Tool | Hub |
|---|---|---|---|---|---|
| AMD | 6-input LUT, CLB slices | 18/36 Kb BRAM, UltraRAM | DSP48E2, DSP58 | Vivado | /vendors/amd/ |
| Altera | 8-input ALM | M20K | Variable-precision DSP | Quartus Prime | /vendors/altera/ |
| Microchip | 4-input LUT (PolarFire) | LSRAM 20 Kb, uSRAM | Math block 18x18 | Libero SoC | /vendors/microchip/ |
| Lattice | 4-input LUT | EBR 9/18 Kb | sysDSP | Radiant, Diamond | /vendors/lattice/ |
| Efinix | 4-input LUT (XLR) | 5/10 Kb | 18x19 multiplier | Efinity | /vendors/efinix/ |
| Gowin | 4-input LUT | BSRAM 18 Kb | 18x18 multiplier | Gowin EDA | /vendors/gowin/ |
Block sizes above are the common cases at the time of writing. Check the specific family datasheet before counting resources.
Common mistakes
- Comparing vendors by “logic cells” or “logic elements” without converting to equivalent LUT4 or LUT6 counts.
- Writing a memory that does not match the block RAM template, so it is built from thousands of flip-flops instead.
- Assuming an unused resource is free. An idle block RAM still consumes static power and occupies a column that may block placement.
- Driving a clock from logic (a gated or divided clock) instead of using the clock manager and clock enables.
- Reading only the headline frequency. The fabric’s maximum clock rarely survives a real design with real routing.
- Ignoring the configuration path until board bring-up, then discovering the flash footprint or boot mode pins were wrong.
Going deeper
- AMD UG474, 7 Series FPGAs Configurable Logic Block: the clearest single description of a modern LUT6 slice.
- AMD UG574, UltraScale Architecture Configurable Logic Block: the UltraScale and UltraScale+ slice.
- AMD UG573, UltraScale Architecture Memory Resources: block RAM and UltraRAM in detail.
- AMD UG579, UltraScale Architecture DSP Slice: the DSP48E2 slice.
- Kuon and Rose, “Measuring the Gap Between FPGAs and ASICs”: the paper that put numbers on the area, speed and power cost of programmability.
- Project X-Ray documentation: a reverse-engineered view of a 7 Series bitstream, useful for seeing what configuration memory really holds.