Ene 27

Hello World. Hello FPGA – Parte II: Placas y fases de diseño

Continuamos con el tutorial sobre FPGAs (ver parte I). En esta entrada vamos a dar los primeros pasos para implementar un circuito (extremadamente) sencillo en una placa basada en FPGA. Creo que con esto se entenderá que el desarrollo con FPGAs difiere notablemente del desarrollo software.

Diseño con FPGA

Ya vimos que la FPGA está formada por una miríada de pequeñas memorias que se pueden interconectar. El diseño a mano es inviable, por lo que es necesario utilizar herramientas software que nos ayuden a desarrollar los circuitos.  El diseñador (que no programador) se encarga de definir los bloques que forman el sistema. Para ello, debe definir las funciones lógicas que el sistema requiere y su interconexión. No hay que confundir las funciones lógicas con las LUTs, ni la interconexión entre funciones con la interconexión entre LUTs. Son precisamente las herramientas de desarrollo con FPGAs las que se encargan de particionar las funciones lógicas en LUTs y hacer que el cableado entre LUTs sea coherente con las interconexiones originales entre funciones. Y por supuesto, las herramientas optimizan el sistema conforme lo va implementando en la FPGA, tal como haría un compilador con código que tiene que transformar en ensamblador para una arquitectura de CPU determinada.

Es momento de introducir la placa como parte del flujo de desarrollo o de diseño. La placa alberga a la FPGA además de a otros chips y componentes circuitales. La placa podemos diseñarla nosotros mismos, o comprarla ya diseñada y fabricada. Para empezar en este mundillo esta es la mejor opción, aunque tengo que decir que hacer un diseño propio permite dotar a la placa de los elementos que realmente nos interesan y así abaratar su coste, reducir su tamaño, etc.

Hay placas comerciales bastante majas orientadas a distintos ámbitos.

Nos vamos a centrar en la placa DE2-115 de Terasic  DE2-115, que se basa en una FPGA Cyclone IV de la empresa Altera (Intel FPGA). La figura muestra la placa:

 

Figura. Placa DE2-115 de Terasic (imagen extraida de la web de Terasis [enlace])

[solicitado concendido permiso para su uso]

En la placa se observa claramente la FPGA (justo encima del texto Cyclone IV) y se ve que muchos otros elementos: pantalla LCD, displays de 7 segmentos (me encantan), chips variados, botones, conmutadores, conexión GPIO (General-Purpose Input/Output). Algunos de los chips que acompañan a la FPGA en este caso son: memoria SRAM, memoria DRAM, memoria EPROM, CODEC de vídeo, CODEC de audio, controladores de USB, controladores de UART, generador de salida VGA, etc. Otras placas tendrán diferentes chips, los cuales determinan sus prestaciones. Por ejemplo, pueden tener salida HDMI, puertos micro-USB, buses de expansión de memoria, etc.

La placa dispone de un puerto JTAG (Joint Test Action Group) que permite acceder directamente a la FPGA para configurarla (o programarla) o acceder a una memoria EPROM que es la que utiliza la FPGA para auto-configurase tras el arranque. En general no es posible acceder directamente a los chips que acompañan al dispositivo reconfigurable. Sin embargo, éstos están conectados a la FPGA, por lo que su configuración la debe hacer este dispositivo.

El ejemplo que abordamos consiste en utilizar dos pulsadores, o botones, de la placa para encender un LED (Light Emitting Diode). Puesto que hablamos en la parte I de una simple puerta AND, vamos a hacer que el LED se encienda únicamente cuando se pulsen simultáneamente los dos pulsadores.

Los pulsadores están conectados mediante conductores a pines o patillas concretos de la FPGA, por lo que es posible “leer” su valor lógico (si está pulsado o no) y utilizar dicho valor como parte del circuito que implementemos en la FPGA. De igual manera los LEDs están conectados a pines concretos del chip. Estas conexiones son fijas, puesto que los conductores son pistas metálicas de la placa PCB (Printed Circuit Board) (si nos fijamos de nuevo en el texto “Cyclone IV” podremos ver unas líneas de color azul más claro que el resto de la placa, estas líneas son pistas metálicas; hay más pistas en la otra cara de la placa, e incluso en su interior). Estos pines son los pines de entrada/salida de la FPGA, los cuales pueden conectarse a las LUTs igual que cualquier señal interna.

Por una parte, tenemos que ser capaces de indicar a las herramientas, que vamos a utilizar en nuestro circuito señales que provienen del exterior, y esto lo hacemos indicando a la herramienta que la señal a (por ponerle un nombre cualquiera) está conectada al pin número X. ¿Y cómo sabemos esto? Leyendo el manual de la placa. Si leemos el manual de la FPGA (llamada datasheet en inglés) podremos saber cuántos pines tiene el chip y sus características (niveles lógicos, si son de entrada o salida, si son entradas de reloj, la corriente que pueden proporcionar, etc.), pero, aunque todo esto es muy importante, no basta. En el manual de la placa vamos a encontrar la información acerca del uso que se le da a cada pin, es decir, qué elementos de la placa están conectados a éstos.

En el manual de la placa DE2-115 encontramos tablas donde se indica los pines que se están usando. Por ejemplo, para los cuatro pulsadores que aparecen en la esquina inferior derecha de la Figura la tabla es la siguiente:

Figura: Tabla 4-2 del manual, donde se indican los pines a los que están conectados los botones

