No se puede entender VGA [Verilog]

1

Después de investigar mucho sobre cómo generar señales VGA y observar algunos ejemplos de código, intenté escribir un simple generador de señales VGA que solo muestra un color sólido en la pantalla. Al ver la simulación, el tiempo parece ser correcto. Cuando está conectado 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 utilizando la información de tiempo que se encuentra aquí: enlace

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);

endmodule

    
pregunta Eli Lorden

2 respuestas

3

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 apuntar a 800x600 @ 72, que usa un reloj de píxeles de exactamente 50 MHz.

  • La polaridad de tus pulsos de sincronización es incorrecta. 640x480 @ 60 utiliza pulsos de sincronización negativos: HS y VS deben ser bajos durante la sincronización, no altos.

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

Posibles problemas fuera de tu código:

  • ¿Tiene un archivo de restricciones apropiado? ¿Se están asignando las señales a los pines correctos para llegar al DAC?

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

respondido por el duskwuff
0

Luego de volver a esto, parece que el archivo UCF en mi proyecto no se estaba usando por alguna razón. Esta fue la razón por la que el módulo no estaba funcionando.

    
respondido por el Eli Lorden

Lea otras preguntas en las etiquetas