ZPU (microprocesador) - ZPU (microprocessor)

Para el cañón antiaéreo soviético / ruso, consulte ZPU .

La ZPU es una máquina apiladora 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).

La ZPU es una máquina apiladora relativamente reciente con un nicho económico pequeño y tiene un número creciente de usuarios e implementaciones. Ha sido diseñado para requerir cantidades muy pequeñas de lógica electrónica, haciendo más lógica electrónica disponible para otros propósitos en la FPGA. Para que sea más fácil de usar, tiene un puerto de la Colección de compiladores GNU . Esto hace que sea mucho más fácil de aplicar que las CPU sin compiladores. Sacrificando la velocidad a cambio de un tamaño pequeño, mantiene los resultados intermedios de los cálculos en la memoria, en una pila desplegable, en lugar de en registros.

Zylin Corp. hizo ZPU de código abierto en 2008.

Uso

Muchos proyectos electrónicos incluyen lógica electrónica en una FPGA. Es un desperdicio tener también un microprocesador, por lo que es común agregar una CPU a la lógica electrónica en la FPGA. A menudo, se podría usar una FPGA más pequeña y menos costosa si solo la CPU usara menos recursos. Esta es la situación exacta para la que se diseñó la ZPU.

La ZPU está diseñada para manejar las diversas tareas de un sistema que se manejan mejor con software, por ejemplo, una interfaz de usuario. La ZPU es muy lenta, pero su pequeño tamaño ayuda a colocar cualquier algoritmo de alta velocidad necesario en la FPGA.

Otro problema es que la mayoría de las CPU para FPGA son de código cerrado, disponibles solo de un fabricante particular de FPGA. Ocasionalmente, un proyecto debe tener un diseño que se pueda distribuir ampliamente, por inspecciones de seguridad, usos educativos u otras razones. Las licencias de estas CPU propietarias pueden evitar estos usos. La ZPU es de código abierto.

Algunos proyectos necesitan un código que debe ser pequeño, pero que se ejecute en una CPU que, de forma inherente, tenga un código más grande. Alternativamente, un proyecto puede beneficiarse de la amplia selección de código, compiladores y herramientas de depuración para 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 los compiladores de la ZPU se pueden utilizar para producir el código. El sistema resultante es lento, pero empaqueta el código en menos memoria que muchas CPU y permite que el proyecto utilice una amplia variedad de compiladores y código.

Caracteristicas de diseño

La ZPU fue diseñada explícitamente para minimizar la cantidad de lógica electrónica. Tiene un conjunto de instrucciones mínimo, pero se puede codificar para la colección de compiladores GNU. También minimiza la cantidad de registros que deben estar en la FPGA, minimizando la cantidad de flip-flops. En lugar de registros, los resultados intermedios se guardan en la pila, en la memoria.

También tiene un código pequeño, que guarda en la memoria. Las instrucciones de la máquina de pila no necesitan contener ID 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 . Por ejemplo, el inmediato firmado 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 en uno. La mayoría de las CPU RISC requieren al menos ocho bytes.

Finalmente, alrededor de 2/3 de sus instrucciones pueden ser emuladas por firmware implementado usando las otras 1/3 instrucciones "requeridas". Aunque el resultado es muy lento, la CPU resultante puede requerir tan solo 446 tablas de búsqueda (una medida de complejidad FPGA, aproximadamente equivalente a 1700 puertas lógicas electrónicas).

La ZPU tiene un vector de reinicio, que consta de 32 bytes de espacio de código que comienza en la ubicación cero. También tiene una única interrupción sensible al borde, con un vector que consta de 32 bytes de espacio de código que comienza en la dirección 32. Los vectores 2 a 63 tienen cada uno 32 bytes de espacio, pero están reservados para que el código emule las instrucciones 33 a 63.

La ZPU base tiene una ruta de datos de 32 bits. La ZPU también tiene una variante con una ruta de datos de 16 bits de ancho, para ahorrar aún más lógica.

Herramientas y recursos

La ZPU tiene un puerto bien probado de GNU Compiler Collection. Los entusiastas y los ingenieros de firmware han adaptado ECos , FreeRTOS y μClinux . Al menos un grupo de entusiastas ha copiado el popular entorno de desarrollo de Arduino y lo ha adaptado a la ZPU.

Ahora hay varios modelos del núcleo ZPU. Además de los núcleos Zylin originales, también están los núcleos ZPUino y el núcleo ZPUFlex. El núcleo Zylin está diseñado para una huella mínima de FPGA e incluye una versión de 16 bits. El ZPUino tiene mejoras prácticas para la velocidad, puede reemplazar las instrucciones emuladas con hardware y está integrado en un marco de sistema en chip. El ZPUFlex está diseñado para usar bloques de memoria externos y puede reemplazar instrucciones emuladas con hardware.

Los proyectos académicos incluyen estudios y mejoras de eficiencia energética y estudios de confiabilidad.

Para mejorar la velocidad, la mayoría de los implementadores han implementado las instrucciones emuladas y han agregado un caché de pila. Más allá de esto, un implementador dijo que una arquitectura de dos pilas permitiría la canalización (es decir, mejorar la velocidad a una instrucción por ciclo de reloj), pero esto también podría requerir cambios en el compilador.

Un implementador redujo el uso de energía en un 46% con un caché de pila y la inserción automatizada de compuertas de reloj. El uso de energía era aproximadamente equivalente al pequeño núcleo Amber de código abierto , que implementa la arquitectura ARM v2a.

Las partes de la ZPU que se beneficiarían más con la tolerancia a fallas son el bus de direcciones, el puntero de pila y el contador de programa.

Conjunto de instrucciones

"TOS" es una abreviatura de "Top Of Stack". "NOS" es una abreviatura de "Next to the top Of Stack".

Conjunto de instrucciones de ZPU requerido
Nombre Binario Descripción
BREAKPOINT 00000000 Detenga la CPU y / o salte al depurador.
IM_x 1xxxxxxx Empuje o agregue un mensaje inmediato firmado de 7 bits al TOS.
TIENDAP_x 010xxxxx Haga estallar el TOS y guárdelo en la pila en un desplazamiento desde la parte superior.
LOADSP_x 011xxxxx Obtenga de un valor indexado en la pila e introdúzcalo en el TOS.
EMULATE_x 001xxxxx Emule una instrucción con código en el vector x.
ADDSP_x 0001xxxx Obtenga de un valor indexado en la pila y agregue el valor a los TOS.
POPPC 00000100 Extraiga una dirección del TOS y guárdela en la PC.
CARGA 00001000 Pop una dirección y empuje el valor de la memoria cargada al TOS.
TIENDA 00001100 Almacene el NOS en la memoria a la que apunta el TOS. Pop ambos.
PUSHSP 00000010 Empuje el SP actual en el TOS.
POPSP 00001101 Pop el TOS y guárdelo en el SP.
AÑADIR 00000101 Adición entera de TOS y NOS.
Y 00000110 Y bit a bit de los TOS y NOS.
O 00000111 OR bit a bit de los TOS y NOS.
NO 00001001 Bitwise NO de los TOS.
DAR LA VUELTA 00001010 Invierta el orden de los bits del TOS.
NOP 00001011 No operacion. (Usualmente se usa para bucles de retardo o tablas de código).

Los puntos de código 33 a 63 pueden ser emulados por código en los vectores 2 a 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

Referencias