FPGA VGA driver not working

fpgaverilogvgavideoxilinx

I am not really sure what is wrong with my code bellow for a vga. All I want the program to do is display a solid color on the monitor. I want to use the switches on my card to change the color displayed. I ran the simulation and all the hsync and vsync signals seem to be as expected. When I flick the switches I get a short pulse of color on the display and then it goes black. Anyone know what is wrong with this code?

module vga(output reg [3:0] red, green, blue,
           input [15:0] sw,
           output hsync, vsync, 
           input clk);
    wire vga_clk; //25.203 Mhz
    vga_clk_gen gen(.clk_in1(clk), .clk_out1(vga_clk));

    reg [9:0] hpx = 0, vpx = 0;
    reg [9:0] next_hpx, next_vpx;
    reg [3:0] next_red, next_green, next_blue;

    assign hsync = !(hpx >= 660 && hpx <= 756);
    assign vsync = !(vpx >= 494 && vpx <= 495);

    always @(posedge vga_clk) begin
        hpx <= next_hpx;
        vpx <= next_vpx;
        red <= next_red;
        green <= next_green;
        blue <= next_blue;
    end

    always @* begin
        next_red = sw[3:0];
        next_blue = sw[7:4];
        next_green = sw[11:8];
        next_vpx = vpx;

        if(hpx == 800) begin
            next_hpx = 0;
            if(vpx == 525)
                next_vpx = 0;
            else
                next_vpx = vpx + 1;
        end else begin
            next_hpx = hpx + 1;
        end
    end
endmodule

Best Answer

The VGA signal must be blanked (outputting black) while hsync or vsync are active. Many monitors will use the signal levels during sync periods to calibrate a "black level", which would lead to the behavior you're describing.

Related Topic