203 lines
5.4 KiB
Verilog
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
|