Fixed VGA using the wrong pixel stretch size, and using the wrong pixel data from memory.
diff --git a/verilog/dv/video/video.c b/verilog/dv/video/video.c index 3e09c5e..8c2379f 100644 --- a/verilog/dv/video/video.c +++ b/verilog/dv/video/video.c
@@ -166,11 +166,11 @@ wbWrite (VGA_SRAM + 2, testPixel2); wbWrite (VGA_SRAM + 3, testPixel3); - wbWrite (VGA_SRAM + 8, testPixel0); - wbWrite (VGA_SRAM + 9, testPixel1); - wbWrite (VGA_SRAM + 10, testPixel2); - wbWrite (VGA_SRAM + 11, testPixel3); - wbWrite (VGA_SRAM + 12, testPixel0); + wbWrite (VGA_SRAM + 0x10, testPixel0); + wbWrite (VGA_SRAM + 0x11, testPixel1); + wbWrite (VGA_SRAM + 0x12, testPixel2); + wbWrite (VGA_SRAM + 0x13, testPixel3); + wbWrite (VGA_SRAM + 0x14, testPixel0); // Make sure some of the data has been written properly // Don't bother testing everything as that would take even longer
diff --git a/verilog/rtl/Video/VGA_top.v b/verilog/rtl/Video/VGA_top.v index bf4a86e..7442157 100644 --- a/verilog/rtl/Video/VGA_top.v +++ b/verilog/rtl/Video/VGA_top.v
@@ -339,8 +339,8 @@ reg fetchPixelData; reg loadPixelData; - reg[1:0] hsyncDelay; - reg[1:0] vsyncDelay; + reg[2:0] hsyncDelay; + reg[2:0] vsyncDelay; reg[31:0] currentPixelData; always @(posedge vga_clk) begin if (rst || !enableOutput) begin @@ -351,24 +351,22 @@ end else begin loadPixelData <= fetchPixelData; if (loadPixelData) currentPixelData <= vga_data; - hsyncDelay <= { hsyncDelay[0], hsync }; - vsyncDelay <= { vsyncDelay[0], vsync }; + hsyncDelay <= { hsyncDelay[1:0], hsync }; + vsyncDelay <= { vsyncDelay[1:0], vsync }; end end assign vga_fetchData = fetchPixelData; - assign vga_hsync = enableOutput ? hsyncDelay[1] : 1'b1; - assign vga_vsync = enableOutput ? vsyncDelay[1] : 1'b1; + assign vga_hsync = enableOutput ? hsyncDelay[2] : 1'b1; + assign vga_vsync = enableOutput ? vsyncDelay[2] : 1'b1; // VGA pixel address select - reg[17:0] raw_directPixelCounter; - reg[17:0] raw_directPixelCounter_d; - wire[17:0] raw_nextDirectPixelCounter = raw_directPixelCounter + 1; - reg[8:0] raw_horizontalPixelCounter; + wire[8:0] raw_nextHorizontalPixelCounter = raw_horizontalPixelCounter + 1; reg[9:0] raw_verticalPixelCounter; reg[2:0] raw_subPixelCounter; + reg[2:0] raw_subPixelCounter_buffered; reg[8:0] raw_horizontalPixelCounter_d; reg[9:0] raw_verticalPixelCounter_d; @@ -381,12 +379,17 @@ reg[3:0] raw_verticalPixelStretchCounter_d; wire[3:0] raw_nextVerticalPixelStretchCounter = raw_verticalPixelStretchCounter + 1; - wire raw_horizontalPixelStretchNextPixel = raw_horizontalPixelStretchCounter == horizontalPixelSize; - wire raw_verticalPixelStretchNextPixel = raw_verticalPixelStretchCounter == verticalPixelSize; + reg[17:0] raw_directPixelCounterVertical; + reg[17:0] raw_directPixelCounterVertical_d; + + wire[17:0] raw_directPixelCounter = raw_directPixelCounterVertical_d + raw_horizontalPixelCounter_d; + + wire raw_horizontalPixelStretchNextPixel = raw_nextHorizontalPixelStretchCounter == horizontalPixelSize; + wire raw_verticalPixelStretchNextPixel = raw_nextVerticalPixelStretchCounter == verticalPixelSize; // Raw draw mode always @(*) begin - raw_directPixelCounter_d = raw_directPixelCounter; + raw_directPixelCounterVertical_d = raw_directPixelCounterVertical; raw_subPixelCounter_d = raw_subPixelCounter; raw_horizontalPixelCounter_d = raw_horizontalPixelCounter; raw_horizontalPixelStretchCounter_d = raw_horizontalPixelStretchCounter; @@ -394,7 +397,7 @@ raw_verticalPixelStretchCounter_d = raw_verticalPixelStretchCounter; if (rst || !enableOutput || !inVerticalVisibleArea) begin - raw_directPixelCounter_d = 18'b0; + raw_directPixelCounterVertical_d = 18'b0; raw_subPixelCounter_d = 3'b0; raw_horizontalPixelCounter_d = 9'b0; raw_horizontalPixelStretchCounter_d = 4'b0; @@ -405,8 +408,7 @@ if (raw_horizontalPixelStretchNextPixel) begin if (raw_subPixelCounter == MAX_SUB_PIXEL_VALUE) begin raw_subPixelCounter_d = 3'b0; - raw_horizontalPixelCounter_d = raw_horizontalPixelCounter + 1; - raw_directPixelCounter_d = raw_nextDirectPixelCounter; + raw_horizontalPixelCounter_d = raw_nextHorizontalPixelCounter; end else begin raw_subPixelCounter_d = raw_subPixelCounter + 1; end @@ -421,10 +423,9 @@ raw_horizontalPixelStretchCounter_d = 4'b0; end - if (isEndHorizontalWholeLine) begin - raw_directPixelCounter_d = raw_nextDirectPixelCounter; - + if (isEndHorizontalVisibleArea) begin if (raw_verticalPixelStretchNextPixel) begin + raw_directPixelCounterVertical_d = raw_directPixelCounterVertical + raw_nextHorizontalPixelCounter; raw_verticalPixelCounter_d = raw_verticalPixelCounter + 1; raw_verticalPixelStretchCounter_d = 4'b0; end else begin @@ -436,25 +437,26 @@ always @(posedge vga_clk) begin if (rst || !enableOutput) begin - raw_directPixelCounter <= 18'b0; + raw_directPixelCounterVertical <= 18'b0; raw_horizontalPixelCounter <= 9'b0; raw_verticalPixelCounter <= 10'b0; raw_subPixelCounter <= 3'b0; raw_horizontalPixelStretchCounter <= 4'b0; raw_verticalPixelStretchCounter <= 4'b0; end else begin - raw_directPixelCounter <= raw_directPixelCounter_d; + raw_directPixelCounterVertical <= raw_directPixelCounterVertical_d; raw_horizontalPixelCounter <= raw_horizontalPixelCounter_d; raw_verticalPixelCounter <= raw_verticalPixelCounter_d; raw_subPixelCounter <= raw_subPixelCounter_d; + raw_subPixelCounter_buffered <= raw_subPixelCounter; raw_horizontalPixelStretchCounter <= raw_horizontalPixelStretchCounter_d; raw_verticalPixelStretchCounter <= raw_verticalPixelStretchCounter_d; end end - wire raw_directPixelCounterChanged = raw_directPixelCounter != raw_directPixelCounter_d; wire raw_verticalPixelCounterChanged = raw_verticalPixelCounter != raw_verticalPixelCounter_d; wire raw_horizontalPixelCounterChanged = raw_horizontalPixelCounter != raw_horizontalPixelCounter_d; + wire raw_directPixelCounterChanged = raw_verticalPixelCounterChanged || raw_horizontalPixelCounterChanged; always @(*) begin if (rst || !enableOutput) begin @@ -476,7 +478,7 @@ // Directly use the pixel index to access memory // This better uses memory, but is also slightly more complex for the cpu to write to the frame buffer DRAW_MODE_RAW_TIGHT_MEM: begin - vga_address <= { raw_directPixelCounter_d[ADDRESS_BITS-1:0], 2'b00 }; + vga_address <= { raw_directPixelCounter[ADDRESS_BITS-1:0], 2'b00 }; fetchPixelData <= raw_directPixelCounterChanged; end @@ -509,7 +511,7 @@ reg[5:0] raw_currentPixel; always @(*) begin - case (raw_subPixelCounter) + case (raw_subPixelCounter_buffered) 4'h0: raw_currentPixel <= currentPixelData[5:0]; 4'h1: raw_currentPixel <= currentPixelData[11:6]; 4'h2: raw_currentPixel <= currentPixelData[17:12];