Mis pequeños relés: la computadora Brainfuck es una realidad



Ha pasado exactamente un año desde la última publicación y pensé que el primero de abril es un gran día para el resumen anual de mis tres proyectos informáticos locos. En ese momento, el proyecto solo existía en papel, pero ahora definitivamente se ha convertido en una realidad.


Bloques de relé sonando, los cálculos de relé más rápidos del mundo (pero esto no es preciso), recapitulación, indicadores de vacío y LED parpadeantes.


Antecedentes historicos



Figura 1: Un volumen de "Radio-Electronic Toys" de Wojciechowski, 1979, maltratados por mi vida y por mí mismo.


Érase una vez, cuando todo era grande, y yo era pequeño (un año así en 2002), mi padre me regaló el libro Radio-Electronic Toys de Wojciechowski. Entonces no tenía una computadora, pero no escuché nada sobre Internet, y un libro familiar para muchos resultó ser solo un almacén de dispositivos electrónicos entretenidos. Entre ellos se encontraba una descripción de una computadora electrónica y un circuito modelo simple en relés telefónicos. Este modelo, que estaba en mi segundo año en la universidad en 2008, lo armé para un informe sobre la historia de las computadoras.



Figura 2: RCM - ALU de 4 bits


En ese momento, ya estaba explorando las vastas extensiones de Internet y siendo consciente de la existencia de la computadora de retransmisión Harry Porter , la computadora de retransmisión número 2 y la computadora de retransmisión Zuse : estaba pensando en construir mi propia unidad.


Para aquellos que son poco conscientes de lo que otros tienen, sugiero ver mi revisión de video de las computadoras de retransmisión caseras. A lo largo del año, está un poco desactualizado, pero no ha dejado de ser menos interesante:



En el mismo 2008, en clases sobre los fundamentos teóricos de la ingeniería eléctrica, decidí sobre el componente principal: un relé de lámina. En uno de los laboratorios, me sorprendió observar en la forma de onda cómo funcionaba el bebé RES55 a una frecuencia de 50 Hz. Esto me causó una impresión duradera y comencé a acumular interruptores de láminas.


Han pasado 10 años ...


Y después de una década, el proyecto se está moviendo con gran velocidad para su lanzamiento. Todo se movió desde un punto muerto en noviembre de 2016, cuando nació la arquitectura actual. Desafortunadamente, decidí hacer todas las placas de circuito impreso por mi cuenta ... como resultado, un metro cuadrado completo de PCB de doble cara se convirtió en un agujero negro y absorbió varios cientos de horas hombre de tiempo libre, que son aproximadamente seis meses para un empleado. De abril a noviembre del 2k17 prácticamente no pasó nada.


Infografia



La arquitectura de la máquina corresponde a la máquina de Turing. Hay una cinta con datos: RAM para 64 kiloslov (palabra de 16 bits). RAM: caché de chips de algún tipo de tapete. placas base para Intel Pentium. Para autenticidad, vaya a ... la sección Autenticidad. Microcircuit RAM se usa en la mayoría de las computadoras de retransmisión caseras que conozco.


El elemento central es un sumador paralelo de 16 bits. Él es responsable de calcular el número de la siguiente instrucción y trabaja con datos y un puntero.
En las entradas del sumador hay un registro temporal de 16 bits y un registro de comando de 12 bits. También se envían 12 bits a los 4 bits altos del sumador, lo que da 16 bits "completos". Es importante que el sumador funcione correctamente con la suma y resta de un número de 12 bits.


La desventaja es obvia: en un momento podemos saltar solo 2 ^ 12 instrucciones hacia atrás o hacia adelante, o cambiar el puntero o los datos por este valor. El primero, que debe tener en cuenta al escribir programas, el segundo, siempre puede repetir el procedimiento.


La resta está en el código adicional. La transferencia paralela proporciona un retraso de cálculo constante: solo 3 relés de serie. Esto no es más de 2 ms.


El registro IP y el registro AP, así como la entrada de RAM, están conectados a la salida del sumador a través de pestillos.


Cálculos


Las operaciones principales son exactamente dos piezas. En un caso, trabajamos con el cálculo de un nuevo valor de puntero, en el otro, un nuevo valor de datos.


Cada flanco ascendente comienza el cálculo de un nuevo número de instrucción. Básicamente, IP ++ está hecho. Después del cálculo, el IP se alimenta a la entrada de dirección de la tarjeta de memoria y, a través del bus de datos, la instrucción ingresa al registro de comando. Los 4 bits altos determinan la instrucción futura, los 12 bajos probablemente no sean iguales a cero y en el futuro el sumador cambiará el número en el registro temporal exactamente por este valor.


