No se puede descifrar VGA [Verilog]

Después de investigar mucho sobre cómo generar señales VGA y mirar algunos ejemplos de código, intenté escribir mi generador de señal VGA simple que solo muestra un solo color sólido en la pantalla. Al ver la simulación, el tiempo parece ser correcto. Cuando se conecta a un monitor, el monitor ni siquiera reconoce que se está generando una señal. Esto me ha dejado perplejo, cualquier ayuda sería apreciada.

Estoy usando la información de tiempo que se encuentra aquí: http://tinyvga.com/vga-timing/640x480@60Hz

Generador de pulsos de sincronización:

module VGASyncPulseGenerator(
    input clk, //50Mhz input clock
    input rst,
    output HS, VS, //Sync Pulses
    output active //High when active area is being drawn
);

localparam HS_START = 16; // hSync start (end of front porch)
localparam HS_END = 16 + 96; // hSync end (start of back porch)
localparam HA_START = 16 + 96 + 48; // end of back porch
localparam LINE = 800; // Length of entire line;

localparam VS_START = 480 + 10; // vSync start (end of front porch)
localparam VS_END = 6480 + 10 + 2; // vSync end (start of back porck)
localparam VA_START = 0;
localparam FRAME = 525; // Length of entire frame

reg [10:0] hPos = 0;
reg [10:0] vPos = 0;

reg pixelStrobe = 0;

assign HS = ~((hPos >= HS_START) & (hPos < HS_END));
assign VS = ~((vPos >= VS_START) & (vPos < VS_END));

assign active = (hPos >= HA_START) & (vPos >= VA_START);

always @(posedge clk) begin //generate pixel clock at 25MHz
    pixelStrobe = ~pixelStrobe;
end

always @(posedge clk) begin
    if (pixelStrobe) begin
        if (hPos == LINE) begin
            hPos <= 0;
            vPos <= vPos + 1;
        end else hPos <= hPos + 1;
        if (vPos == FRAME) vPos <= 0;
    end
end



endmodule

Módulo superior:

module VGATest(
    input clk, rst,
    output HS, VS,
    output [4:0] B,
    output [5:0] R,
    output [4:0] G
);

wire active;

assign R = (active) ? 5'd1 : 5'b0;
assign G = (active) ? 4'd16 : 4'b0;
assign B = (active) ? 4'd1 : 4'b0;

VGASyncPulseGenerator pulseGen(clk, rst, HS, VS, active);

módulo final

La gente querrá saber en qué hardware estás trabajando. Algunos microcontroladores y similares no tienen sincronización estelar. Monitoree también en caso de que el estándar VGA con el que se construyó sea relevante de alguna manera.
Al diseñar y depurar firmware/RTL para interactuar con el hardware, hay señales que deben tener cierta forma, nivel y tiempo. Es costumbre mostrar las señales en el osciloscopio, para asegurarse de que su código esté haciendo lo correcto. ¿Qué osciloscopio usa y puede publicar imágenes de sus rastros de sincronización RGB?
Parece que los bucles LINE y FRAME son 1 demasiado largos. Por ejemplo, 0 a 800 son 801 ciclos. También creo que VS podría estar equivocado, pero un diagrama de tiempo de su simulación ayudaría a aclararlo. Además, para una implementación física, debe registrar HS y VS; de lo contrario, podrían tener fallas.
Parece que no tiene porches adecuados ya que está usando la misma condición que un borde de sincronización para enmascarar la región activa
He estado generando datos VGA utilizando una placa FPGA con un chip controlador HDMI y hubo un apretón de manos inicial entre el controlador y el monitor a través de la interfaz IIC. ¿Quizás esto es lo que te estás perdiendo?

Respuestas (2)

Problemas que veo en tu código:

  • 640x480@60 utiliza un reloj de píxeles de 25,175 MHz, no 25 MHz. La diferencia puede ser suficiente para evitar que algunos monitores se sincronicen. Considere usar un PLL para generar el reloj apropiado (50 MHz x72 ÷ 143 da 25,1748 MHz, que está dentro de 9 ppm), o en su lugar apuntar a 800x600@72, que usa un reloj de píxeles de exactamente 50 MHz.

  • La polaridad de sus pulsos de sincronización es incorrecta. 640x480@60 usa pulsos de sincronización negativos, HSy VSdebe ser bajo durante la sincronización, no alto.

  • Hay un error tipográfico en la definición de VS_END. Probablemente quieras usar la constante 480, no 6480.

Posibles problemas fuera de su código:

  • ¿Tiene un archivo de restricciones apropiado? ¿Las señales se asignan a los pines correctos para llegar al DAC?

  • Asegúrate de que tus niveles sean los correctos. R/G/B son de 0 a 0,7 V; los voltajes de sincronización no son críticos, pero probablemente deberían ser de 3.3V.

Estoy usando una placa Alinx AX516 y el archivo de restricciones se escribió en función de la documentación proporcionada. Cambié los parámetros de temporización a 800x600@72Hz, pero el problema persiste. También arreglé un error que encontré en la asignación de activo.

Entonces, después de volver a esto, parecería que el archivo UCF en mi proyecto no se estaba usando por alguna razón. Esta era la razón por la que el módulo no funcionaba.