[solicitado concendido permiso para su uso]

Hay tablas similares para los LEDs y para el resto de elementos de la placa.

Concretemos un poco más. Vamos a realizar una operación AND con el valor de dos botones y el resultado lo vamos a conectar a un LED. Las señales de entrada de la AND se llamarán KEY0 y KEY1 y la señal de salida de la AND se llamará LED0. Bien, ahora hay que decidir que botones usaremos. Por ejemplo, KEY0 se conectará al pin del botón KEY[0] (M23) y KEY1 al pin del botón KEY[1] (M21). LED0 se conectará al pin que está conectado a uno de los ocho LEDs de color verde de la placa, por ejemplo, a LED0.

Esto parece que Perogrullo, lo admito, pero tiene su importancia, y equivocarnos o confundirnos a la hora de elegir los pines puede darnos quebraderos de cabeza.

Bien, sigamos. Ya está, lo conectamos todo y hacemos una operación AND. Pues no, todavía nos falta un pequeño paso. Se tiende a asumir que el 0 lógico se corresponde con los conceptos de FALSO y OFF, y que el 1 se corresponde con VERDADERO y ON. Pero esto es totalmente arbitrario. Para saber si un botón devuelve al pulsarlo un 0 (un voltaje bajo) o un 1 (voltaje bajo) hay que saber cómo es su circuito. Para no andarme por las ramas, vemos en el manual de la placa que los pulsadores proporcionar un 1 si no se pulsa, el cual es su estado natural, y un 0 si se pulsan. Podéis ver el circuito para entender esta situación.

FIGURA. Esquemática de la conexión de los botones  (figura 4-6 del manual)

[solicitado concendido permiso para su uso]

Igual ocurre con el LED. Para saber si se enciende con un 1 o con un 0 hay que consultar el manual de la placa. En este caso se enciende con un 1 lógico (consultar el manual).

 

Dicho esto, en la misma placa hay LEDs, como por ejemplo los de los display de 7 segmentos, que se encienden con ceros. Y en otras placas lo pulsadores pueden perfectamente generar un 1 al pulsarse. Moraleja: hay que consultar el manual de la placa.

 

Gráficamente vemos lo que tenemos que implementar:

Figura. Esquema del diseño del ejemplo.

¿Cómo conseguirlo? Hablemos de las herramientas.

 

Fases de diseño con FPGAs

  1. Entrada de diseño

En esta fase se describe el circuito. El circuito puede describirse gráficamente utilizando puertas lógicas o bloques elementales, como multiplexores, decodificadores, contadores, etc., pero si el circuito es complejo se suelen utilizar lenguajes de descripción hardware o HDLs (del inglés, Hardware Description Languages). No confundir con lenguajes de programación: la FPGA se configura, no se programa. De forma muy simple os digo que mientras que en un lenguaje de programación el orden o secuencia de las instrucción influye en su comportamiento, todo lo que se escribe en HDL genera funciones lógicas y además todas las funciones existen y se “ejecutan” a la vez, por lo que el orden de las instrucciones que usemos en HDL no es relevante (esto es una simplificación muy grande, pero nos vale de momento). Destaco como HDLs los lenguajes VHDL y Verilog. En la actualidad hay formas de diseñar con FPGAs más cercanas a los lenguajes de programación, pero voy a evitar hablar de ellas en este momento.

  1. Simulación funcional

Una vez descrito el circuito en HDL es necesario comprobar si el circuito está bien diseñado. La simulación funcional nos permite introducir los valores de las entradas a lo largo del tiempo y ver el resultado que éstos producen en las salidas (o en cualquier señal intermedia) del circuito. Esta simulación supone que las operaciones lógicas se realizan de forma instantánea. Se trabaje con señales binarias, que también pueden agruparse en buses y ver la información como un número binario o en cualquier otra base.

  1. Síntesis (o compilación)

Consiste en convertir las funciones lógicas descritas mediante un HDL en un conjunto de elementos lógicos interconectados que se denomina netlist. Los elementos lógicos serán puertas lógicas en el caso de que la tecnología destina sean ASICs o LUTs si son FPGAs. Como ya comenté antes, la síntesis incluye la optimización de las funciones lógicas. Por ejemplo, si hacemos la operación NOT(NOT A), en lugar de usar dos puertas lógicas encadenadas, no usará ninguna, puesto que NOT(NOT A) = A.

  1. Asignación de pines

En este paso se indica a qué pines están conectadas las señales de entrada y salida del circuito que va dentro de la FPGA. Si no se especifican los pines la herramienta de diseño asignará pines aleatorios. Esta información puede introducirse a través de un fichero de texto o bien mediante una interfaz gráfica. También se aportará información acerca del estándar lógico que se esté usando (es decir, el voltaje asignados a los ceros y los unos: TTL, LVTTL, CMOS, LVCMOS, etc.), si son pines de alta velocidad, etc.

  1. Posicionamiento y rutado

El posicionamiento (placement en inglés) se encarga de elegir exactamente el elemento de la FPGA que se va a utilizar para implementar una LUT. El rutado (routing en inglés) se encarga de conectar los pines y las señales intermedias a las LUTs. Al proceso se le suele englobar en lo que se denomina place and route (que lo veremos como P&R o como PAR).

