radastan escribió:Lo que ya veo más complicado es el tema de montar todo en una FPGA, más que nada porque debido a los tiempos de acceso no será un clon 100% compatible, no se hasta que punto llegará la incompatibilidad.
Bueno... quizás no se pueda emular el hardware al nanosegundo, pero es que... ¡no hace falta! para obtener un funcionamiento idéntico. En teoría, bastaría con tener a una FPGA funcionando a 14MHz, la frecuencia original de la ULA, para que funcionase con los mismos timmings.
En la práctica, el diseño de la ULA del Spectrum presenta algunas particularidades. Hablando con Chris Smith hace un tiempo, me comentó que es que en la ULA hay celdas que se usan únicamente para retrasar cierta señal un número determinado de nanosegundos. De hecho, hay formas de onda (los pulsos de RAS y CAS) que se generan a base de coger ciertas formas de onda originales (la señal de 14MHz, esa misma señal dividida entre dos, etc.) y retrasarlas más o menos, para después combinarlas entre ellas y así generar formas de señales más complejas (los mencionados pulsos) que más tarde, y según lo que dicte la máquina de estados de la ULA, salen (o no) por los pines correspondientes.
Un reemplazo moderno para la ULA seguramente no necesitará de estos trucos para generar formas de onda complejas. Es más: por lo que vengo observando en los diseños FPGA que se hacen en mi departamento, la opción pasa por saber a priori cuál va a ser la señal, o el pulso más estrecho que deba generarse con el dispositivo, y elevar la señal de reloj maestro lo suficiente como para poder generar un pulso de ese ancho en un ciclo del reloj maestro. Esto es necesario para cualquier diseño síncrono.
Dicho de otra forma: que si por ejemplo resulta que la diferencia entre la bajada de RAS y de CAS en la ULA es de 20ns, y se comprueba que ese tiempo es el menor tiempo que transcurre dentro de ella, basta con que el reemplazo use un reloj de como mínimo 20ns de periodo, es decir, 50MHz.
Aun así, habrá tiempos que no sean iguales "al osciloscopio" respecto de la ULA. No debiera ser un problema: la misma ULA ha sufrido cambios en cada revisión, y algunos de ellos bastante evidentes, como demuestra el que hay modelos con interrupciones "early" y otros con "late" (en algunos modelos, el tiempo de contienda comienza un ciclo de reloj más tarde que en otros modelos, medido éste desde el retrazo vertical) y no ha afectado (que yo sepa) a los juegos que se han hecho.
Hace algunos meses, reparando un +2 gris de Metalbrain, tuve que añadir circuitería para retrasar artificialmente el momento en que bajaba CAS porque por una avería, ésta se generaba antes de que bajara WR, invalidando la escritura a memoria. Aunque los timmings habían cambiado, el ordenador estaba funcionando igual.
Por otra parte, en la ULA de los 48K hay ciertos módulos que son analógicos: la generación de las señales Y,U y V. Es la única parte analógica de verdad en la ULA. Esto es posible porque las macroceldas de la ULA no son elementos digitales como en las CPLD's modernas, sino que son mucho más sencillas: un par de transistores sin conectar, y unos cuantos elementos pasivos. Esto permite no sólamente crear puertas lógicas usando los transistores en corte-saturación, sino además crear elementos analógicos, haciendo funcionar los transistores en su región activa.
En una FPGA/CPLD es posible generar señales analógicas usando PWM, pero si es el caso, el tren de pulsos PWM debe ser de una frecuencia por lo menos 10 veces la frecuencia más alta que se quiera generar en la señal final, y dado que se pretende generar señales de video, estaríamos hablando de una frecuencia de reloj del orden de los 200MHz (para una señal de 20MHz máximo), lo que si bien es posible, encarecería el diseño.
Me da la espina de que esto cambió con las ULA's de los 128K, y éstas son diseños digitales puros. Lo intuyo porque la generación de video en la ULA del 128K/+2 es RGBI, como la CGA. La circuitería externa a la ULA la convierte en RGB analógica. En este sentido, es más plausible un reemplazo "drop in" para una ULA de 128K/+2 gris que para una ULA de 48K.
En estas últimas (las ULA's de los 48K) podríamos ver dos tipos de diseño de aquí a poco: uno 100% digital, que invalide la señal de video que genera el Spectrum habitualmente, para dar paso a una señal RGB analógica, que tendría que salir hacia afuera por algún tipo de conector, cable o lo que fuera, hecho aposta. También podrían aparecer diseños con componentes adicionales que convirtieran la señal RGBI digital en YUV analógica, para tener un reemplazo realmente directo.
El propio Chris Smith realizó un reemplazo funcionalmente idéntico a la ULA original con una CPLD XL95144 de Xilinx. No sé si llegará a dar el código fuente de esa implementación, pero si lo hizo, sencillamente es que se puede conseguir
->
http://www.zxdesign.info/cpld/