go-board-code/vga_image_renderer_top.v

203 lines
5.4 KiB
Verilog

module VGAImageRenderer_Top(
input i_Clk,
output o_VGA_HSync,
output o_VGA_VSync,
output o_VGA_Red_0,
output o_VGA_Red_1,
output o_VGA_Red_2,
output o_VGA_Grn_0,
output o_VGA_Grn_1,
output o_VGA_Grn_2,
output o_VGA_Blu_0,
output o_VGA_Blu_1,
output o_VGA_Blu_2
);
localparam TOTAL_COLUMNS = 800;
localparam TOTAL_ROWS = 525;
localparam ACTIVE_COLUMNS = 640;
localparam ACTIVE_ROWS = 480;
localparam VIDEO_WIDTH = 3;
wire w_HSync_FromPulseGenerator, w_VSync_FromPulseGenerator;
wire w_HSync_FromImageRenderer, w_VSync_FromImageRenderer;
wire w_HSync_FromPorchSync, w_VSync_FromPorchSync;
wire [2:0] w_Red_FromImageRenderer, w_Green_FromImageRenderer, w_Blue_FromImageRenderer;
wire [2:0] w_Red_FromPorchSync, w_Green_FromPorchSync, w_Blue_FromPorchSync;
VGA_Sync_Pulse_Generator #(
.TOTAL_COLUMNS(TOTAL_COLUMNS),
.TOTAL_ROWS(TOTAL_ROWS),
.ACTIVE_COLUMNS(ACTIVE_COLUMNS),
.ACTIVE_ROWS(ACTIVE_ROWS)
) pulseGenerator (
.i_Clk(i_Clk),
.o_HSync(w_HSync_FromPulseGenerator),
.o_VSync(w_VSync_FromPulseGenerator),
.o_rawX(),
.o_rawX()
);
VGAImageRenderer imageRenderer (
.i_Clk(i_Clk),
.i_HSync(w_HSync_FromPulseGenerator),
.i_VSync(w_VSync_FromPulseGenerator),
.o_HSync(w_HSync_FromImageRenderer),
.o_VSync(w_VSync_FromImageRenderer),
.o_Red(w_Red_FromImageRenderer),
.o_Green(w_Green_FromImageRenderer),
.o_Blue(w_Blue_FromImageRenderer)
);
wire w_HSync_FromImageDimmer, w_VSync_FromImageDimmer;
wire [2:0] w_Red_FromImageDimmer, w_Green_FromImageDimmer, w_Blue_FromImageDimmer;
ImageMovingSpotlight imageDimmer (
.i_Clk(i_Clk),
.i_HSync(w_HSync_FromImageRenderer),
.i_VSync(w_VSync_FromImageRenderer),
.i_Red(w_Red_FromImageRenderer),
.i_Green(w_Green_FromImageRenderer),
.i_Blue(w_Blue_FromImageRenderer),
.o_HSync(w_HSync_FromImageDimmer),
.o_VSync(w_VSync_FromImageDimmer),
.o_Red(w_Red_FromImageDimmer),
.o_Green(w_Green_FromImageDimmer),
.o_Blue(w_Blue_FromImageDimmer)
);
VGA_Add_Porches_To_Output #(
.VIDEO_WIDTH(VIDEO_WIDTH),
.TOTAL_COLUMNS(TOTAL_COLUMNS),
.TOTAL_ROWS(TOTAL_ROWS),
.ACTIVE_COLUMNS(ACTIVE_COLUMNS),
.ACTIVE_ROWS(ACTIVE_ROWS)
) PorchOutput (
.i_Clk(i_Clk),
.i_HSync(w_HSync_FromImageDimmer),
.i_VSync(w_VSync_FromImageDimmer),
.i_Red(w_Red_FromImageDimmer),
.i_Green(w_Green_FromImageDimmer),
.i_Blue(w_Blue_FromImageDimmer),
.o_HSync(w_HSync_FromPorchSync),
.o_VSync(w_VSync_FromPorchSync),
.o_Red(w_Red_FromPorchSync),
.o_Green(w_Green_FromPorchSync),
.o_Blue(w_Blue_FromPorchSync)
);
assign o_VGA_HSync = w_HSync_FromPorchSync;
assign o_VGA_VSync = w_VSync_FromPorchSync;
assign o_VGA_Red_0 = w_Red_FromPorchSync[0];
assign o_VGA_Red_1 = w_Red_FromPorchSync[1];
assign o_VGA_Red_2 = w_Red_FromPorchSync[2];
assign o_VGA_Grn_0 = w_Green_FromPorchSync[0];
assign o_VGA_Grn_1 = w_Green_FromPorchSync[1];
assign o_VGA_Grn_2 = w_Green_FromPorchSync[2];
assign o_VGA_Blu_0 = w_Blue_FromPorchSync[0];
assign o_VGA_Blu_1 = w_Blue_FromPorchSync[1];
assign o_VGA_Blu_2 = w_Blue_FromPorchSync[2];
endmodule
module ImageMovingSpotlight(
input i_Clk,
input i_HSync,
input i_VSync,
input [2:0] i_Red,
input [2:0] i_Green,
input [2:0] i_Blue,
output reg o_HSync,
output reg o_VSync,
output reg [2:0] o_Red,
output reg [2:0] o_Green,
output reg [2:0] o_Blue
);
parameter VIDEO_WIDTH = 3;
parameter TOTAL_COLUMNS = 800;
parameter TOTAL_ROWS = 525;
wire w_HSync, w_VSync;
wire [$clog2(TOTAL_COLUMNS)-1:0] w_X;
wire [$clog2(TOTAL_ROWS)-1:0] w_Y;
reg [$clog2(12500000)-1:0] r_counter = 0;
reg [VIDEO_WIDTH-1:0] r_Red = 0;
reg [VIDEO_WIDTH-1:0] r_Green = 0;
reg [VIDEO_WIDTH-1:0] r_Blue = 0;
reg [$clog2(TOTAL_COLUMNS)-1:0] r_currentX = 4;
reg [$clog2(TOTAL_ROWS)-1:0] r_currentY = 3;
VGA_Current_Beam_Position #(
.TOTAL_COLUMNS(TOTAL_COLUMNS),
.TOTAL_ROWS(TOTAL_ROWS)
) CurrentPosition (
.i_Clk(i_Clk),
.i_HSync(i_HSync),
.i_VSync(i_VSync),
.o_HSync(w_HSync),
.o_VSync(w_VSync),
.o_X(w_X),
.o_Y(w_Y)
);
wire [6:0] w_CellX;
wire [5:0] w_CellY;
assign w_CellX = w_X[9:3];
assign w_CellY = w_Y[9:3];
always @(posedge i_Clk) begin
if (r_counter == 25000000/16) begin
r_counter <= 0;
if (r_currentX == 80 - 1) begin
r_currentX <= 0;
end else begin
r_currentX <= r_currentX + 1;
end
end else begin
r_counter <= r_counter + 1;
end
end
always @(posedge i_Clk) begin
o_HSync <= w_HSync;
o_VSync <= w_VSync;
// if the pointer is right on the square, white
// if the pointer is within a square, brighten by {[0, 1], 1}
// otherwise return the current red
o_Red <= r_Red;
o_Green <= r_Green;
o_Blue <= r_Blue;
r_Red <= (r_currentX == w_CellX && r_currentY == w_CellY) ? 7 : i_Red;
r_Green <= (r_currentX == w_CellX && r_currentY == w_CellY) ? 7 : i_Green;
r_Blue <= (r_currentX == w_CellX && r_currentY == w_CellY) ? 7 : i_Blue;
/*
(r_currentX > 0 && w_X == r_currentX - 1 && r_currentY == w_Y) ? {i_Red[0:1], 1} :
(r_currentX < TOTAL_COLUMNS - 2 && w_X == r_currentX + 1 && r_currentY == w_Y) ? {i_Red[0:1], 1} :
(r_currentY > 0 && w_Y == r_currentY - 1 && r_currentX == w_X) ? {i_Red[0:1], 1} :
(r_currentY < TOTAL_ROWS - 2 && w_Y == r_currentY + 1 && r_currentX == w_X) ? {i_Red[0:1], 1} : i_Red;
*/
end
endmodule