En las FPGAs las LUTs están agrupadas para disponer de conexiones rápidas entre ellas. Si dos LUTs están en grupos distintos, pero cercano se usará una ruta un poco más lenta y si los grupos están muy separados se usará una ruta de larga distancia, que evidentemente presentará un retardo mayor. Según el fabricante estos grupos reciben nombres distintos (Configurable Logic Block (CLB), Logic Array Block (LAB), etc.) y además el número de LUTs y la topología de interconexión varía. Con esto vemos que el proceso de placement es algo   más complicado de lo que parece a simple vista. Tradicionalmente existía una etapa anterior al placemente que se encargaba de agrupar primero las LUTs de manera que el posicionamiento se aplicaba a los grupos y no a las LUTs individuales. Algunos fabricantes lo llaman mapping y para crear un poco de confusión en algunos casos el mapping también hace placement, y el proceso de P&R sólo hace se encarga del rutado.

  1. Análisis temporal y simulación temporal

Una vez se sabe como quedará cada elemento en la FPGA y cómo estará interconectado las herramientas comprueban que las señales se propagan cumpliendo con la velocidad del reloj del sistema. Si una señal es demasiado lenta, el análisis temporal lo detecta y lo indica al diseñador. Este análisis proporciona los datos necesarios para poder llevar a cabo una simulación que incluya los tiempos que tarda cada señal en recorrer las pistas metálicos (las rutas que llamé antes) y que nos permita comprobar de forma mucho más fiel a la simulación funcional del punto 2 si el circuito está funcionando correctamente.

  1. Configuración del dispositivo

La configuración consiste en enviar los datos contenidos en un fichero llamado bitstream que contiene los valores de configuración de todos los elementos de la FPGA: los valores de cada LUT, el estado de cada conmutador que realiza la interconexión entre LUTs, la configuración de los puertos de entrada y salida, etc. Este bitstream se envía envía mediante un puerto serie directamente a la FPGA, o se envía a una EPROM que queda programada. La FPGA tras el reinicio de la placa estará virgen, puesto que la configuración se almacena en memoria no volátil (SRAM) y tras el apagado del chip se borra; la configuración la lee de la EPROM antes mencionada.

 

Implementación

Aunque sea de mala educación, os voy a dejar con la miel en los labios y vamos a terminar el ejemplo en la siguiente entrada. Que soñéis con circuitos reconfigurables.

 

Enlaces de interés

  • Información sobre la placa DE2-115 [consultado 25/01/2019]
  • DE2-115 User manual (manual de usuario de la placa DE2-115), Terasic Inc. [consultado 25/01/2019]

 

Agradecimientos

Gracias a Terasic Inc. por concederme los permisos para utilizar las fotografías de su web así como las figuras y tablas de la documentación de sus placas.

Dic 22

Hello World. Hello FPGA – Parte I: Toma de contacto con FPGAs

Las FPGAs aparecieron a mediados de los 80 [Trimberger2015] y desde entonces desarrollan un papel relevante en la industria de los semiconductores, junto con microprocesadores, procesadores gráficos y circuitos específicos ASIC. Yo las descubrí en 1996 y no he conseguido desengancharme. Con esta entrada pretendo hacer una introducción a estos dispositivos; tan solo unas pinceladas que sirvan como primera toma de contacto con esta tecnología.

¿Qué es una FPGA?

Los dispositivos FPGA (Field-programmable gate arrays) son circuitos integrados que permiten implementar circuitos digitales. La capacidad de estos dispositivos varía desde cientos de puertas lógicas hasta millones. El diseñador puede configurar la funcionalidad de cientos/millones de bloques lógicos (por ello lo de gate array) así como su interconexión, y esta configuración se puede hacer después de haber fabricado el chip (por ello lo de field-programmable: programable in situ).

Podemos decir que la FPGA está compuesta por una red de memorias que albergan escasos bits. Estas memorias se denominan LUTs (look-up table: tabla de consulta) y permiten implementar funciones lógicas.

Veamos un ejemplo. En la figura se ve una puerta AND con la tabla de verdad que relaciona  sus entradas (a y b) con su salida (c).

Figura. Puerta AND y su tabla de verdad

Las señales a y b son las entradas a la puerta y la señal de salida es c. Se observa como c solamente está activa (‘1’) cuando ambas entradas están a ‘1’.

Otras puertas lógicas de 2 entradas necesitarían tablas similares, es decir, tablas con 4 filas y 3 columnas. De hecho, cualquier función lógica de 2 entradas podría expresarse mediante una tabla del estilo. Estas tablas de verdad son la esencia de las FPGAs, puesto que se implementan directamente como memoria RAM y pasan a ser los bloques lógicos que mencioné antes. De manera que llenando un circuito integrado de pequeñas memorias podemos implementar gran cantidad de funciones lógicas. Nótese que no estoy hablando de usar puertas lógicas, sino memorias. De hecho, y siento ponerme pesado, las puertas lógicas o la combinación de varias puertas se implementan en una FPGA con una memoria. La matriz de puertas (gate array) que forma parte del nombre de las FPGAs es en realidad una matriz de memorias (¿memory array?). De hecho el nombre que utilizaron para la primera FPGA, el dispositivo XC2064 de Xilinx era “matriz de celdas lógicas” (Logic Cell Array, en inglés), pero luego se implantó el termino FPGA introducido por Actel [Trimberger2015].

La tabla del ejemplo anterior se convertiría en la siguiente memoria de 4 bits:

