Respostas:
Eles são componentes eletrônicos que adicionam lógica aos seus circuitos (portanto, são semelhantes aos microcontroladores). Mas a abordagem do projeto é completamente diferente da do uC (microcontrolador). Em um UC, você não pode alterar o design interno do UC; você só pode executar programas "clássicos" nele. Programar FPGAs é mais como criar um novo hardware. Você cria novas conexões entre portas lógicas e cria um novo processador especializado. E você pode fazer tudo em sua casa, na sua mesa e no seu PC.
Parece legal? Sim, mas existem algumas desvantagens. Por exemplo, preço (mas acho difícil comparar), maior consumo de energia e menores velocidades de clock (mas você pode projetar seu aplicativo de maneira inteligente e realizar mais operações em um ciclo de clock).
Links Úteis:
Exemplo de uso: http://nsa.unaligned.org/
Um FPGA é literalmente um conjunto de portas lógicas que podem ser programadas em campo. Flip-flops, multiplexadores, tabelas de pesquisa de 4 bits etc. que podem ser conectados da maneira que você desejar, usando uma linguagem semelhante a C (Verilog).
Um uC, como um AVR, também é feito de portas lógicas semelhantes, mas elas são configuradas quando o dispositivo é fabricado. Claro, ele tem RAM e Flash, para que você possa escrever um software para ler entradas e controlar saídas, mas não pode alterar as disposições reais dos portões. Os portões serão sempre organizados em uma ALU, um controlador de memória, uma porta serial, etc.
O benefício do uC é que você pode programá-lo em campo (na sua mesa), com uma linguagem de alto nível, fácil de usar e familiar, como C. O problema é que o software é "lento". Para que uma entrada controle uma saída, no caso mais simples, você pode escrever:
loop vazio () {buttonState = digitalRead (buttonPin); if (buttonState == HIGH) {
digitalWrite (ledPin, HIGH);
} else {digitalWrite (ledPin, LOW); }}
Isso seria transformado em uma dúzia de instruções de montagem, para que o loop levasse um microssegundo para controlar essa saída de uma entrada. E é preciso todo o chip uC para fazer isso tão rápido. Claro, você pode fazer muito mais, mas sua capacidade de controlar essa saída diminuirá à medida que o uC ficar ocupado fazendo outras coisas.
Em um FPGA, eu poderia configurar os portões para que uma entrada controle uma saída em 1 relógio. Portanto, a saída seguiria a entrada com um atraso de talvez 25 nanossegundos. É 40X mais rápido, usando o mesmo período de relógio. E o restante dos portões do FPGA estão disponíveis para fazer muitas outras coisas, o que não afetará a velocidade dessa pequena função.
O código para o FPGA seria um simples flip-flop:
sempre @ (relógio posedge) ledPin <= buttonPin;
Isso levaria apenas 1 célula FPGA, cerca de 40 portas, de dezenas de milhares em um FPGA.
Posso reprogramar meu FPGA para fazer outra coisa, por exemplo, controlar o led com base em uma combinação de quatro entradas, ainda em um relógio, ainda usando essa célula de 1 FPGA. Ou controle o led com base em um fluxo serial da entrada, em algumas células FPGA, que seriam centenas de portas. Para que eu pudesse controlar o LED com base em dados seriais, digamos "ON" ou "OFF", com o fluxo serial em uma taxa muito alta (facilmente 20MHz), e ainda usar apenas uma pequena fração da capacidade do FPGA.
Portanto, a vantagem de um FPGA é claramente a velocidade. Ele pode fazer qualquer coisa que um uC possa fazer e muito mais rápido, com tudo feito em paralelo. Coisas complexas que um uC levaria em milissegundos, um FPGA poderia fazer em microssegundos ou menos. Enquanto houver portas sobrando no FPGA, eu posso adicionar mais funções a ele sem afetar a velocidade ou a operação das funções anteriores no FPGA. A propósito, um FPGA pode facilmente executar uma taxa de clock de 20MHz.
Custo não é um diferencial. Posso comprar um FPGA que pode implementar quase qualquer design do Arduino que já vi por cerca de US $ 5, aproximadamente o mesmo que um chip Arduino AVR. Também existem cadeias de ferramentas gratuitas (IDE, compilador, depurador) para FPGAs.
O poder não é um diferenciador. Como eu posso rodar o FPGA a uma velocidade de clock muito mais baixa para obter a mesma função que um uC e usar uma pequena parte de seus portões (portões não utilizados usam apenas energia de vazamento), um FPGA pode superar o poder de quase todos os dispositivos baseados em uC desenhar.
A maior desvantagem de um FPGA é que é muito mais complexo e demorado definir, escrever o código e depurar um design FPGA não trivial do que um programa uC. Um projeto típico de uC que você pode realizar à noite pode levar dias em um FPGA.
Outros problemas potencialmente corrigíveis são que a maioria das pessoas é treinada em programação de software, mas poucas entendem a programação de hardware. Você pode aprender Verilog com bastante facilidade. Mas você também precisaria pensar em termos de design de hardware em vez de design de software. Os padrões de design são muito diferentes.
Outra questão é que os FPGAs não vêm em pequenos pacotes DIP de 8 a 20 pinos. Eles tendem a vir em pacotes de montagem em superfície de 100 pinos ou maiores, portanto, construir as placas é mais difícil.
E um problema final é que muitos projetos interessantes podem ser implementados com perfeição naqueles de fácil utilização, por que se preocupar com um FPGA?
Se você conhece os portões lógicos básicos, deve saber que eles são praticamente instantâneos. A operação A e B OR C muda instantaneamente quando A, B ou C mudam.
Um FPGA é (mais ou menos) uma matriz de portas lógicas programáveis. Você pode definir as entradas e saídas (como uma combinação das entradas).
Em um uC, A + B / C * sqrt (D) levaria vários ciclos de clock e um pouco de memória. Em um FPGA, o resultado é quase imediato.
Eles são ótimos para vídeo, DSP, criptografia ...
Essa é a principal vantagem. FPGAs modernos são adequados agora com memória e existem híbridos uC / FPGA.
Eles são usados para quebrar chaves de criptografia muito mais rapidamente do que um computador de uso geral poderia. : D
Para economizar dinheiro e risco versus um ASIC. A não ser que tu
os custos fixos (NRE) de fazer um ASIC tornam o custo proibitivo.
Como você pode alterar um FPGA facilmente, você pode simular menos o design e entrar no laboratório mais rapidamente. Além disso, você pode fazer um design parcial e construir sobre ele, como no software.