El diseño para un FPGA requiere un lenguaje de descripción de hardware (HDL). Los HDL no son absolutamente nada como C. Mientras que un programa en C es una serie secuencial de instrucciones y debe contorsionarse para lograr la ejecución paralela, un HDL describe un circuito concurrente y debe contorsionarse para lograr la ejecución secuencial. Es un mundo muy diferente y si intentas construir un circuito en un FPGA mientras piensas como un desarrollador de software, te dolerá.
Una MCU es por tiempo limitado. Para lograr más trabajo, necesita más ciclos de procesador. Los relojes tienen límites muy reales para sus frecuencias, por lo que es fácil golpear una pared computacional. Sin embargo, un FPGA tiene espacio limitado. Para lograr más trabajo, simplemente agrega más circuitos. Si su FPGA no es lo suficientemente grande, puede comprar uno más grande. Es muy difícil construir un circuito que no pueda caber en el FPGA más grande, e incluso si lo hace, hay notas de la aplicación que describen cómo encadenar los FPGA juntos.
Los FPGA se centran mucho más en la ejecución paralela. En ocasiones, debe preocuparse por el tiempo que tarda el ISR de su MCU en atender la interrupción y si podrá alcanzar sus límites en tiempo real. Sin embargo, en FPGA hay muchas máquinas de estado finito (FSM) ejecutándose todo el tiempo. Son como "femto-controladores", como pequeñas nubes de lógica de control. Todos se ejecutan simultáneamente, por lo que no hay que preocuparse por perder una interrupción. Es posible que tenga un FSM para conectarse a un ADC, otro FSM para conectarse a la dirección / bus de datos de un microcontrolador, otro FSM para transmitir datos a un códec estéreo, otro FSM para almacenar el flujo de datos del ADC al códec ... Usted necesita usar un simulador para asegurarse de que todos los FSM canten en armonía.
Los FPGA son el sueño húmedo de un diseñador de diseño de PCB. Son extremadamente configurables. Puede tener muchas interfaces lógicas diferentes (LVTTL, LVCMOS, LVDS, etc.), de voltajes variables e incluso potencias de accionamiento (por lo que no necesita resistencias de terminación en serie). Los pasadores son intercambiables; ¿Alguna vez has visto un bus de direcciones MCU donde los pines estaban dispersos alrededor del chip? Su diseñador de PCB probablemente tenga que soltar un montón de vías solo para unir todas las señales correctamente. Con un FPGA, el diseñador de PCB puede ejecutar las señales en el chip en casi cualquier orden que sea conveniente, y luego el diseño puede anotarse en la cadena de herramientas FPGA.
Los FPGA también tienen muchos juguetes bonitos y elegantes. Uno de mis favoritos es el Digital Clock Manager en chips Xilinx. Se alimenta una señal de reloj, y puede derivar cuatro más usando una amplia variedad de multiplicadores y divisores de frecuencia, todos con un ciclo de trabajo prístino del 50% y 100% en fase ... e incluso puede dar cuenta de la inclinación del reloj que surge de retrasos de propagación externos al chip!
EDITAR (respuesta al apéndice):
Puede colocar un "núcleo blando" en un FPGA. Literalmente, está conectando un circuito de microcontrolador, o mejor dicho, probablemente está colocando el circuito de otra persona en su diseño, como PicoBlaze de Xilinx o MicroBlaze o Nios de Altera. Pero al igual que los compiladores C-> VHDL, estos núcleos tienden a ser un poco hinchados y lentos en comparación con el uso de un FSM y una ruta de datos, o un microcontrolador real. Las herramientas de desarrollo también pueden agregar una complejidad significativa al proceso de diseño, lo que puede ser algo malo cuando los FPGA ya son chips extremadamente complejos.
También hay algunos FPGA que tienen "núcleos duros" incrustados en ellos, como la serie Virtex4 de Xilinx que tiene un IBM PowerPC real y dedicado con un tejido FPGA a su alrededor.
EDIT2 (respuesta al comentario):
Creo que veo ahora ... estás preguntando acerca de cómo conectar un MCU discreto a un FPGA; es decir, dos chips separados. Hay buenas razones para hacer esto; Los FPGA que tienen núcleos duros y los que son lo suficientemente grandes como para soportar núcleos blandos decentes suelen ser monstruos con muchos cientos de pines que terminan requiriendo un paquete BGA, lo que aumenta fácilmente la dificultad de diseñar un PCB en un factor de 10.
Sin embargo, C es mucho más fácil, por lo que los MCU definitivamente tienen su lugar trabajando en conjunto con un FPGA. Como es más fácil escribir C, puede escribir los "cerebros" o el algoritmo central en la MCU, mientras que el FPGA puede implementar sub-algoritmos que pueden necesitar aceleración. Intente poner cosas que cambian en el código C, porque es más fácil de cambiar, y deje que el FPGA sea un tipo de letra más dedicado que no cambiará a menudo.
Las herramientas de diseño de MCU también son más fáciles de usar. Las herramientas de diseño tardan varios minutos en construir el archivo de bits FPGA, incluso para diseños algo simples, pero los programas complejos de MCU generalmente demoran unos segundos. Hay mucho, mucho menos que salir mal con el MCU, por lo que también son más fáciles de depurar ... No puedo entender cuán complejos pueden ser los FPGA. Realmente necesita obtener la hoja de datos de la que tiene, y debe intentar leer cada página. Lo sé, son unos cientos de páginas ... hazlo de todos modos.
La mejor manera de conectarlos es usar una MCU con una dirección externa y un bus de datos. Luego, simplemente puede mapear la memoria de los circuitos FPGA en la MCU y agregar sus propios "registros" que tienen su propia dirección. Ahora el FPGA puede agregar periféricos personalizados, como un temporizador de 32 bits que puede enganchar los 4 bytes a la vez cuando se lee el primer byte para evitar desbordamientos entre las lecturas de 8 bits. También puede usarlo como lógica de pegamento para asignar más periféricos de memoria de otros chips, como un ADC separado.
Finalmente, algunas MCU están diseñadas para usarse con un "maestro externo" como un FPGA. Cypress fabrica algunas MCU USB que tienen un 8051 en su interior, pero la intención es que los datos USB sean producidos / consumidos por, por ejemplo, un FPGA.