Cada borde descendente comienza la operación.


Para operaciones con registros AP e IP, la secuencia de acciones se ve así:


  1. A través del bus de direcciones, el contenido del registro IP (AP) se copia en el registro temporal;
  2. Los registros temporales y de comando se alimentan a la entrada del sumador. Después de 2 ms, la respuesta estará lista a la salida del sumador.
  3. La respuesta se registra en el registro IP o AP.

Hay algunas caracteristicas. Para los comandos AP + BIAS y AP-BIAS, este es exactamente el caso, para los comandos condicionales, cuando, por ejemplo, IP = (* AP == 0?) IP + 1: IP + -BIAS, aún necesitamos cargar el valor actual de la celda de datos en el bus de datos y eliminar información de un detector nulo.


Para las operaciones AP + BIAS y AP-BIAS, la secuencia es ligeramente diferente.


  1. A través del bus de datos, el valor actual de la celda de memoria se escribe en el registro temporal.
  2. Los registros temporales y de comando se alimentan a la entrada del sumador. Después de 2 ms, la respuesta estará lista a la salida del sumador.
  3. El registro AP continúa siendo alimentado a la entrada de la tarjeta de memoria. La respuesta del sumador se escribe directamente en la memoria.

Los cálculos siempre ocurren en modo de 16 bits. Pero la bandera nula de la rama condicional se define como:


Z = ((16bit?) *AP : (*AP) & 0x00FF == 0) ; 

Construcción


Nada ha cambiado desde la última vez.


Modulo



Figura 3: Módulo de la computadora. De izquierda a derecha: módulo D-flip-flop, módulo de diodos, módulo 2AND / 2XOR


En el núcleo hay un pequeño módulo de 40x64 mm. Cada módulo es una placa de circuito impreso con 4 relés, en los que se implementa una operación lógica simple. Hay un conector para 16 contactos (hay módulos para 12 y 14 contactos) y hasta 4 LED. Todos los tamaños son estrictamente fijos.



Figura 4: Módulos durante el ensamblaje


Por ejemplo:


  1. Módulo 2AND / 2XOR - 2 operaciones lógicas independientes - 2AND y 2XOR. Se utilizan 32 piezas en el bloque sumador, dos módulos por bit. Al principio, se soldaron los 4 LED, pero la circuitería del módulo es tal que dos relés en cada módulo están conectados en paralelo, y para reducir la energía consumida por la unidad, se eliminó la mitad de los LED.
  2. Módulo D-trigger: 64 piezas van a dos bloques de registro. De estos, 60 son disparadores sin una señal de habilitación.
  3. Módulo de diodos: solo 8 diodos en la placa para implementar un diodo de entradas múltiples O. Un truco sucio, pero permite guardar tanto en un relé (todavía tengo unos 400 relés en reserva ahora) como a tiempo: en comparación con un relé, la señal se transmite a la salida de dicho elemento lógico al instante.
  4. Módulo 2 y - Este es el ladrillo base. De hecho, hay 4 relés con un contacto de conmutación para implementar absolutamente cualquier circuito lógico. Irán a bloques de lógica en una cantidad desconocida.
  5. Universal 2AND / 2OR que está hecho de tal manera que permite implementar casi cualquier función lógica: 4AND, 4OR, 4AND-NOT, 4OR-NOT y así sucesivamente. También irá al bloque lógico en una cantidad desconocida.

Como dije, después de haber perdido mucho tiempo en la fabricación de placas de circuito impreso caseras, me asusté y pedí un juego completo de placas de circuito a los chinos. En la primera semana armé los primeros módulos. Y un mes después, todos los módulos para el bloque sumador estaban listos.



Figura 5: Bloque sumador


Bloque


32 módulos de 8 módulos en 4 filas se combinan en un bloque funcional. Hay 5 bloques en total (en el peor de los casos, 6):


  1. El bloque sumador es un sumador completo de 16 bits. Dos entradas de 16 bits para números, 1 línea de transferencia de cero bits, dos salidas. En uno está la operación de suma, en el otro está el XOR entre las entradas. Se puede usar como una operación independiente.
  2. Bloque de registro IP / AP: dos registros independientes de 16 bits sin señal de habilitación. Los hallazgos de Q y ~ Q se usan directamente y se alimentan a través de pestillos a donde sigue. Era posible soldar 4 relés, pero en aras de salvar el relé, la funcionalidad se colocó en pestillos externos.
  3. Bloque de registros TMP / CMD: aquí hay tres registros. Uno es un registro temporal de 16 bits. Exactamente igual que IP o AP. El segundo es de 12 bits; su salida está conectada a la entrada del sumador a través de un pestillo. El tercero es de 4 bits, con una señal de habilitación incorporada. Se utiliza para almacenar la instrucción actual.
  4. Bloques lógicos - 2 piezas. O tres. El esquema aún es desconocido. Los cálculos preliminares muestran que 64 módulos serán suficientes (GOTO: Memory Board).

