La ZPU es una máquina de pila de microprocesadores diseñada por la empresa noruega Zylin AS para ejecutar código de supervisión en sistemas electrónicos que incluyen una matriz de puertas programables en campo (FPGA). [ 1 ]
Ha sido diseñado para requerir cantidades mínimas de lógica electrónica, liberando así más lógica electrónica para otros fines en la FPGA. Para facilitar su uso, cuenta con una versión de la Colección de Compiladores GNU . Esto simplifica considerablemente su aplicación en comparación con las CPU sin compiladores. Sacrificando velocidad a cambio de un tamaño reducido, almacena los resultados intermedios de los cálculos en memoria, en una pila de inserción, en lugar de en registros. [ 1 ]
Zylin Corp. hizo que la ZPU fuera de código abierto en 2008. [ 1 ]
Uso
Muchos proyectos electrónicos incluyen lógica electrónica en una FPGA. El uso de un microprocesador adicional resulta ineficiente, por lo que es común añadir una CPU a la lógica electrónica de la FPGA. A menudo, se podría utilizar una FPGA más pequeña y económica si la CPU consumiera menos recursos. Esta es precisamente la situación que la ZPU se diseñó para solucionar.
La ZPU está diseñada para gestionar las tareas secundarias de un sistema que se manejan mejor mediante software, como por ejemplo, una interfaz de usuario. La ZPU es muy lenta, pero su pequeño tamaño permite ubicar cualquier algoritmo de alta velocidad necesario en el FPGA.
Otro problema es que la mayoría de las CPU para FPGA son de código cerrado y solo están disponibles a través de un fabricante específico de FPGA. En ocasiones, un proyecto necesita un diseño que pueda distribuirse ampliamente, por ejemplo, para inspecciones de seguridad, fines educativos u otras razones. Las licencias de estas CPU propietarias pueden impedir estos usos. La ZPU es de código abierto.
Algunos proyectos necesitan código pequeño, pero que se ejecute en una CPU que, por naturaleza, maneja código más grande. Alternativamente, un proyecto puede beneficiarse de la amplia selección de código, compiladores y herramientas de depuración de la Colección de Compiladores GNU. En estos casos, se puede escribir un emulador para implementar el conjunto de instrucciones de la ZPU en la CPU de destino, y se pueden usar los compiladores de la ZPU para generar el código. El sistema resultante es lento, pero ocupa menos memoria que muchas CPU y permite que el proyecto utilice una gran variedad de compiladores y código. [ 2 ]
Características de diseño
La ZPU se diseñó explícitamente para minimizar la cantidad de lógica electrónica. Posee un conjunto mínimo de instrucciones, pero puede codificarse para la Colección de Compiladores GNU. Además, minimiza el número de registros necesarios en la FPGA, reduciendo así el número de biestables. En lugar de registros, los resultados intermedios se almacenan en la pila, en la memoria. [ 1 ]
También tiene un código pequeño, lo que ahorra memoria. Las instrucciones de máquina de pila no necesitan contener identificadores de registro, por lo que el código de la ZPU es más pequeño que el de otras CPU RISC, y se dice que solo necesita alrededor del 80 % del espacio de ARM Holdings Thumb2 . [ 1 ] Por ejemplo, el inmediato con signo ayuda a la ZPU a almacenar un valor de 32 bits en un máximo de 5 bytes de espacio de instrucciones, y tan solo uno. La mayoría de las CPU RISC requieren al menos ocho bytes.
Finalmente, aproximadamente dos tercios de sus instrucciones pueden emularse mediante firmware implementado con el tercio restante de las instrucciones "necesarias". Si bien el resultado es muy lento, la CPU resultante puede requerir tan solo 446 tablas de búsqueda (una medida de la complejidad de la FPGA, aproximadamente equivalente a 1700 puertas lógicas electrónicas).
La ZPU dispone de un vector de reinicio, compuesto por 32 bytes de espacio de código que comienza en la dirección cero. También cuenta con una única interrupción sensible al flanco, cuyo vector consta de 32 bytes de espacio de código que comienza en la dirección 32. Los vectores del 2 al 63 disponen cada uno de 32 bytes de espacio, pero están reservados para el código que emula las instrucciones del 33 al 63.
La ZPU básica tiene una ruta de datos de 32 bits. La ZPU también cuenta con una variante con una ruta de datos de 16 bits, para ahorrar aún más lógica.
Herramientas y recursos
La ZPU tiene una versión bien probada de la Colección de Compiladores GNU. [ 1 ] Entusiastas e ingenieros de firmware han portado ECos , [ 1 ] FreeRTOS [ 3 ] y μClinux . [ 4 ] Al menos un grupo de entusiastas ha copiado el popular entorno de desarrollo de Arduino y lo ha adaptado a la ZPU. [ 5 ]
Actualmente existen varios modelos del núcleo ZPU. Además de los núcleos Zylin originales, [ 1 ] también están los núcleos ZPUino, [ 5 ] y el núcleo ZPUFlex. [ 6 ] El núcleo Zylin está diseñado para un tamaño mínimo en la FPGA e incluye una versión de 16 bits. El ZPUino ofrece mejoras prácticas en velocidad, puede reemplazar las instrucciones emuladas con hardware y está integrado en un sistema en chip. El ZPUFlex está diseñado para usar bloques de memoria externa y puede reemplazar las instrucciones emuladas con hardware.
Los proyectos académicos incluyen estudios y mejoras de eficiencia energética, [ 7 ] y estudios de fiabilidad. [ 8 ]
Para mejorar la velocidad, la mayoría de los implementadores han implementado las instrucciones emuladas y añadido una caché de pila. [ 5 ] [ 6 ] [ 7 ] Además, un implementador dijo que una arquitectura de dos pilas permitiría el procesamiento en paralelo (es decir, mejorar la velocidad a una instrucción por ciclo de reloj), pero esto también podría requerir cambios en el compilador. [ 7 ]
Un implementador redujo el consumo de energía en un 46 % con una caché de pila y la inserción automatizada de control de reloj . [ 7 ] El consumo de energía fue entonces aproximadamente equivalente al del pequeño núcleo Amber de código abierto , que implementa la arquitectura ARM v2a.
Las partes de la ZPU que más se beneficiarían de la tolerancia a fallos son el bus de direcciones, el puntero de pila y el contador de programa . [ 8 ]
Conjunto de instrucciones
"TOS" es la abreviatura de "Top Of Stack" (parte superior de la pila). "NOS" es la abreviatura de "Next to the top Of Stack" (siguiente a la parte superior de la pila).
Los códigos de operación del 34 al 63 pueden emularse mediante código en los vectores del 2 al 32: LOADH y STOREH (acceso a memoria de 16 bits), LESSTHAN (comparaciones establecidas 1 para verdadero, 0 para falso), LESSTHANOREQUAL, ULESSTHAN, ULESSTHANOREQUAL, SWAP (TOS con NOS), MULT, LSHIFTRIGHT, ASHIFTLEFT, ASHIFTRIGHT, CALL, EQ, NEQ, NEG, SUB, XOR, LOADB y STOREB (acceso a memoria de 8 bits), DIV, MOD, EQBRANCH, NEQBRANCH, POPPCREL, CONFIG, PUSHPC, SYSCALL, PUSHSPADD, HALFMULT, CALLPCREL [ 5 ] [ 9 ]
Referencias
- ^ a b c d e f g h "ZPU - la CPU de 32 bits más pequeña del mundo con la cadena de herramientas GCC: Descripción general" . opencores.org, Zylin Corp. Recuperado el 7 de febrero de 2015 .
- ^ "ZOG - Un núcleo de procesador ZPU para Propeller con GNU C + Fortran" . Foro de Parallax . Parallax . Consultado el 6 de septiembre de 2019 .
- ^ Antonio, Antón. "ZPUino-HDL/zpu/sw/freertos/" . GitHub . Antonio Antón . Consultado el 7 de febrero de 2015 .
- ^ Lopes, Álvaro. "alvieboy/Linux" . GitHub . Álvaro Lopes . Consultado el 7 de febrero de 2015 .
- ^ a b c d Lopes, Álvaro. "ZPUino" . www.alvie.com . Archivado del original el 19 de febrero de 2014. Recuperado el 7 de febrero de 2015 .
- ^ a b AMR. "ZPU Flex" . Retro Ramblings . Consultado el 9 de febrero de 2015 .
- ^ a b c d Eriksen, Stein Ove. "Núcleo del microcontrolador de bajo consumo" . NTNU Abierto . Universidad Noruega de Teknisk-Naturvitenskapelige. Archivado desde el original el 9 de febrero de 2015 . Consultado el 9 de febrero de 2015 .
- ^ a b Zandrahimi, M. (2010). "Análisis de los efectos y la propagación de fallos en la ZPU: la CPU de 32 bits más pequeña del mundo". 2.º Simposio Asiático sobre Diseño Electrónico de Calidad (ASQED) . IEEE. págs. 308–313 . doi : 10.1109/ASQED.2010.5548320 . ISBN 978-1-4244-7809-5. S2CID 20045721 .
- ^ zylin. "zpu/zpu/docs/zpu_arch.html en master · zylin/zpu" . GitHub . Consultado el 10 de junio de 2026 .
- Microprocesadores abiertos
- microprocesadores blandos