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
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, HS
y VS
debe 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.
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.
KH
Ale..chenski
HKOB
chris stratton
nazar