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