En la base de cada bloque, la placa base es de 200x150 mm, sin cableado. Todo lo que está encendido son 32 conectores y clavijas cuadradas que sobresalen desde abajo para una instalación envolvente.



Figura 6: placa base y su cesta


Los módulos que sobresalen en el conector así no son confiables. Colgarán aquí y allá, cambiarán de sacudidas y en todos los sentidos reducirán la confiabilidad de la estructura. Para arreglarlos, dibujé e imprimí canastas especiales con surcos. Los módulos ciertamente no irán a ninguna parte: sobrevivieron a un viaje en tren a Moscú y regresaron sin ningún problema.


La canasta podría haberse dibujado más fácilmente: con una capa de 0,32 mm se imprimiría un poco más de 10 horas. Tres cestas están impresas con plástico PLA, dos más con HIPS. Este último, debido a la falta de una carcasa para mi impresora, se deforma perceptiblemente al imprimir.


Puede notar que el bloque sumador no tiene orejas para adjuntar. La canasta para él se imprimió la primera. Luego acoplaré estas orejas o imprimiré una nueva canasta.

Figura 7: Bloque sumador y bloque lógico.


Envoltura de alambre


En la placa base, estamos esperando 600 conclusiones que deben interconectarse. Afortunadamente, es necesario conectar no solo todo, sino solo casi todo. Por otro lado, no hay nada más fácil.


Recogemos una herramienta especial, una bobina de alambre y una pata después de una pata, terminamos el diagrama de conexión.



Figura 8: Cierre del bloque sumador


Esto es solo el comienzo del trabajo. Bueno, como un comienzo. Al principio hubo un silencio silencioso: los cables se colocaron al azar, algunos puentes son largos, otros son demasiado largos ... Después de aprender un poco mejor que antes, quité la mayoría de los puentes y los torcí de nuevo. Comencé a estirar los puentes con una cuerda. Por lo tanto, los cables no se cuelgan y el resultado se ve mucho mejor. Traté de poner para que los cables no presionen en las esquinas de no sus pines. Como resultado, no hay un solo circuito. Desde el primer intento solo había líneas de tierra.



Figura 9: Cierre del bloque sumador. Resultado final


Por el momento, no es exactamente sencillo, pero creo que para el primer tablero es un muy buen resultado. Hasta ahora, no he aprendido cómo tender el cable a la bobina, o una herramienta curva, o las manos ...


En camarada UA3MQJ tiene un artículo detallado sobre este método de instalación.


Además del bloque sumador, se necesita un bloque de registro. Más bien, dos registros de bloque. Un par de meses más y se ensamblan y prueban otros 64 módulos. Queda por enrollar la placa base.



Como fue eso


Módulos indicadores



Figura 10: Módulo indicador


El estado actual de los registros del procesador debe mostrarse en algo y decidí que los indicadores de vacío serán los correctos. En el tablero de 100x100 mm (para 10 piezas de este tamaño que puede pedir a los chinos por $ 5), hay 6 indicadores IV-6, disparadores K155TM8 y un microcontrolador. La indicación aquí es dinámica.


También hay una entrada de 16 bits para la lectura directa del estado del registro y un puerto UART para recibir comandos de la tarjeta de memoria.


Ahora el firmware puede leer el estado del puerto de 16 bits y, en formato HEX, mostrarlo en el indicador. En total, necesito 4 piezas de dichos módulos. Tres mostrarán el estado actual de los registros: IP, AP y CMD del registro para tener una visualización más conveniente de los valores almacenados actuales. Cuarto: mostrará el número total de instrucciones ejecutadas.


Pestillo



Figura 11: Módulo de cierre


El módulo de cierre consta de 8 relés RES43. En el interior hay dos contactos. Izquierda y derecha son LED que muestran el estado actual de la entrada y salida.


El tamaño del pestillo es de 100x100 mm. La cantidad requerida es de 8 piezas. Dos están listos, queda por recoger seis más.


Tablero de memoria



Figura 12: Tarjeta de memoria. Vista general


