go-board-code/pong_runner.v

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