Archivos del mes: 28 abril 2016

Sistemas retro en FPGA ¿Por qué?

Con todo el entusiasmo generado por el ZX Uno, un proyecto español originado en el foro Zona de pruebas, que recrea un ZX Spectrum (entre otros) en una pequeña placa con una FPGA, muchos se están preguntando… ¿qué es una FPGA? ¿Por qué es mejor que emular?

Hay un vídeo en youtube que trata de explicar esto en relación a otro gran proyecto abierto de recreación en FPGA, el Mist. Sin embargo, creo que la explicación no satisfará a muchos con ansias de entender mejor la ventaja. Así que me he animado a escribir esta entrada.

Supongo que sabes que un ordenador, clásico o no, se compone de básicamente de estos elementos:

  1. Procesador (CPU)
  2. Memoria
  3. Sistema de E/S (Entrada/Salida), incluye teclado, vídeo, sonido, cinta, disco…

En la imagen tenemos la placa del ZX Spectrum con estos componentes marcados. Hay memoria que contiene el sistema (el BASIC en un ordenador de 8 bits). A esta memoria la llamamos ROM, porque no puede borrarse. Hay otra memoria que se usa para guardar los datos con los que el procesador trabaja, que llamamos RAM. Por supuesto está la CPU y un chip bastante grande marcado como FERRANTI ULA que contiene los sistemas de entrada y salida. A su lado hay dos piezas metálicas que contienen cuarzo y se usan para generar el reloj del sistema. El número 4.4336 que puede leerse es la frecuencia en MHz para la que está diseñado ese cristal, usado en el circuito de vídeo.

ZXspectrum_mb2

Un emulador es un programa que recrea la función de todos estos elementos: uno a uno y dentro de las restricciones temporales, de sonido e imagen que plantea el sistema sobre el que corre el emulador. Sin embargo, en el equipo real estos chips funcionan todos a la vez. Es más, en su interior hay miles de componentes que también funcionan a la vez. El emulador trata de recrear lo que el programa original está haciendo. Si el programa original decía: coge dos números de memoria y súmalos. El emulador hará eso. Pero… la placa original no hacía exactamente eso.

Bueno, sumaba los dos números pero pasaban más cosas. Esos números eran transportados hasta el interior de la CPU. Almacenados en una memoria especial llamado “registro” del procesador y pasados a través de otra etapa dentro del procesador encargada de hacer sumas. Cada uno de estos elementos estaba fabricado con transistores y cada uno de estos transistores tenía su propia actividad que ocurría al ritmo marcado por el reloj: 3,5MHz en un Spectrum. Y mientras tanto el chip de vídeo seguía con su actividad, y el altavoz seguía funcionando y la cinta moviéndose… Todo ocurría a la vez (en paralelo).

En el emulador, todo ocurre en serie: paso a paso. El emulador simula qué hace la CPU durante un tiempo. Se para y mira qué hace el chip de vídeo. Se para y atiende al sonido. Vuelve la mirada hacia el teclado… Así que las cosas no pasan a la vez y normalmente esto no se nota. Los ratitos que el emulador dedica a cada tarea son lo suficientemente cortos como para que no se note… Casi nunca. Cuando un programa necesita, por diseño o por casualidad, una relación de tiempo más precisa entre los componentes pasamos a necesitar equipos mucho más rápidos para poder emular el sistema. Podéis leer aquí el caso de cómo emular una SNES puede llevarse por delante un procesador de 3GHz. Y aun así, será inexacto.

¿Qué es una FPGA?

Una FPGA es un chip en cuyo interior hay muchos componentes electrónicos cuyas conexiones son libres. Estos componentes son desde muy pequeñitos como flip flops (memorias de un solo bit) hasta memorias más grandes o incluso CPUs modernas (modernas sí, pero pequeñas). La mayoría de los componentes de la FPGA son bloques elementales de la electrónica digital. Son piezas muy pequeñas (puertas AND, OR, flip flops, sumadores, algún divisor) que el diseñador electrónico necesita unir para crear circuitos.

