An FPGA, or field programmable gate array, is a way to implement a digital circuit on a chip without fabricating it from scratch. This allows the designer to get a result more quickly, which can be useful for prototyping, and is much cheaper if only a small number of the chips need to be produced. If millions of devices need to be made, then an ASIC is probably going to be much cheaper than using FPGAs for the same function, and will have higher performance.
An FPGA is quite like an ASIC, but has some major differences.
- Available to buy blank chips cheaply, off-the-shelf
- Can program your digital design onto them, over and over again
- Have a very limited set of standard cells - at the least lookup tables, flip-flops, memories. Could include multipliers, memory controllers or other high speed interfaces.
- No analogue capability
- Slower than an ASIC
They have a reasonable overlap of the tools required to design for them. FPGAs need synthesis, place and route, simulation and verification tools. Additionally you need a tool that can take the finished bitstream and send that to the FPGA for programming.
An FPGA consists of a huge amount of repeated logic elements/blocks/slices. These pictures are of the Lattice iCE40 FPGA.
These usually contain a lookup table, a flip-flop and some carry-logic (speeds up addition).
The lookup table can be programmed to model any type of gate - for example an inverter or a 4 input NAND.
An FPGA board can help you test your digital design at speed. For example I can simulate my vga clock, and even simulate the screen. But with an FPGA I can actually plug it into a real screen and see it works.
If you want to buy an FPGA board to play with and help you learn digital design, I recommend going for one with an active, supportive community:
If you’re interested in learning how the Open Source FPGA tool flow works from end to end, check this video series I did for Symbiotic EDA.
Having the formal verification part additionally felt nice, that I could have something that I know is going to be functional instead of just guessing for a long time and then looking at waveforms and then not knowing what hell I'm doing!