La progettazione per un FPGA richiede un Hardware Description Language (HDL). Gli HDL non sono assolutamente nulla come C. Mentre un programma C è una serie sequenziale di istruzioni e deve contorcersi per ottenere un'esecuzione parallela, un HDL descrive un circuito concorrente e deve contorcersi per ottenere l'esecuzione sequenziale. È un mondo molto diverso e se provi a costruire un circuito in un FPGA mentre pensi come uno sviluppatore di software, ti farà male.
Un MCU è limitato nel tempo. Per svolgere più lavoro, sono necessari più cicli del processore. Gli orologi hanno limiti molto reali alle loro frequenze, quindi è facile colpire un muro computazionale. Tuttavia, un FPGA ha uno spazio limitato. Per svolgere più lavoro, è sufficiente aggiungere più circuiti. Se il tuo FPGA non è abbastanza grande, puoi acquistarne uno più grande. È molto difficile costruire un circuito che non si adatta al più grande FPGA, e anche se lo fai ci sono note di app che descrivono come collegare in cascata gli FPGA.
Gli FPGA si concentrano maggiormente sull'esecuzione parallela. A volte devi preoccuparti di quanto tempo impiega l'ISR della tua MCU a servire l'interruzione e se sarai in grado di raggiungere i tuoi limiti in tempo reale. Tuttavia, in FPGA ci sono molte macchine a stati finiti (FSM) in esecuzione tutto il tempo. Sono come "femto-controllori", come piccole nuvole di logica di controllo. Funzionano tutti contemporaneamente, quindi non c'è motivo di preoccuparsi di perdere un interrupt. Potresti avere un FSM per l'interfaccia con un ADC, un altro FSM per l'interfaccia con l'indirizzo / bus dati di un microcontrollore, un altro FSM per lo streaming di dati a un codec stereo, un altro FSM per bufferizzare il flusso di dati dall'ADC al codec ... è necessario utilizzare un simulatore per assicurarsi che tutti gli FSM cantino in armonia.
Gli FPGA sono il sogno bagnato di un progettista di layout PCB. Sono estremamente configurabili. Puoi avere molte interfacce logiche diverse (LVTTL, LVCMOS, LVDS, ecc.), Con tensioni variabili e persino intensità di azionamento (quindi non hai bisogno di resistori di terminazione in serie). I pin sono sostituibili; hai mai visto un bus di indirizzo MCU in cui i pin erano sparsi attorno al chip? Il progettista di PCB probabilmente deve eliminare un sacco di vie solo per collegare correttamente tutti i segnali. Con un FPGA, il progettista di PCB può quindi eseguire i segnali nel chip praticamente in qualsiasi ordine sia conveniente, quindi il design può essere annotato indietro nella toolchain FPGA.
Gli FPGA hanno anche molti bei giocattoli di fantasia. Uno dei miei preferiti è il Digital Clock Manager nei chip Xilinx. Gli dai un segnale di clock e ne può ricavarne altri quattro usando una grande varietà di moltiplicatori e divisori di frequenza, tutti con un ciclo di funzionamento incontaminato del 50% e il 100% in fase ... e può anche tenere conto del disallineamento dell'orologio che deriva da ritardi di propagazione esterni al chip!
EDIT (risposta all'addendum):
È possibile posizionare un "soft core" in un FPGA. Stai letteralmente collegando un circuito di microcontrollore, o piuttosto stai probabilmente facendo cadere il circuito di qualcun altro nel tuo progetto, come PicoBlaze di Xilinx o MicroBlaze o Nios di Altera. Ma come i compilatori C-> VHDL, questi core tendono ad essere un po 'gonfi e lenti rispetto all'utilizzo di FSM e datapath o di un vero microcontrollore. Gli strumenti di sviluppo possono anche aggiungere una notevole complessità al processo di progettazione, il che può essere negativo quando gli FPGA sono già chip estremamente complessi.
Ci sono anche alcuni FPGA che hanno "hard core" incorporati, come la serie Virtex4 di Xilinx che ha un vero IBM PowerPC dedicato con tessuto FPGA attorno ad esso.
EDIT2 (risposta al commento):
Penso di vedere ora ... stai chiedendo di collegare un MCU discreto a un FPGA; cioè due chip separati. Ci sono buoni motivi per farlo; gli FPGA che hanno core duri e quelli abbastanza grandi da supportare decenti soft core sono generalmente mostri con molte centinaia di pin che finiscono per richiedere un pacchetto BGA, il che aumenta facilmente la difficoltà di progettare un PCB di un fattore 10.
C è molto più semplice, quindi le MCU hanno sicuramente il loro posto di lavoro in tandem con un FPGA. Dato che è più facile scrivere C, potresti scrivere i "cervelli" o l'algoritmo centrale nell'MCU, mentre l'FPGA può implementare sotto-algoritmi che potrebbero richiedere accelerazioni. Prova a mettere le cose che cambiano nel codice C, perché è più facile cambiare e lascia che l'FPGA sia roba di tipo più dedicata che non cambierà spesso.
Gli strumenti di progettazione MCU sono anche più facili da usare. Gli strumenti di progettazione impiegano diversi minuti per creare il file bit FPGA, anche per progetti un po 'semplici, ma i programmi MCU complessi richiedono in genere alcuni secondi. C'è molto, molto meno da sbagliare con l'MCU, quindi sono anche più facili da eseguire il debug ... Non riesco a capire quanto possano essere complessi gli FPGA. Hai davvero bisogno di ottenere il foglio dati per quello che hai e dovresti provare a leggere ogni pagina di esso. Lo so, sono poche centinaia di pagine ... fallo comunque.
Il modo migliore per collegarli è utilizzare una MCU con un indirizzo esterno e un bus dati. Quindi è possibile semplicemente mappare in memoria i circuiti FPGA nell'MCU e aggiungere i propri "registri" che hanno ciascuno il proprio indirizzo. Ora l'FPGA può aggiungere periferiche personalizzate, come un timer a 32 bit in grado di bloccare tutti e 4 i byte contemporaneamente quando viene letto il primo byte per evitare overflow tra le letture a 8 bit. Puoi anche usarlo come logica di colla per mappare più periferiche da altri chip, come un ADC separato.
Infine, alcune MCU sono progettate per l'uso con un "master esterno" come un FPGA. Cypress produce alcune MCU USB con 8051 all'interno, ma l'intento è che i dati USB vengano prodotti / consumati ad esempio da un FPGA.