143 lines
3.5 KiB
Verilog
143 lines
3.5 KiB
Verilog
module PongRunner (
|
|
input i_Clk,
|
|
input i_UART_RX,
|
|
|
|
input i_Switch_1,
|
|
input i_Switch_2,
|
|
input i_Switch_3,
|
|
input i_Switch_4,
|
|
|
|
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 [VIDEO_WIDTH-1:0] w_Red_FromPong, w_Red_FromPorchSync;
|
|
wire [VIDEO_WIDTH-1:0] w_Green_FromPong, w_Green_FromPorchSync;
|
|
wire [VIDEO_WIDTH-1:0] w_Blue_FromPong, w_Blue_FromPorchSync;
|
|
|
|
wire w_dataReady;
|
|
wire w_HSync_Start, w_VSync_Start;
|
|
wire w_HSync_FromPong, w_VSync_FromPong;
|
|
wire w_HSync_FromPorchSync, w_VSync_FromPorchSync;
|
|
wire w_Switch_1_Debounced,
|
|
w_Switch_2_Debounced,
|
|
w_Switch_3_Debounced,
|
|
w_Switch_4_Debounced;
|
|
|
|
UART_RX #(
|
|
.CLOCKS_PER_SECOND(25000000),
|
|
.BAUD_RATE(115200)
|
|
) MyUART_RX (
|
|
.i_Clk(i_Clk),
|
|
.i_ReceiveBit(i_UART_RX),
|
|
.o_DataReady(w_dataReady),
|
|
.o_DataByte()
|
|
);
|
|
|
|
VGA_Sync_Pulse_Generator #(
|
|
.TOTAL_COLUMNS(TOTAL_COLUMNS),
|
|
.TOTAL_ROWS(TOTAL_ROWS),
|
|
.ACTIVE_COLUMNS(ACTIVE_COLUMNS),
|
|
.ACTIVE_ROWS(ACTIVE_ROWS)
|
|
) SyncGenerator (
|
|
.i_Clk(i_Clk),
|
|
.o_HSync(w_HSync_Start),
|
|
.o_VSync(w_VSync_Start),
|
|
.o_rawX(),
|
|
.o_rawY()
|
|
);
|
|
|
|
Debounce_Filter #(
|
|
.DEBOUNCE_LIMIT(25000000 / 25000)
|
|
) Debounce_Switch_1 (
|
|
.i_Clk(i_Clk),
|
|
.i_Bouncy(i_Switch_1),
|
|
.o_Debounced(w_Switch_1_Debounced)
|
|
);
|
|
|
|
Debounce_Filter #(
|
|
.DEBOUNCE_LIMIT(25000000 / 25000)
|
|
) Debounce_Switch_2 (
|
|
.i_Clk(i_Clk),
|
|
.i_Bouncy(i_Switch_2),
|
|
.o_Debounced(w_Switch_2_Debounced)
|
|
);
|
|
|
|
Debounce_Filter #(
|
|
.DEBOUNCE_LIMIT(25000000 / 25000)
|
|
) Debounce_Switch_3 (
|
|
.i_Clk(i_Clk),
|
|
.i_Bouncy(i_Switch_3),
|
|
.o_Debounced(w_Switch_3_Debounced)
|
|
);
|
|
|
|
Debounce_Filter #(
|
|
.DEBOUNCE_LIMIT(25000000 / 25000)
|
|
) Debounce_Switch_4 (
|
|
.i_Clk(i_Clk),
|
|
.i_Bouncy(i_Switch_4),
|
|
.o_Debounced(w_Switch_4_Debounced)
|
|
);
|
|
|
|
Pong #() MyPong (
|
|
.i_Clk(i_Clk),
|
|
.i_HSync(w_HSync_Start),
|
|
.i_VSync(w_VSync_Start),
|
|
.i_GameStart(w_dataReady),
|
|
.i_Player1_Up(w_Switch_1_Debounced),
|
|
.i_Player1_Down(w_Switch_2_Debounced),
|
|
.i_Player2_Up(w_Switch_3_Debounced),
|
|
.i_Player2_Down(w_Switch_4_Debounced),
|
|
.o_HSync(w_HSync_FromPong),
|
|
.o_VSync(w_VSync_FromPong),
|
|
.o_Red(w_Red_FromPong),
|
|
.o_Green(w_Green_FromPong),
|
|
.o_Blue(w_Blue_FromPong)
|
|
);
|
|
|
|
VGA_Add_Porches_To_Output #() PorchOutput (
|
|
.i_Clk(i_Clk),
|
|
.i_HSync(w_HSync_FromPong),
|
|
.i_VSync(w_VSync_FromPong),
|
|
.i_Red(w_Red_FromPong),
|
|
.i_Green(w_Green_FromPong),
|
|
.i_Blue(w_Blue_FromPong),
|
|
.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
|