Before the advent of programmable logic, custom logic circuits were
built at the board level using standard components, or at the gate level in expensive
application-specific (custom) integrated circuits. The FPGA is an integrated circuit
that contains many (64 to over 10,000) identical logic cells that can be viewed as
standard components. Each logic cell can independently take on any one of a
limited set of personalities. The individual cells are interconnected by a matrix of
wires and programmable switches. A user's design is implemented by specifying the
simple logic function for each cell and selectively closing the switches in the
interconnect matrix. The array of logic cells and interconnect form a fabric of
basic building blocks for logic circuits. Complex designs are created by combining
these basic blocks to create the desired circuit.
The logic cell architecture varies between different device
families. Generally speaking, each logic cell combines a few binary inputs
(typically between 3 and 10) to one or two outputs according to a boolean logic function
specified in the user program . In most families, the user also has the option of
registering the combinatorial output of the cell, so that clocked logic can be easily
implemented. The cell's combinatorial logic may be physically implemented as a
small look-up table memory (LUT) or as a set of multiplexers and gates. LUT devices tend
to be a bit more flexible and provide more inputs per cell than multiplexer cells at the
expense of propagation delay.
Field Programmable means that the FPGA's function is defined by a user's
program rather than by the manufacturer of the device. A typical integrated circuit
performs a particular function defined at the time of manufacture. In contrast, the
FPGA's function is defined by a program written by someone other than the device
manufacturer. Depending on the particular device, the program is either
'burned' in permanently or semi-permanently as part of a board assembly process, or
is loaded from an external memory each time the device is powered up. This user
programmability gives the user access to complex integrated designs without the high
engineering costs associated with application specific integrated circuits.
Individually defining the many switch connections and cell logic
functions would be a daunting task. Fortunately, this task is handled by special
software. The software translates a user's schematic diagrams or textual hardware
description language code then places and routes the translated design. Most of the
software packages have hooks to allow the user to influence implementation, placement and
routing to obtain better performance and utilization of the device. Libraries of
more complex function macros (eg. adders) further simplify the design process by providing
common circuits that are already optimized for speed or area.