Tabla: Interpretación de la tabla de verdad como una memoria

Las señales a y b concatenadas pasan a ser el bus de direcciones y la señal c es el bus de datos. Si a y b valen 1, realmente lo que ocurren es que se leería la posición de la memoria que ocpua la posición 3 (112=3 – leer entrada sobre binario). Ahora tan solo (es un decir) nos quedaría idear un método para poder escribir en muchas LUTs – para disponer de muchas funciones lógicas-, además de disponer de canales de rutado que nos permitieran interconectar dichas LUTs, y también, idear un método para configurar las conectividad de dichos canales. Ahí es ná.

En la figura aparece un esquema de la arquitectura de una FPGA. Los bloques lógicos contienen la funcionalidad y procesan señales que provienen del exterior (señales de entrada y salida (E/S)) o de otros bloques lógicos. Las señales E/S están conectadas a las patillas o pines del chip. Los bloques lógicos producen señales binarias que se conectan a otros bloques lógicos o a las señales de salida. Los canales de rutado se configuran para que se produzca la interconexión entre bloques lógicos y señales de E/S. Obviamos los detalles con la intención únicamente de introducir la tecnología.

Figura: Esquema de arquitectura interna de FPGA (modificación de https://commons.wikimedia.org/wiki/File:Fpga_structure.svg  )

Hay que destacar que el bloque lógico además de la LUT dispone de otros elementos lógicos básicos como puertas lógicas, multiplexores y de un biestable de tipo flip-flop (memoria de un bit), que ya veremos en próximas entradas en las que revisaré la arquitectura de varias FPGAs. Comentar que las FPGAs tienen LUTs con entre 4 y 6 entradas (la LUT de dos entradas era sólo un ejemplo con el que comenzar) dando lugar a funciones lógicas de entre 4 y 6 entradas. Con esto vemos que la FPGA puede implementar circuitos tanto combinacionales como secuenciales -debido a los flip-flops – y, en general, de gran capacidad.

Afortunadamente, el paso de las ecuaciones lógicas a la distribución entre bloques lógicos y su interconexión la realiza una herramienta de ayuda al diseño electrónico, o herramienta EDA (Electronic Design Automation).

Como veis, el proceso difiere bastante del desarrollo software. Para simplificar, algunos fabricantes (como Altera Inc.) utilizan el termino compilación para englobar las fases necesarias para ir de la idea (esquema lógico) a la implementación (FPGA configurada). La diferencia principal es que el tiempo de compilación puede llevar entre varios minutos y varias horas, incluso para diseños relativamente sencillos. El motivo es que hay que tomar muchas más decisiones que las que toma un compilador software.

Un tema espinoso es que la configuración de la FPGA se denomina programación y esto puede dar pie a confusión. Se utiliza programación de igual manera que a la escritura de los datos en una memoria PROM (programable read-only memory: memoria programable de sólo lectura). Esto tiene sentido en el caso de la PROM puesto que lo que se suele almacenar en estas memorias es un programa. Sin embargo, lo que almacenamos en la FPGA es la información lógica de las LUTs y los bits que configuran la interconexión. Yo prefiero decir que las FPGAs se configuran en lugar de que se programan para evitar que se asocie a sistemas software.

En la siguiente figura se ve cómo se distribuyen las LUTs en una FPGA concreta de la familia Cyclone IV de Altera. Cómo se observa, hay un gran número de memorias LUT.  Por ejemplo, dispositivos de la familia Virtex-6 de Xilinx tienen entre 46,000 y 354,000 LUTs. Con esta cantidad de LUTs se pueden hacer muchas cositas.

Figura. Esquema de la distribución de LUTs en dispositivo de la Familia Cyclone IV de Intel FPGA (Altera)

Microprocesador, ASIC y FPGA

Veamos brevemente la diferencia entre estos circuitos integrados:

  • Microprocesador: Circuito integrado que implementa una CPU y los bloques hardware necesarios para la transferencia de datos con la memoria y con los periféricos. Se diseñan para dar soporte a gran cantidad de aplicaciones, por lo que son circuitos costosos y consumen gran cantidad de potencia eléctrica. El punto fuerte del microprocesador es precisamente el hecho de que puedan ejecutar gran cantidad de aplicaciones de forma bastante eficiente. Hay que considerar que los errores en el diseño del microprocesador no se pueden corregir a posteriori al no poderse modificar la estructura del circuito integrado.

Esto último tiene su importancia (mucha). Recordemos el fallo en la división del microprocesador Pentium de Intel descubierto por el profesor Thomas Nicely en 1995 [Cipra1995]. Se “solucionaba” con un parche software que ejecutaba la operación muy lento al ser una emulación software. O más recientemente, las vulnerabilidades tipo Spectre  que afectan a microprocesadores de Intel, IBM y ARM, que de nuevo se solucionan reduciendo el rendimiento del sistema. Todo porque el fallo es hardware y no puede modificarse.

Podríamos decir que el microprocesador realiza continuamente tres tareas básicas:

  1. Lee una instrucción de una memoria (que contiene el programa)
  2. Interpreta la operación
  3. Ejecuta la operación (probablemente leyendo datos de memoria y escribiendo los resultados en memoria)

Tras ejecutar la tarea 3, vuelve a comenzar leyendo la siguiente instrucción (que suele estar en la posición siguiente con respecto a la anterior instrucción leída). El programador trabaja modifica el programa que está en la memoria para realizar cambios en la aplicación. Le es imposible modificar el hardware.

  • ASIC: Estas siglas provienen de Application-Specific Integrated Circuits, es decir, circuito integrado de aplicación específica. Es un circuito integrado que implementa un circuito que ha sido optimizado para una tarea concreta. Está en las antípodas del microprocesador. Al disponer de una arquitectura optimizada se puede optar por reducir al máximo los recursos (número de transistores y consumo de potencia eléctrica) o bien maximizar su potencia de cálculo (sin miramiento en el número de transistores). De nuevo, cualquier fallo en el diseño hardware es fatal suponiendo grandes pérdidas de dinero. Un ejemplo claro de ASIC sería circuitos que implementan procesamiento intensivo en tiempo real: Wi-fi, reconocimiento de imágenes, etc.
  • FPGA: La FPGA es similar al ASIC puesto que permite implementar circuitos optimizados para tareas específicas. La gran ventaja es que si se detectan errores una vez ha salido el producto al mercado, es posible corregirlos, de forma muy similar a como se actualiza el firmware de muchos equipos. En este caso, lo que se modifica es la secuencia de configuración de la FPGA que ésta carga siempre tras el arranque. La pega que tienen estos dispositivos es que el coste a pagar para conseguir la capacidad de reconfiguración es que se utilizan muchos recursos. La FPGA es más lenta que el ASIC y consume más que este. Para determinadas aplicaciones, es mucho más rápida que un microprocesador y consume mucho menos.

Si nos fijamos en la velocidad de los relojes que consiguen las FPGAs, hace una década rondaban los 200 MHz y en la actualidad rondan los 400 MHz (los fabricantes os dirán que es mucho más; es fácil hablar, lo difícil es diseñar sistemas). Con estas velocidades de reloj podríamos pensar que una FPGA no puede competir con una CPU que corre a varios Gigahertzios. La clave está en el paralelismo y en la posibilidad de adecuar de forma óptima (según el arte del diseñador) los diseños a una aplicación específica. Supongamos un reloj de 200 Mhz y una aplicación que debe realizar 10 multiplicaciones de enteros de 16 bits por cada dato de entrada. Si el algoritmo permite realizar las 10 multiplicaciones en paralelo, y si la FPGA permite que se implementen 10 multiplicadores, se podrán realizar 10x200e6 = 2e9 multiplicaciones por segundo. Pronto os hablaré de algún diseño propio en el que se consigue ir 10000 veces más rápido que un microprocesador i7.

Termino diciendo que cada tecnología tiene su nicho, su punto óptimo. Hay que considerar que la FPGA requiere tiempos de desarrollo altos y que no siempre es posible paralelizar.


Aquí descanso con la intención de continuar la entrada con varias partes. En la siguiente entrada veremos las etapas del flujo de diseño con FPGA a través de un sencillo ejemplo.

Mientras tanto os dejo algunos enlaces de interés:

“FPGA for Dummies”: https://plan.seek.intel.com/PSG_WW_NC_LPCD_FR_2018_FPGAforDummiesbook

Intel FPGAs: https://www.intel.com/content/www/us/en/products/programmable/fpga.html

Xilinx: https://www.xilinx.com/products/silicon-devices/fpga.html

Lattice: https://www.latticesemi.com/Products#_D5A173024E414501B36997F26E842A31

 

Referencias

[Trimberger2015] “Three Ages of FPGAs: A Retrospective on the First Thirty Years of FPGA Technology”, Proceedings of the IEEE, 2015

[Cipra1995] “How Number Theory Got the Best of the Pentium Chip “, Barry Cipra, Science, 1995 [pdf]

 

 

Nov 30

Torres Quevedo y el primer ordenador de la historia

Estoy en plena fase de lectura intensiva sobre las invenciones de Leonardo Torres Quevedo, y, aunque sea algo prematuro, me gustaría ir compartiendo mis hallazgos, sobre todo los relacionados con el mundo de la computación. Por otra parte, soy español y me paso la vida hablando de pioneros de la electrónica y la informática nacidos o que desarrollan su actividad en EE.UU., Japón, etc., y creo que no está mal de vez en cuando mirar qué sale de mi propia tierra. Sin ánimo de quitar mérito a nadie, hay una clara americanización de la historia de la computación, y para determinados temas hay que hacer el esfuerzo de ir a buscar la información y no que sea ella la que te encuentre.

El motivo por el que empiezo esta búsqueda es mi interés en una faceta de la computación que el público/usuario general asume de forma errónea: los ordenadores (léase sistemas digitales) cometen errores matemáticos en sus cálculos. El problema fundamental es que el número de dígitos que utiliza un ordenador para almacenar un número es finito, por lo que no todos los valores numéricos pueden representarse de forma correcta, y esto hace que los resultados de las operaciones conlleven errores, que a su vez se propagan si éstos son usados por otras operaciones. Y es aquí donde enlazo con Torres Quevedo, puesto que leí en algún sitio que fue pionero al proponer a principios de siglo XX uno de los formatos aritméticos más utilizado por los ordenadores hoy en día. “Pero esa es otra historia y será contada en otra ocasión”, no muy lejana.

El hecho en el que me centro esta vez es impresionante: Torres Quevedo implementó el que es muy probable que sea el primer ordenador de la historia.

Mi búsqueda en las bases de datos del IEEE y la ACM arroja pocos artículos: [Randell82][Yuste2005][Yuste2008]… Hay varios libros en español sobre el tema, algunos descatalogados y otros que no profundizan demasiado o que tienen información incompleta. El propio Randell trata los inventos digitales de Torres Quevedo en su libro “Origins of Digital Computers” (Springer, 1982), pero no he tenido la oportunidad de leerlo. Destaca el libro de Alfonso Hernando González el cual, como comento más abajo, está disponible online. El artículo de Randel [Randell82] me ha servido para andar este camino, además de los trabajos de Hernando [Hernando1991] y los artículos de Yuste y compañía.

Comencemos:

Leonardo Torres Quevedo nació el 28 de diciembre de 1852 en Santa Cruz (Cantabria, España). Estudió Ingeniería de Caminos, Canales y Puertos y su carrera profesional estuvo plagada de logros. Trabajó en diversas disciplinas tales como la aeronáutica, la automática, las telecomunicaciones y la mecánica. Sus inventos van desde las máquinas de cálculo analógicas, pasando por sistemas de control remoto por radio, hasta el diseño y fabricación de aviones semi-rígidos que se utilizaron en la primera guerra mundial. Su “Spanish Aero Car” aún sigue en funcionamiento en las cataratas del Niagara. Y también fue muy prolífico en el diseño de dispositivos de cálculo y en el de autómatas.

File:El eminente sabio español Leonardo Torres Quevedo, de Franzen.jpg

El eminente sabio español Leonardo Torres Quevedo (wikipedia)

Es famoso su Ajedrecista, el cual se considera el primer autómata de ajedrez, que realizaba el final de rey con torre contra rey, jugando – y ganando—contra un oponente humano. Se puede consultar su diseño en la publicación Le Nature de 1914 [Vigneron1914].

File:El Ajedrecista de Leonardo Torres Quevedo 02.jpg

El Ajedrecista de Leonardo Torres Quevedo (wikipedia)

Una de sus principales motivaciones era explorar las posibilidades que ofrecían las técnicas electromecánicas  y poner a prueba los límites de las máquinas. En su trabajo Ensayos sobre automática [Torres1914] nos habla de la obra de Babbage, el cual propuso por primera vez la construcción de máquinas capaces, no solo de realizar operaciones matemáticas, sino de ejecutar un programa. La máquina analítica de Babbage fue concebida para ser puramente mecánica, permitía almacenar datos (lo que serían los registros de la CPU), disponía de operadores aritméticos, tal como la suma, multiplicación y división (el equivalente a la unidad aritmético lógica (ALU)) y sus programas permitían bucles y toma de decisiones (saltos condicionales). En este último apartado, el de la programación, destacó Ada Lovelace como la primera programadora de la historia, porque, aunque ni Babbage ni ella llegaron a ver la máquina construida, escribió los primeros algoritmos que podía ser ejecutados por una máquina motivada por los escritos de Babbage. La máquina analítica nunca llegó a construirse y Torres Quevedo parte de ella para realizar una implementación electromecánica funcional. En este escrito se enfrenta al diseño de una máquina capaz de realizar la operación ax(y-z)2 para unos valores de entrada de las variables. La máquina disponía de los mismos bloques que la máquina de Babbage, pero adaptados a la tecnología electromecánica del momento: bloque bloque aritmético (ALU), bloque de almacenamiento temporal (registros) y programa de solo lectura (ROM) que permitía realizar saltos condicionales.

Automáta para el cálculo de ax(y-z)^2 (“Ensayos sobre automática” 1914)

Tras este esfuerzo intelectual, construye varios prototipos y es en 1920 cuando presenta en París el Aritmómetro. Esta invención, permitía escribir qué operación aritmética se quería realizar mediante una máquina de escribir y la máquina ejecutaba un programa acorde a la operación elegida. Internamente disponía de un programa de solo lectura que controlaba los operadores aritméticos, la memoria temporal, etc. En definitiva un ordenador que ejecutaba un programa que estaba almacenada en un tambor. Para cambiar el programa era necesario construir un nuevo tambor e introducirlo en la máquina [Hernando1991]. De ahí a las tarjetas perforadas  había un paso.

Hay que resaltar que Torres Quevedo no estaba considerando el uso de grandes memorias de almacenamiento, lo que sería la RAM, si no tan solo, el almacenamiento de valores temporales o de resultados finales de las operaciones – más en la línea de lo que son los registros de la CPU. Es probable, que la complejidad de almacenar y direccionar grandes cantidades de datos estuviese fuera del alcance de la tecnología de la época.

En [Hernando1991] se indica que la obra Ensayos sobre automática es “uno de los textos cumbres de la historia de la informática”. Hernando resalta que Torres Quevedo destaca la importancia de las máquinas digitales, que permiten controlar sistemas reaccionando a las condiciones del entorno o de los propios datos calculados. Claramente un comentario visionario. También  propone la creación de una rama específica de estudio llamada Automática, la cual, de haberse desarrollado en ese momento, habría adelantado en el tiempo  facetas de la electrónica y la informática que tardaron en aprecer varias décadas. También, el inventor hace énfasis en que los autómatas no sólo deben centrarse en realizar cálculos matemáticos de forma automática, sino que debían abordar cualquier tipo de problema, de nuevo adelantándose a las propuestas de Turing y Von Neumann. Hernando realizó su Tesis Doctoral sobre la obra de Torres Quevedo y ha puesto a disposición su libro del año 2000 basado en la misma en su blog.

Sin embargo, parece ser que el impacto de las teorías e inventos sobre computación ha sido nulo en el desarrollo de la informática, debido a su falta de difusión [Hernando1991]. De no haber sido así, la historia de la informática habría seguido otros derroteros, apareciendo el ordenador mucho antes. Los logros de Leonardo Torres Quevedo son anteriores a Turing (que nació en 1912) y varias décadas anteriores a los ordenadores de los 40 en los que se basó la informática moderna.

Con esta entrada tan solo quería difundir la relación de Torres Quevedo con la historia de la informática sin entrar en detalles sobre el funcionamiento de sus inventos. Espero disponer de tiempo para poder analizar los diseños de este gran científico e inventor y poder contarlos con detalle en el futuro.

Enlaces de interés

The Babbage Engine, Computer History Museum (consultado 30/11/2018)

Biografía de Leonardo Torres Quevedo, ITEFI-CSIC (consultado 30/11/2018)

Actas del Simposio “Leonardo Torres Quevedo: su vida, su tiempo, su obra”, 1987, 1991 y 1995 (consultado 30/11/2018)

Blog de Alfonso Hernando González (consultado 30/11/2018)

Referencias

[Randell1982] “From Analytical Engine to Electronic Digital Computer: The Contributions of Ledgate, Torres, and Bush”, Brian Randell, Annals of the History of Computing, IEEE, 1982

[Vigneron1914] «Les automates», H. vigneron Le Nature, 1914 (El ajedrecista)

[Torres1914] “Ensayos sobre Automática. Su definición. Extensión teórica”, L. Torres  Quevedo, Revista de la Real Academia de las Ciencias, 1914 [PDF]

[Hernando1991] “Torres Quevedo como precursor de la informática moderna”, A. Hernando González, Actas del Simposio Leonardo Torres Quevedo: su vida, su tiempo, su obra, 1991 [PDF]

[Yuste2005] “Scanning Our Past from Madrid: Leonardo Torres Quevedo”, A.P. Yuste, M.S. Palma, Proceedings IEEE, 2005

[Yuste2008] “Early Developments of Wireless Remote Control: The Telekino of Torres-Quevedo”, A.P. Yuste, Proceedings IEEE, 2008

Nov 21

Total recall: “6502: semilla de la revolución digital” (2017)

El microprocesador 6502 era magia hecha de bits. Los creadores de este microchip son verdaderos héroes digitales que consiguieron lo imposible: crear un microprocesador de bajo coste en 1975 que moldeó la industria de la electrónica. Este dispositivo se usó en máquinas legendarias: Atari VCS 2600, Apple II, Commodore 64, Nintendo Famicon, etc. Un GIF animado vale más que mil palabras:

(a veces la animación falla, prueba aquí)

En 2017 impartí dos charlas sobre este tema. Primero, en abril de 2017, tuve la oportunidad de homenajear a este pequeño y maravilloso micro con una presentación que hice en el evento de computación clásica RetroMadrid. Posteriormente, extendí un poco la charla y la impartí como parte del evento de divulgación científica organizado por la Comunidad de Madrid, (Semana de la Ciencia 2017, noviembre de 2017). Disfruté enormemente el proceso de conectar los numerosos puntos que perfilan una historia fascinante y única. También, recibí gran cantidad de comentarios interesantes de la audiencia, a la que estoy muy agradecido. Por cierto, la segunda charla tiene un final alternatico… en varios sentidos.

Los contenidos de la charla son:

  • Repaso corto (y bastante informal) de circuitos digitales y circuitos integrados
  • Chuck Peddle y Motorola: ¿Competimos con Intel?
  • Chuck Peddle y MOS Technology: ¿Construimos un microprocesador de bajo coste?
    • El equipo del 650x
    • Diseño del chipset 650x
    • Vendiendo el micro
    • Motorola ataca de nuevo
  • 6502 y Commodore
  • 6502 y… Commodores, Atari, Apple, ARM, Nintendo, etc., etc.
  • El 6502 hoy en día
    • Libros, microchips y kits
    • FPGAs
    • Visual6502
    • 6502 y la Neurociencia
  • El público se vuelve loco

Tengo que destacar que mis charlas están basadas en libros y documentos en los que hay información que posteriormente he comprobado que no era totalmente objetiva, así que la historia que cuento tiene ciertas imprecisiones que deberían ser investigadas en más detalle. Espero tener tiempo para poder hacerlo.  Desde que me di cuenta de esto, intento ser cuidadoso con las fuentes que uso y siempre intento desarrollar mi propia versión de la historia, dejando claro qué son hechos y qué es una opinión (mía o de otra persona).  [Este tema lo desarrollo un poco en mi charla sobre la invención del microprocesador]

Resumientdo, no importa si eres un nostálgico de Zilog, Motorola, Texas Instruments, etc., la historia del 6502 debe ser contada, porque este microprocesador es un elemento esencial para comprender la creación del PC y el nacimiento de la industria del videojuego.

A destacar:

  • El proceso microelectrónico era manual. Era necesario dibujar a mano las diferentes capas del microchip. Esto también ocurrió así en el desarrollo del Intel 4004.
  • Un tipo llamado Steve Wozniak compró varios chips de la primera tanda de 6502 que se vendió y construyó  el ordenador Apple I.  Este microprocesador hizo posible construir ordenador a un precio asequible.
  • Dos de los tres ordenadores personales más vendidos, lo cuales animaron a IBM a entrar en el negocio del ordenador personal, tenían como cerebros el 6502:  Apple II (6502), Commodore PET (6502) y Tandy TRS-80 (Z80).
  • La creación del 6502 y el hecho de que una compañía mediana (Western Design Center) fuese capaz de diseñar y fabricar microchips sirvió de inspiración para que ingenieros de Acorn desarrollasen sus propios microprocesadores, con el resultado de que años más tarde nació ARM.

 

Referencias

6502.org: Página sobre el 6502 con gran cantidad de información.
The Visual 6502 project: ¿Queréis ver la actividad de los transistores mientras se ejecuta código en ensamblador? Este es el sitio adecuado.
Apple][ history website: El sitio de referencia para aprender sobre el Apple ][
Commodore: a company on the edge: Fantástico libro sobre los primeros pasos en el mundo de la informática de Commodore Bussiness Machines. Se describe de forma sublime la creación del chip 6502.

Charlas

  • El microprocesador 6502 y su impacto en la revolución digital (Spanish), RetroMadrid 2017, [slides]
  • Historia del microprocesador 6502: semilla del PC y de la industria de los videojuegos (Spanish), Semana de la Ciencia 2017 [slides (with alternative ending 🙂 )]

Oct 16

Sinistar: el arcade de la eterna juventud

No hay nada como encontrar un ejemplo divertido (esto siempre es cuestionable) para apoyarse a la hora explicar uno de tantos áridos conceptos que pueblan la electrónica digital, la computación y el procesamiento de señal. Hace tiempo me topé con un vídeo fantástico publicado por la revista IEEE Spectrum (Five Infamous Arcade-Game Glitches), en el que hablaban de fallos de programación (glitches) en juegos de máquinas recreativas: Asteroids (Atari), Donkey Kong (Nintendo), Sinistar (Williams Electronics), Ms. Pacman (Midway) y Centipede (Atari) .

Me llamó la atención el glitch del juego Sinistar, que me venía de perlas para explicar la aritmética en complemento a 2, fundamental en el mundo de los sistemas digitales. En este juego existía la posibilidad de pasar de tener 1 única vida a disponer de 255. Todo esto debido a un despiste de programación y al funcionamiento de la aritmética binaria (en este caso de 8 bits). Por cierto, matizar que lo que voy a contar es bastante simple, pero divertido.

Primero os explico muy por encima un par de conceptos sobre binario que si ya tenéis experiencia podéis ir directos al meollo pulsando aquí.

Continue reading

Ago 28

(RetroMadrid2018) Pioneros de los 4 y 8 bits: la creación del microprocesador [la charla que no pude dar]

Os presento un vídeo de una charla que pretendía dar en RetroMadrid 2018, pero que por problemas de salud me fue imposible impartir. En la charla cubro los siguientes puntos:

  • Recordando RetroMadrid 2017.
  • Origen del 4004 de Intel.
    • A destacar: El papel de Japón en la creación del primer microprocesador comercial en un chip.
    • A destacar: Dos genios en acción: Masatoshi Shima y Federico Faggin.
  • ¿Fue el 4004  de Intel el primer microprocesador? Revisaremos la definición de microprocesador y diseños contemporáneos al 4004.
    • A destacar: En mi opinión personal hubo otros microprocesadores anteriores al 4004.
  • Texas Instruments: un secreto con 45 años de edad.
  • Relación de Intel con: Zilog, Motorola, MOS Technology, ARM, etc.
  • Me gusta Star Wars, no lo niego 🙂

 

Nos encontramos ante una historia apasionante en la que nada es simple y en la que el ingenio y la suerte juegan papeles cruciales en su desarrollo.

Os propongo 2 3 posibles  planes:

  1. Véis la charla y luego – tiene que ser después para evitar spoilers – leéis el magnifico y riguroso artículo de Cristina Sánchez sobre Federico Faggin (eldiario.es/Hoja de router) https://www.eldiario.es/hojaderouter/tecnologia/hardware/primer-microprocesador-Intel-sentir-valioso_0_794070590.html
  2. Si no os apetece ver el vídeo podéis mirar este gif animado a ver si sois capaces de sacar algo en claro 😛 3. (Actualizado 24/10/2018) Leéis las transparencias de la charla.

En la charla me quejo de la desinformación de Internet y de la falta de rigor que incluso afecta a medios de prestigio. Sin embargo, quiero dejar claro que mi propia charla esta sesgada por mis propios prejuicios y por falta de tiempo – puesto que esta actividad la desarrollo al margen de mi actividad profesional. En todo caso, estoy convencido de que esta presentación es un buen punto de partida para aquel que quiera indagar más sobre el tema. Huelga decir que en la charla hay datos claramente objetivos y otros que son opiniones personales (como por ejemplo, cuestionar la definición de microprocesador).

He revisado muchos documentos. A continuación os pongo algunos por si queréis extender o contrastar lo que os cuento. Algunos documentos son privados, pero es posible que estén disponibles en la web…

 

Por último, me queda disculparme por la baja calidad del audio. El próximo vídeo lo haré mejor (espero).

 

Bitnami