# Field-programmable gate array

Een field-programmable gate array (FPGA) is een geïntegreerde schakeling bestaande uit programmeerbare logische componenten. Deze logische componenten kunnen geprogrammeerd worden als logische functies zoals AND, XOR enzovoorts. Deze functies kunnen bijvoorbeeld decoders of eenvoudige wiskundige functies zijn. In het merendeel van de FPGA's kan men ook logische elementen terugvinden in de logische blokken.
FPGA’s zijn ontstaan in de jaren 80. Vanaf toen werden ze veelvuldig toegepast in prototypes en producten. Een FPGA is een speciaal soort programmable logic device (PLD). Deze PLD maakt de implementatie mogelijk van courante digitale circuits. De capaciteit van een FPGA is zodanig gegroeid dat tegenwoordig een volledig multi-processorsysteem in één enkele chip geplaatst kan worden.
Voor de implementatie van ontwerpen van digitale circuits die in de FPGA moeten komen, maakt men gebruik van een CAD-programma. Deze CAD-programma’s ondersteunen verschillende methodes om logische schakelingen toe te voegen. Aangezien deze digitale circuits steeds complexer worden zijn hardwarebeschrijvingstalen (HDL's) de enige praktische keuze om zulke systemen te definiëren. Een HDL is een hogere programmeertaal. Het lagere niveau wordt meestal door CAD voorzien. Hierdoor kan de ontwerper zich middels de HDL volledig toeleggen op het functionele van het ontwerp.

## Softcore

Een softcoreprocessor is onderdeel van de FPGA, deze is ontworpen om flexibel te zijn. Het is de bedoeling dat parameters op eender welk tijdstip kunnen worden gewijzigd bij het (her)implementeren in de hardware. Een softcoreprocessor bevat een microprocessor, die volledig softwarematig wordt beschreven. Hier maakt men meestal gebruik van HDL-bestanden.

## ASIC’s

ASIC's (application specific integrated circuit) worden gebruikt om systemen samen te stellen. Door gebruik te maken van softcoreprocessoren kunnen zulke systemen geïntegreerd worden in één enkele FPGA-chip. Op de commerciële markt zijn er twee softcoreprocessoren terug te vinden: de NIOS van Altera corp. en de Microblaze van Xilinx Inc.

## Technologie

FPGA's zijn zo opgebouwd dat ze elke digitale component kunnen bevatten. Om al deze programmeerbaarheid te ondersteunen bevatten FPGA-chips drie verschillende elementen:
* Logische blokken
* Programmeerbare interconnecties
* I/O-blokken

### Logische blokken

De logische blokken van de FPGA’s bestaan uit een lookup table (LUT) en een flipflop. Een LUT kan men zo programmeren dat hij elk soort logische functie kan bevatten.
Elk logisch blok kan maar kleine functies van enkele variabelen opslaan.
Een LUT kan gebruikt worden als:
* een willekeurige combinatorische schakeling met maximaal 4 ingangen
* 16 bit-geheugen
* 16 bit-schuifregister

### Programmeerbare interconnectie

Programmeerbare interconnectie dient om logische blokken te verbinden tot grotere circuits om aan de vereiste functionaliteit te voldoen, ook wel routing genoemd. Concreet is routing dus het verbinden van verschillende logische schakelingen. Routing is een zeer belangrijk aspect in FPGA-chips. Dit gedeelte heeft de meeste invloed op de chip, ook worden de meeste vertragingen veroorzaakt door het routen.

### I/O-blokken

I/O-blokken verbinden de interne logica met pinnen van de FPGA. De meeste pinnen kunnen geconfigureerd worden als ingang, uitgang of bidirectioneel.

## Basisprocestechnologietypes

* SRAM – gebaseerd op statische geheugentechnologie
* Antifuse – eenmalig programmeerbaar
* EPROM – Erasable programmable read-only memory-technologie
* EEPROM – Electrically erasable programmable read-only memory-technologie
* Flash
* Fuse – eenmalig programmeerbaar, bipolair

## Geschiedenis

In 1985 ontwikkelde Xilinx de eerste FPGA: de XC2064-chip met 1000 poorten. Toen wist men natuurlijk nog niet dat de hedendaagse FPGA's 10.000 maal groter zouden zijn. Verder zijn er vele uitbreidingen en nieuwere programma’s gekomen om FPGA's te programmeren. Vooral de grote toename van het computergebruik en internet hebben bijgedragen tot de groei van FPGA's.