flopping escribió:Bueno ya nos contaras esos proyectos conforme se vayan haciendo realidad, que yo tambien le tengo unas ganas a mis placas que no veas
A colación de los proyectos e incluso de lo que hemos estado hablando sobre el video en el Spectrum...
Resulta que me he entretenido en pasar el esquemático del Harlequin Superfo (la parte que sería digamos, la ULA) a una descripción en Verilog. Con la descripción hecha ya puedo ver cronogramas en pantalla como si tuviera la placa montada.
Para probar esta "ULA" le he puesto una "memoria" que siempre entrega el mismo dato: 10101010b , y he precargado en el registro que guarda el valor del borde, el valor 7.
Con eso puedo "ver" qué pasa por la pantalla en cada momento: si es "border" la ULA sacará el valor 7 por la salida RGB, si es paper, sacará el valor 101b (5), y si es "ink" (pixel encendido) sacará el valor 010b (2).
Dado que la memoria saca el mismo valor para la parte de píxeles como para la parte de atributos, el efecto que se vería en pantalla, si esta ULA estuviera conectada a una tele, es una trama de rayas verticales desde arriba hasta abajo, alternando rojo y celeste, con el borde blanco, y con el flash activado. Algo así (aquí el flash no se percibe):

El cronograma obtenido es el siguiente (si no se ve completo, botón derecho al gráfico y elegir "Ver imagen"):

Cubre una línea de video completa. Hay dos marcas que enmarcan este cronograma, desde el inicio de un pulso horizontal, hasta el inicio del siguiente pulso horizontal. La distancia, 63,9999us (64us es la duración nominal de una línea)
La línea marcada como RGB muestra el color que se vería en cada punto de la pantalla dentro de esa línea. Durante los periodos de blanking, es decir, cuando el rayo no está pintando la pantalla y está "volviendo" de derecha a izquierda, se ve que el valor de RGB es 0. Cuando está pintando el borde izquierdo o derecho, es 7. En medio de esos dos bloques que son los bordes izquierdo y derecho hay una zona "borrosa" donde no se percibe qué color es el que se está viendo. Basta hacer un poco de zoom, por ejemplo, a los primeros píxeles pegados al borde izquierdo para ver mejor qué pasa ahí...

CLK7 es el reloj de pixel. A cada período de esta señal, se pinta un nuevo pixel, sea de paper, ink, border, o "nada".
HC es un contador de píxeles. Cuenta desde 0 hasta 447 inclusive. Las primeras 256 cuentas son los píxeles que van en el área de pantalla correspondiente al "paper". La figura muestra precisamente los primeros 15 o 20 píxeles de esta zona.
VA es la dirección de memoria que la ULA está leyendo en este momento. Para la ULA, la memoria no va desde 16384 en adelante, sino desde 0 en adelante. Así, la dirección 256 que aparece, es en realidad la dirección 16640 de la CPU. Lo que estamos viendo pues es la generación de la segunda línea de la pantalla. Tras el 256 hay un 6144 que se corresponde con la dirección 22528, es decir, donde se almacena el atributo para este scan. Justo después se leen los 8 siguientes píxeles (dirección 257) y el atributo que le corresponde a esos píxeles (dirección 6145). Las zonas en azul marcadas como Z son espacios de tiempo en los que la ULA no accede a la memoria de video.
Quien determina que lo que se lee de memoria es bitmap o atributo son las señales AL1 y AL2. Por otra parte, la señal OutLatch indica cuando se empieza a enviar a pantalla la siguiente trama de 8 píxeles.
El "pistoletazo de salida" para dejar de generar el borde y comenzar a generar el "paper" lo da la señal Vout. Cuando pasa a nivel bajo (coincidiendo con OutLatch) vemos que la señal RGB deja de enviar el 7 (color de borde) para empezar a enviar píxeles en rojo (2) y celeste (5). Esa secuencia de 2 y 5 es lo que se veía borroso en la imagen anterior.
Una de las cosas que me está permitiendo ver este cronograma es que hay diferencias respecto a la ULA de Sinclair. De momento veo que el borde izquierdo, que debería durar hasta el pixel 15 inclusive, aquí llega hasta la mitad del pixel 10. Esto hace que el borde izquierdo en lugar de tener 48 píxeles de grosor tenga 43 píxeles, y por tanto el borde derecho tenga unos 53 píxeles en lugar de 48. No es algo molesto, pero me p regunto si afectará al mecanismo de contención y a los T-states que se supone que deben ocurrir desde una interrupción hasta el comienzo del proceso de lectura de memoria.
Para ello, podemos sacar otro cronograma que muestre el tiempo desde que ocurre una interrupción hasta que comienza a leerse la VRAM...
Medimos desde que ocurre el flanco de bajada de la interrupción del retrazo vertical...

Hasta que ocurre la primera contención en el acceso a memoria, indicada porque la señal ContEn pasa a nivel bajo:

La diferencia entre los tiempos medidos es de 4096.03866 microsegundos. Medido en ciclos de reloj de pixel, suponen 4096.03866 x 7 = 28672.27062 ciclos de reloj de pixel. Un ciclo de reloj de la CPU cubre dos ciclos de reloj de pixel, así que dividimos entre 2 para obtener finalmente 14336.13531 ciclos (en realidad esto deben ser ciclos "enteros", no valen decimales, así que el resultado real es 14336). Esto coincide con la información que se muestra en esta página:
http://scratchpad.wikia.com/wiki/Contended_memoryLa misma página indica que cuando ocurre un acceso en este ciclo 14336, el mismo es retrasado 6 ciclos (de CPU) de reloj.
Como podemos ver en esta sección del cronograma...

La duración de la señal de contención (ContEn = 0) es de 1714.272ns, lo que equivalen a 12 ciclos de reloj de pixel. Y esto significa la mitad de ciclos de CPU, es decir, 6 ciclos de espera (como máximo). También coincide

Por otra parte, el tiempo en que no hay contención (ContEn = 1) es de 4 ciclos de pixel, es decir, 2 ciclos de CPU (quizás no se vea en el cronograma y tengais que darle como dije al principio para verlo aparte). Esto también coincide con lo que dice el documento, en el que habla de 2 ciclos en los que no hay contención.
Con estas medidas, y a falta de hacer algunas un poco más sofisticadas, creo que tengo una descripción bastante fidedigna de esta ULA.
Gracias a estos cronogramas he podido ver que hay algunas inconsistencias "menores" tales como que la anchura del primer píxel y del último pixel son diferentes que el resto de píxeles. No sé si es que yo me he equivocado al escribir la descripción en Verilog, o si realmente es así. En mi caso lo he resuelto desplazando medio ciclo de reloj la señal Vout a la izquierda, lo que he conseguido intercalando un inversor en la entrada de reloj del biestable U19B para que éste se dispare con el flanco negativo en lugar del positivo.
Antes, con la descripción supuestamente igual a la del esquema, obtenía este comportamiento en el primer pixel (el que vale 2 después de la secuencia de píxeles con valor 7):

Se ve que es la mitad de ancho que los que le siguen. Analogamente, el último pixel es una vez y media más ancho que los que le preceden:

Hasta que no tenga el circuito real no podré saber con seguridad si esto es error mío, o está así en el circuito. En caso de que estuviera así en el circuito, creo que puede arreglarse implementando el inversor que necesitamos con alguna de las puertas sobrantes de U30 (4 puertas XOR de las que sólo usamos 1 ó 2)