La pantalla de color sólido en VGA no funciona

Estoy tratando de hacer que VGA funcione en mi placa Altera DE0 usando Verilog, pero no he tenido mucha suerte. Tiene los mismos pines que una interfaz VGA normal, excepto que el rojo, el verde y el azul son de 4 bits cada uno. Aquí está la lógica que he estado tratando de usar para obtener un color sólido para mostrar:

module solid_color (clk, vga_h_sync, vga_v_sync, R, G, B);

input clk;
output vga_h_sync;
output vga_v_sync;
output [3:0] R;
output [3:0] G;
output [3:0] B;

reg [9:0] CounterX;
reg [8:0] CounterY;
wire CounterXmaxed = (CounterX==767);

always @(posedge clk)
if(CounterXmaxed)
  CounterX <= 0;
else
  CounterX <= CounterX + 1;

always @(posedge clk)
if(CounterXmaxed)
    CounterY <= CounterY + 1;

reg vga_HS, vga_VS;
always @(posedge clk)
begin
  vga_HS <= (CounterX[9:4]==0);   // active for 16 clocks
  vga_VS <= (CounterY==0);   // active for 768 clocks
end

assign vga_h_sync = ~vga_HS;
assign vga_v_sync = ~vga_VS;

assign R = 15;
assign G = 15;
assign B = 15;

endmodule

Cuando intento ejecutarlo, aparece un mensaje en el monitor que dice que este modo de visualización no es compatible.

Esto está adaptado de http://www.fpga4fun.com/PongGame.html . Sin embargo, esta versión afirma estar diseñada para pantallas de 640x480 mientras que mi monitor es de 1280x1024. ¿Es este el problema? Si es así, ¿cómo adaptaría esto para que se ajuste al tamaño aumentado del monitor? (el reloj que estoy usando es de 50 MHz)

EDITAR: agregué un módulo divisor de reloj de la siguiente manera para cambiar la señal de reloj inicial a 25 MHz:

module divide_clock_by_two(in_clk, out_clk);

input in_clk;
output out_clk;
reg out_clk;

always @(posedge in_clk)
out_clk <= ~out_clk;

endmodule

Sin embargo, el monitor ahora solo muestra una pantalla negra, ningún mensaje sobre un modo incorrecto.

Esa página dice "Usando un reloj de 25 MHz", por lo que debe reducir a la mitad el reloj o duplicar todos sus tiempos.
La entrada clk a ese módulo es un reloj de "píxeles", no un reloj del sistema. Debe proporcionar la frecuencia de reloj correcta para la resolución que está utilizando.
Intenté cambiar CounterX==767ay CounterX==1535a CounterX[9:4]para CounterX[9:5]duplicar los tiempos, pero esto no funcionó.
Majenko, ¿significaría esto cambiar los tiempos o cambiar el reloj de entrada? De acuerdo con esta página con tiempos de reloj de píxeles: tinyvga.com/vga-timing , necesitaría tener al menos un reloj de 108 MHz para controlar mi pantalla, pero esto no puede ser correcto porque he visto que la placa controla la pantalla con solo su reloj de 50 MHz en demostraciones.
No sé lo que está leyendo, pero veo: "VGA 640x480 @ 60 Hz Estándar de la industria (reloj de píxeles 25.175 MHz)" - esa es la velocidad del reloj que debe pasar a clk - o algo así (la mayoría de los monitores permiten un un poco de margen).
Estoy leyendo la sección debajo de 1280x1024, que es el monitor que tengo.
Esa es la resolución nativa de su monitor, y no es la única resolución a la que puede ejecutarlo. Admitirá muchas resoluciones por debajo de esa resolución, como cuando enciende su computadora por primera vez y se ejecuta en modo 640x400 (o similar). Si desea ejecutar a una resolución más alta (que no es necesario), tendrá que realizar grandes cambios en su tiempo.
Agregué un divisor de reloj hace un momento, mira la edición para más detalles.
¿Supongo que no tiene un alcance para poder verificar cómo se ve su sincronización?

Respuestas (1)

La mayoría de los monitores VGA "calibrarán la compensación de CC" si conduce las señales RGB fuera del área visible.

Si bien puede que no sea su único problema o incluso el más grave, parece ser un problema en su implementación (controla constantes), así que intente agregar lógica para llevar sus señales de color a negro cuando esté fuera del rectángulo de visualización previsto.

Estaba a punto de comentar que RG y B deben estar "apagados", es decir, puestos en negro, durante todos los períodos de supresión. Entonces leí tu respuesta :P
Ese era el problema. Cambié las asignaciones de R, G y B y ahora tengo un patrón. También agradezco a Majenko por el reloj de 25 MHz, ya que eso también era necesario.
Aunque, ¿cómo cambiaría esto por una exhibición constante de colores? En otras palabras, con estos contadores, ¿cómo reconocería las señales del reloj para dejar de conducir señales RGB?
Use la lógica en cada valor de conteo para determinar cuándo ese eje está dentro de la región de visualización.
Pero, ¿cómo determino cuál es la región de visualización? Tenía la impresión de que los contadores x e y ya se encargaron de eso al regresar cuando alcanzaron el valor máximo.
Debe mirar un diagrama de tiempo de las señales de video reales, pero en resumen, el haz solo está en la pantalla parte del tiempo; el resto está sobre escaneado o retrocediendo, y debe conducir en negro. Si obtiene algunos valores de "línea de modo" de una configuración de ventana X para Linux, verá los tiempos expresados ​​en términos de posibles relojes de puntos para X y líneas para Y; en lugar de cargarlos en registros VGA, necesitará algo similar para su diseño. Su lógica actual parece un poco incompleta.
Volviendo a esto, todavía no estoy seguro de cómo determinar exactamente cuándo es la parte de visualización del tiempo. Al principio pensé que podría ser cuando hsync y vsync no están activos, pero este no parece ser el caso.
Debe mirar algunas formas de onda del manual de un monitor de calidad anterior. O, como ya se sugirió, mire algunos modelos X11. Incluso la documentación de una señal de TV le daría un comienzo de comprensión, ya que aunque los valores son diferentes, los conceptos son básicamente los mismos.