Dentro de los chips del ordenador de la imagen también se encuentran estas mismas piezas. La diferencia clave está en que en los chips del ordenador original esas piezas están conectadas con un metal que no se puede cambiar una vez fabricado. Mientras que en la FPGA la conexión es variable. Y aquí viene lo fascinante. Con la FPGA adecuada, es posible reconstruir el circuito electrónico original y por lo tanto tener el mismo sistema, solo que en un solo chip. Así que una FPGA no imita lo que hacía el sistema original. Una FPGA es como el sistema original. Por supuesto, en la recreación del circuito se pueden cometer errores o puede faltar información y ahí surgirán pequeñas diferencias. Pero el potencial de llegar a ser exactamente igual al original con precisión superior al microsegundo está ahí.

¿Cómo se programa una FPGA?

El término programar es confuso. Programar una FPGA realmente se refiere a transferir la información de las conexiones desde el ordenador, donde se ha desarrollado el sistema, hasta el chip de la FPGA. Una vez programada, la FPGA contiene las conexiones que el ingeniero quiere.

¿Cómo decide el ingeniero esas conexiones? Dado que para cada modelo de FPGA hay unos bloques elementales en su interior, el ingeniero puede decidir directamente qué bloque usar y a qué bloque conectarlo. Como quien une los puntos de un dibujo. Sin embargo, este enfoque no es el más práctico. El ingeniero prefiere escribir un código parecido al de un programa de ordenador. Este código describe lo que el circuito tiene que hacer. Aunque parezca un programa, no es realmente un programa porque no existe un procesador que lo ejecute. En vez de eso, el ordenador con el que trabaja el ingeniero transformará ese código (ese fichero de texto) en unas conexiones en la FPGA tales que la FPGA se convierta en un circuito que haga la función que el ingeniero había descrito. Esto, que suena como si el proceso de transformación requiriese mucho ingenio por parte del ordenador, en realidad no lo es tanto. Lo más complicado del proceso no es pasar de la descripción a los bloques electrónicos sino conectarlos de forma que la señal se transmita adecuadamente entre ellos.

Así que, si un ingeniero escribe una descripción de un procesador, por ejemplo un Z80, este procesador podrá realizarse en los circuitos de muchos modelos distintos de FPGA y con el mismo código, también en un chip de verdad. Todos los procesadores y sistemas electrónicos digitales modernos están diseñados utilizando estos lenguajes de descripción (Verilog, principalmente) y el que acaben en un chip dedicado, con conexiones fijas, o en una FPGA, con conexiones variables; depende del tamaño de mercado para el que se fabrican y de su velocidad, fundamentalmente.

Resumiendo: en una FPGA se reconstruye el circuito original y, a efectos electrónicos, nos encontramos ante el mismo sistema que el original. Hasta los detalles más insignificantes y las particularidades más meticulosas de un sistema se pueden recrear en la FPGA y a menudo ocurrirán como consecuencia natural del circuito que se monta en ella. Sin embargo en un emulador el programador necesita elegir qué aspectos de la máquina original va a imitar y de qué manera. Los aspectos que no se noten en la emulación no se replican en un emulador. Sin embargo en la FPGA, por ser el circuito electrónico, es necesario incluir prácticamente todos los elementos que ocurrían en el original.

¿Ventajas de una FPGA frente a un emulador?

A estas alturas debería resultar obvio: la FPGA es, básicamente, el sistema original. Así que comparar el emulador con la FPGA es muy similar a compararlo con el original. Eso sí, la FPGA habitualmente puede hacer cosas que el sistema original no puede:

  • Acceso a más RAM
  • Lectura de discos desde una tarjeta SD
  • Incrementar la velocidad de la CPU o de la memoria
  • Otros trucos dado el acceso directo al hardware del que dispone

Y puede hacer algo que los emuladores tienen casi por imposible: conectarse a hardware real de la época, como el caso de los puertos MIDI del Mist o los puertos de cartucho del One Chip MSX.

Y hasta aquí este repaso sobre FPGAs y emulación.