El bloque más grande, que contiene principalmente dos 64 Kbytes de chips RAM estáticos y esquemas coincidentes para entradas de direcciones y un puerto de datos. El tablero alberga el microcontrolador ATmega1280. Tiene dos tareas vitales:


  1. Descargando el programa y los datos iniciales a la RAM. El binario compilado debe colocarse en la memoria. Para hacer esto, será posible conectarse a la tarjeta de memoria a través de UART o telnet (a través de Wi-Fi) y descargar el archivo ejecutable. MK leerá el encabezado y colocará secciones de código y datos en la RAM. Soy demasiado perezoso para hacer esto con los interruptores y botones de alternar, un programa de mierda que puede hacer algo más complicado. HelloWorld contiene miles de instrucciones. Hay un par de cartas de triunfo en el nido a este respecto, pero sobre ellas en otro momento.
  2. Implementa comandos para leer datos de la consola y escribir en ellos. Si si instrucciones "" y "," se implementan utilizando MK. Por el contrario, la lógica del relé informa al MK que ahora es necesario transferir el estado del bus de datos a la consola, o viceversa, para emitir el valor de la consola al bus de datos. De hecho, MK funciona como un convertidor de interfaz paralela en UART. Sí, es bastante posible ejecutar algunos especiales. chip y lo pensaré.

Todavía no he decidido qué hacer con el modo de 16 bits. Por supuesto, la mayoría de los programas están escritos bajo el cerebro de 8 bits y todo es simple: leemos y escribimos el byte bajo. Y en modo de 16 bits, ¿qué debo hacer? ¿Mostrar la palabra completa o solo el byte bajo también?


Además de las principales, MK tiene una serie de tareas secundarias, de las que puede prescindir, en principio, pero están destinadas a la conveniencia de usar la máquina:


  1. MK es responsable de mostrar un área pequeña de memoria en una matriz LED de 32x16 píxeles. Lo hace mientras el bus de direcciones y el bus de datos no están ocupados por la lógica principal. Aquí no estoy seguro de que para MK generalmente haya tiempo en el autobús, por lo que es necesario verificar la pregunta. Pero en el encabezado del programa habrá una dirección de inicio para mostrar e intentaré que funcione. La indicación es dinámica. Se emiten dos columnas de datos a la vez en un ciclo de reloj.
  2. Cuando el indicador del modo de memoria protegida se activa en el binario, en el caso de un intento de ejecutar una sección de datos o escribir en la sección de memoria, el MK generará una excepción de "Fallo de segmentación". Entonces podemos asegurarnos de que el programa no vaya a donde no debería. No está prohibido leer la sección de memoria.
  3. Cuando se activa el indicador de control de código, MK activa el simulador y ejecutará las mismas instrucciones que la computadora, comparando los resultados esperados y recibidos. Si el resultado es diferente, se lanzará la excepción "Error de máquina". Esto significará que se ha producido un error en los cálculos y quizás un módulo ha comenzado a fallar. O también nosotros levantamos la frecuencia del reloj y los relés ya no tienen tiempo para calcular. Solo con la ayuda de esta funcionalidad, intentaré exprimir al máximo el automóvil; algo tendrá que controlar el funcionamiento correcto durante este período.

Todavía hay una función temporal, pero aún vital, de la placa de memoria: emular un bloque de lógica mientras no está allí. Hay líneas de entrada y salida en la placa de memoria y podemos suministrar las señales necesarias a los bloques. Por lo tanto, al conectar todas las líneas de control a la tarjeta de memoria y escribir un programa que emita la secuencia de comandos necesaria, resultará en el menor tiempo posible:


  1. ejecutar los primeros programas para su ejecución;
  2. algoritmos de depuración y circuitería del bloque lógico, lo que aumentará las posibilidades de su ensamblaje y operación sin errores más adelante.

Luego, al reunir los módulos necesarios de los bloques lógicos, todas las funciones se transferirán gradualmente "al hierro". Cuando MK deja de ser responsable de la lógica, el proyecto se considerará completado.


Autenticidad


El proyecto no fue concebido originalmente como puramente relé, sin el uso de transistores y microcircuitos. Por un lado, la computadora resulta ser híbrida y pierde resistencia a la radiación, por otro lado, la mayoría de las computadoras de retransmisión tienen una dolencia similar. La versión final de la máquina utilizará un chip de memoria y un microcontrolador. La memoria de ferrita se utilizará en otro proyecto, ya "sin silicio".


Para compensar el efecto del no canon, obtuve una máquina de escribir electrónica “Robotron S6130”



Figura 13: Máquina de escribir electrónica tipo manzanilla.


Desafortunadamente, la máquina se me acercó en un mal estado de vida. Fue utilizado durante mucho tiempo en contabilidad, pero al final fue abandonado para morir en un espléndido aislamiento.



