Un procesador softcore es una CPU implementada con los recursos programables de una FPGA en lugar de utilizar un núcleo de silicio dedicado.
Hemos pensado como diseñadores de hardware: conectando cables, creando contadores y máquinas de estados. Todo muy bonito. Pero no siempre va a ser así… a veces el hardware puro es un dolor de cabeza.
Imagina que quieres implementar una pila TCP/IP para conectarte a internet, o leer un archivo JSON de una tarjeta SD. Hacer eso con máquinas de estados en Verilog es una tarea titánica y propensa a errores. Esas tareas son triviales para un procesador ejecutando C o C++.
¿Y si pudiéramos tener lo mejor de los dos mundos? ¿Y si pudiéramos crear nuestro propio procesador dentro de la FPGA?
Bienvenidos al mundo de los Softcores.
¿Qué es un softcore?
Un Softcore (o Procesador Soft) es una CPU que no existe físicamente como silicio dedicado.
Es un procesador descrito mediante un HDL como Verilog o VHDL. Es un módulo más, igual que nuestros contadores o controladores VGA, aunque mucho más complejo. Al sintetizarlo, la herramienta utiliza LUT, flip-flops y memoria BRAM para implementar un microprocesador funcional.
Diferencia frente a un núcleo hard
- Hardcore: Es un chip físico (como el ATmega328 de Arduino o los núcleos ARM dentro de una Zynq/Raspberry Pi). Sus transistores están fijos de fábrica. Es muy rápido y eficiente en energía, pero no puedes cambiarlo.
- Softcore: Es “lógica programada”. Es más lento que un chip de silicio dedicado (generalmente corren entre 50 MHz y 200 MHz), pero es totalmente flexible.
Si mañana necesitas que tu procesador tenga 3 puertos UART, 5 SPI y un módulo de criptografía por hardware, con un Softcore simplemente reconfiguras el diseño y lo tienes. En un microcontrolador, tendrías que cambiar el chip y rediseñar la PCB.
¿Por qué usar un softcore en una FPGA?
Podrías pensar: “Si la gracia de la FPGA es el paralelismo, ¿para qué quiero meter una CPU secuencial y lenta dentro?”.
La respuesta es la Arquitectura Híbrida.
En un diseño complejo, solemos dividir las tareas:
- Hardware (FPGA pura): Tareas críticas, repetitivas y de alta velocidad. (Ej: Procesado de vídeo, filtrado de señales, control de motores PWM, encriptado).
- Software (Softcore): Tareas de gestión, lógica de negocio compleja y comunicación. (Ej: Menús de usuario, gestión de archivos, comunicación red, toma de decisiones lenta).
El Softcore actúa como el “Director General”, enviando órdenes a los módulos de hardware acelerados que hacen el trabajo pesado.
Softcores integrados por los fabricantes
Los fabricantes ofrecen núcleos y periféricos muy integrados con sus herramientas. Esa integración simplifica la creación del SoC, aunque la IP de hardware y el flujo suelen quedar vinculados a una familia concreta.
MicroBlaze y MicroBlaze V (AMD)
El MicroBlaze clásico utiliza la ISA propia de AMD. MicroBlaze V, en cambio, es la generación actual basada en RISC-V y admite configuraciones RV32 y RV64 con extensiones opcionales. Se integra con Vivado y Vitis y puede utilizarse sin coste adicional en los dispositivos AMD compatibles, pero la IP sigue orientada a ese ecosistema.
Nios V (Altera)
Nios II fue durante años la opción del ecosistema Intel/Altera, pero se encuentra en fase de soporte heredado. Para diseños nuevos, el fabricante recomienda Nios V, también basado en RISC-V.
Este cambio es importante: RISC-V mejora la portabilidad del software, aunque mover un SoC completo todavía exige adaptar el mapa de memoria, los periféricos y la integración de hardware.
La ISA abierta RISC-V
Hace unos años, investigadores de la Universidad de Berkeley crearon algo que cambió la industria para siempre: RISC-V (pronunciado “Risk-Five”).
RISC-V no es un procesador, es una ISA (Instruction Set Architecture) abierta y libre. Es como un manual que dice: “Si encuentras el código binario 0000001, debes sumar dos números”.
Cualquiera es libre de diseñar un procesador que entienda estas instrucciones, sin pagar royalties a nadie (a diferencia de ARM o x86).
Por qué RISC-V encaja bien en una FPGA
- Portabilidad del software: El mismo código fuente puede compilarse para distintos núcleos. Un binario solo será compatible si coinciden la ISA, las extensiones, el ABI y el entorno de ejecución.
- Comunidad: Hay docenas de núcleos Open Source listos para usar (PicoRV32, VexRiscv, NEORV32, Ibex…).
- Herramientas Libres: Usamos GCC y GDB estándar. No dependemos de IDEs propietarios pesados.
Componentes de un SoC con softcore
Para que el procesador sea útil, no basta con la CPU. Necesitamos crear un pequeño ordenador dentro de la FPGA. Esto se llama SoC (System on Chip).
Suele constar de:
- Core (Núcleo): La CPU que ejecuta instrucciones.
- Bus de Sistema: La “autopista” de datos. Conecta la CPU con los periféricos.
- En el mundo libre se usa mucho Wishbone o AXI.
- Memoria:
- ROM/BRAM: Para guardar el programa (Bootloader).
- RAM: Para datos y variables.
- Periféricos:
- Timer: Para contar tiempo.
- UART: Para
printfy debug. - GPIO: Para encender LEDs y leer botones.
Lo genial es que estos periféricos son Mapped IO. Para la CPU, encender un LED es simplemente escribir un valor en una dirección de memoria reservada (por ejemplo, 0x80000000). El bus se encarga de llevar ese dato al módulo Verilog del LED.