solo por diversión y mientras espero que lleguen otros componentes, quiero crear un video compuesto a partir del hardware disponible. Así que por favor, no hay sugerencias para sólo por una hélice.
Hardware disponible:
- Cuarz de 16MHz (y 4MHz si eso ayuda)
- un grupo de entradas 2/3/4 y / o / xor / nand / nor / nxor gates (74AHCxx ICs)
- algunos latches, buffers, contadores de 4 bits, flip-flops, sram, mux (74AHCxx ICs)
- muchos resistores, muchos LEDs, algunos monitores, pocos diodos
Estaba pensando en usar los contadores de 4 bits y un comparador como entrada de reloj para una máquina de estados. Como primera versión, el estado incluiría el recuento de la siguiente señal y la salida a la salida de video (0V, 0.3V, 07V). Así que básicamente una lista de (duración, salida) para un patrón de tablero de ajedrez codificado o algo así. La segunda generación podría utilizar el sram para obtener datos de píxeles para una imagen.
Con un reloj de 16 MHz, no podré acertar exactamente en el tiempo para el video compuesto. Pero, ¿debería estar lo suficientemente cerca para que un monitor lo entienda? ¿O es la idea completamente loca?
Esto es lo que descubrí hasta ahora. Un video compuesto PAL se compone de las siguientes partes (recuento de ciclos de 16MHz en []):
-
intervalo de supresión vertical: 20x 64us
- pulso de ecualización previa: 6x 32us
- 2.2us - 2.4us @ 0.0V [35.2 - 38.4 = 37]
- 29.8us - 29.6us @ 0.3V [476.8 - 473.6 = 475]
- pulso de igualación: 6x 32us
- 27.4us - 27.2us @ 0.0V [438.4 - 435.2 = 437]
- 4.6us - 4.8us @ 0.3V [73.6 - 76.8 = 75]
- pulso de ecualización posterior: 6x 32us
- 2.2us - 2.4us @ 0.0V [35.2 - 38.4 = 37]
- 29.8us - 29.6us @ 0.3V [476.8 - 473.6 = 475]
- líneas negras: 11x 64us
- vea las líneas de píxeles a continuación pero con negro (0.3V)
- pulso de ecualización previa: 6x 32us
-
campo impar: 312 líneas @ 64us cada una
- pre en blanco: 1.5us @ 0.3V [24]
- hsync: 4.7us @ 0.0V [75]
- publicación en blanco: 5.8us @ 0.3V [93]
- Datos de píxeles: agregando bordes negros para obtener 768 píxeles (256 * 3)
- datos previos: 2.0us @ 0.3V [32]
- datos de píxeles: 48.0us @ 0.3-1.0V [768]
- datos de publicación: 2.0us @ 0.3V [32]
-
media línea: 1x 32us
- como datos de píxeles, pero 320 ciclos de negro (32 + 256 + 32)
- intervalo de supresión vertical: 20x 64us
- media línea: 1x 32us
- campo par: 312 líneas @ 64us cada una
Básicamente estoy pensando en hacer 3 bucles anidados.
-
El bucle más interno es solo un retardo para dormir durante X ciclos. Donde X son los ciclos anteriores. Estoy dividiendo 437, 475 y 768 en varios elementos de 256 y el resto, así que solo necesito retrasos de 8 bits: 24, 32, 37, 75, 93, 181, 219 y 256. Esos se pueden hacer con 2 contadores de 4 bits.
-
El bucle medio es más una colección de máquinas de estado lineales. Cada uno tiene un estado de inicio y el siguiente estado siempre es el estado + 1 hasta que llega a un estado final. Cada estado define un retraso (programando el bucle más interno) y la salida para la salida de video. Los 2 contadores de 4 bits proporcionan la señal de reloj para estas máquinas de estado. Las máquinas de estado recopiladas son: pulso de ecualización, pulso de ecualización pre / post, línea media, línea vsync, línea de píxeles para un total de 32 estados (incluidos 4 no válidos). La línea de píxeles, por ejemplo, se ve así:
state | count | end state | output | function ----- | ----- | --------- | ------ | -------- 24 | 24 | | 0.3V | pre blank 25 | 75 | | 0.0V | hsync 26 | 93 | | 0.3V | post blank 27 | 32 | | 0.3V | pre pixel 28 | 256 | | 0.3-1V | pixel 0 - 255 29 | 256 | | 0.3-1V | pixel 256 - 511 30 | 256 | | 0.3-1V | pixel 512 - 767 31 | 32 | 1 | 0.3V | post pixel
Puedo usar un contador de 4 bits aquí. 15 es un estado final y 16 es el comienzo de la siguiente máquina de estados, por lo que el quinto bit es estático y puedo obtenerlo del bucle externo.
-
El bucle más externo tiene una lista de máquinas de estado y con qué frecuencia se debe ejecutar cada una antes de pasar al siguiente estado y forma un campo completo (dos medias tramas) y luego se repite:
Meta | State | Loop | Function -----+-------+------+--------- 0 | 5 | 6 | pre equalizing pulse 1 | 0 | 6 | equalizing pulse 2 | 5 | 6 | post equalizing pulse 3 | 16 | 11 | vsync line 4 | 24 | 104 | pixel line (odd) 5 | 24 | 104 | pixel line (odd) 6 | 24 | 104 | pixel line (odd) 7 | 8 | 1 | half line 8 | 5 | 6 | pre equalizing pulse 9 | 0 | 6 | equalizing pulse 10 | 5 | 6 | post equalizing pulse 11 | 16 | 11 | black line (v sync intervall) 12 | 8 | 1 | half line 13 | 24 | 104 | pixel line (even) 14 | 24 | 104 | pixel line (even) 15 | 24 | 104 | pixel line (even)
Aquí necesito 3 contadores de 4 bits. Uno para el estado meta y 2 combinados como un contador de bucle de 8 bits.
En general obtengo potencialmente 768 x 624 píxeles con un borde negro de 32 píxeles a la izquierda y a la derecha. Al faltar un eprom, ahora tengo que descubrir los términos mínimos para todos los estados, conteos de bucles, conteo, finalización y salida de video para poder cablearlos con puertas.
Generando niveles de salida:
El uso de una resistencia de 1k Ohm y 470 Ohm combinada con los 75 Ohm que se supone que tiene el compuesto proporciona niveles casi perfectos para sincronización, blanco y negro e incluso tiene un nivel de gris:
Signal | Sync | Output
0 V | 0 V | 0 V
0 V | 5 V | 0.30 V
5 V | 0 V | 0.64 V
5 V | 5 V | 0.95 V
Las matemáticas funcionan muy bien. Pero no estoy seguro si necesito proporcionar una resistencia de 75 ohmios o si el monitor proporciona eso. Google encontró dos diseños posibles. ¿Cuál es correcto?
PD: agregaré más esquemas a medida que se desarrollen.