Recomiendo ver una crítica única de este monstruo.


Directamente, la mecánica está en buenas condiciones, pero la placa del procesador, en la que se encontraba un par de baterías D-0.25 NiCd, fue muy utilizada. Se filtraron con seguridad e inundaron todo a su alrededor con electrolitos.


Quiero restaurarlo y usarlo como terminal de entrada / salida para la computadora. Sin embargo, además del mal funcionamiento de la parte electrónica, la máquina tiene una margarita rusa (unidad con letras) y teclas rusas. El segundo se decide por pegatinas, el primero debe buscarse y aquí todavía no tengo suerte. Sobre el hecho de que se requiere un cartucho con una cinta de tinta, generalmente estoy en silencio. Al menos tengo papel para ella ...


Si la electrónica decide que se pierde irremediablemente, entonces trataré de encontrar un donante o desarrollaré un nuevo relleno electrónico. Hacer que un tablero de control sea un puñado de shagoviks no es la tarea más difícil. Será más difícil traducir un manual del alemán y comprender los conocimientos tradicionales. Por supuesto, esta máquina merece un artículo separado sobre los resultados del renacimiento. Contra ella, hasta ahora es la prioridad del trabajo realizado.


Pruebas


Todos aquellos que hayan leído hasta este lugar recibirán una recompensa en forma de bloques de relé resquebrajados.


Para empezar, intentemos aplicar una onda cuadrada a la entrada del relé a través de una cascada de transistores:



Figura 14: Prueba de alta velocidad del interruptor de láminas RES55. Hay una señal amarilla en la bobina, azul en los contactos.


Dado que la entrada del osciloscopio tiene una cierta capacitancia, y después de que se abre el contacto del relé, permanece en el aire y comienza la autodescarga, vemos el exponente opuesto. ¡A una frecuencia de 1.7 kHz! Para el relevo! ¡Para un pequeño relé de lámina! Parada ordinaria a 20Hz o ligeramente superior. A una frecuencia nominal de 100 Hz, los bordes ascendente y descendente son aproximadamente 600 μs cada uno. Aquí son tan pequeños (200 microsegundos), porque la energía de la anterior todavía permanece en la bobina en el momento del próximo encendido.


Aplicamos voltaje a los bloques, cortamos los interruptores de los instrumentos de medición soviéticos a las entradas.



Figura 15: Bloque sumador y bloque de registro en funcionamiento


Cuenta! Genial



Así se veía desde la escena. Al principio quería rehacer los conmutadores para 16 bits. Conecta los indicadores a la entrada y a la salida, pero ... no pude resistirme.


Bueno, dado que todo funciona y el relé resultó ser capaz de velocidades increíbles, alimentamos el meandro a la línea de transferencia:



Y cortamos 500Hz. El sumador hace frente, aunque el sonido no se puede decir. En realidad, el sonido es claro, pero el micrófono de condensador piensa de manera diferente. Hasta donde yo sé, este es el sumador de relevos más rápido del mundo.


Para continuar



Figura 16: Diseño de un marco de computadora


Poco a poco, las seis piezas de pestillos faltantes se recogen y el marco de la futura máquina comienza a diseñarse. Hay seis bloques en el dibujo en caso de que 64 módulos no sean suficientes para la lógica. Y si ya es suficiente, el lugar debajo del bloque central inferior permanecerá vacío.


Al mismo tiempo, estoy escribiendo firmware para una tarjeta de memoria para que pueda reemplazar un bloque lógico faltante. En el verano, la computadora podrá ejecutar su primer programa.


¿Tres computadoras?


Si tres. El primero es el BrainfuckPC actual. El segundo es una computadora neumática , cuyo nombre en código es FluidicPC .


Sobre el tercer monstruo futuro resistente a la radiación ya puede encontrar referencias en Internet, pero no quiero rociar entre proyectos y primero quiero terminar el actual, todavía no hago un anuncio.


Figura 17: Cambio de decatrones A101, A102 y A103
Aunque a partir de esta imagen ya puedes adivinar lo que se discutirá.


POR QUÉ ???




Referencias


Todo el proyecto sigue estando completamente abierto. Por lo tanto, los principales enlaces para el proyecto:


  1. Repositorio con diagramas de circuitos y diseños de PCB . También hay firmware para el módulo indicador y la tarjeta de memoria.
  2. En esta página publico semanalmente y no muy informes sobre lo que se ha hecho. Ahora está leyendo un artículo, un poco más que completamente compuesto por estas notas. Con traducción, comentarios y adiciones.
  3. Compilador y emulador .

Source: https://habr.com/ru/post/es411145/


All Articles