From b86b91873a3845e43710814a5aeb8c4dbbc3cd74 Mon Sep 17 00:00:00 2001 From: Till Harbaum Date: Fri, 2 Oct 2015 10:44:16 +0200 Subject: [PATCH] [Tutorials] Added pong --- tutorials/pong/lektion1/pll.qip | 6 + tutorials/pong/lektion1/pll.v | 301 ++++++++++++++++++++++ tutorials/pong/lektion1/pong.qpf | 30 +++ tutorials/pong/lektion1/pong.qsf | 157 ++++++++++++ tutorials/pong/lektion1/pong.rbf | Bin 0 -> 206006 bytes tutorials/pong/lektion1/pong.v | 79 ++++++ tutorials/pong/lektion2/pll.qip | 6 + tutorials/pong/lektion2/pll.v | 301 ++++++++++++++++++++++ tutorials/pong/lektion2/pong.qpf | 30 +++ tutorials/pong/lektion2/pong.qsf | 157 ++++++++++++ tutorials/pong/lektion2/pong.rbf | Bin 0 -> 206565 bytes tutorials/pong/lektion2/pong.v | 111 ++++++++ tutorials/pong/lektion3/pll.qip | 6 + tutorials/pong/lektion3/pll.v | 301 ++++++++++++++++++++++ tutorials/pong/lektion3/pong.qpf | 30 +++ tutorials/pong/lektion3/pong.qsf | 158 ++++++++++++ tutorials/pong/lektion3/pong.rbf | Bin 0 -> 208255 bytes tutorials/pong/lektion3/pong.v | 206 +++++++++++++++ tutorials/pong/lektion3/user_io.v | 410 ++++++++++++++++++++++++++++++ tutorials/pong/lesson1/pll.qip | 6 + tutorials/pong/lesson1/pll.v | 301 ++++++++++++++++++++++ tutorials/pong/lesson1/pong.qpf | 30 +++ tutorials/pong/lesson1/pong.qsf | 157 ++++++++++++ tutorials/pong/lesson1/pong.rbf | Bin 0 -> 206006 bytes tutorials/pong/lesson1/pong.v | 79 ++++++ tutorials/pong/lesson2/pll.qip | 6 + tutorials/pong/lesson2/pll.v | 301 ++++++++++++++++++++++ tutorials/pong/lesson2/pong.qpf | 30 +++ tutorials/pong/lesson2/pong.qsf | 157 ++++++++++++ tutorials/pong/lesson2/pong.rbf | Bin 0 -> 206565 bytes tutorials/pong/lesson2/pong.v | 110 ++++++++ tutorials/pong/lesson3/pll.qip | 6 + tutorials/pong/lesson3/pll.v | 301 ++++++++++++++++++++++ tutorials/pong/lesson3/pong.qpf | 30 +++ tutorials/pong/lesson3/pong.qsf | 158 ++++++++++++ tutorials/pong/lesson3/pong.rbf | Bin 0 -> 208255 bytes tutorials/pong/lesson3/pong.v | 201 +++++++++++++++ tutorials/pong/lesson3/user_io.v | 410 ++++++++++++++++++++++++++++++ tutorials/readme.md | 6 + 39 files changed, 4578 insertions(+) create mode 100644 tutorials/pong/lektion1/pll.qip create mode 100644 tutorials/pong/lektion1/pll.v create mode 100644 tutorials/pong/lektion1/pong.qpf create mode 100644 tutorials/pong/lektion1/pong.qsf create mode 100644 tutorials/pong/lektion1/pong.rbf create mode 100644 tutorials/pong/lektion1/pong.v create mode 100644 tutorials/pong/lektion2/pll.qip create mode 100644 tutorials/pong/lektion2/pll.v create mode 100644 tutorials/pong/lektion2/pong.qpf create mode 100644 tutorials/pong/lektion2/pong.qsf create mode 100644 tutorials/pong/lektion2/pong.rbf create mode 100644 tutorials/pong/lektion2/pong.v create mode 100644 tutorials/pong/lektion3/pll.qip create mode 100644 tutorials/pong/lektion3/pll.v create mode 100644 tutorials/pong/lektion3/pong.qpf create mode 100644 tutorials/pong/lektion3/pong.qsf create mode 100644 tutorials/pong/lektion3/pong.rbf create mode 100644 tutorials/pong/lektion3/pong.v create mode 100644 tutorials/pong/lektion3/user_io.v create mode 100644 tutorials/pong/lesson1/pll.qip create mode 100644 tutorials/pong/lesson1/pll.v create mode 100644 tutorials/pong/lesson1/pong.qpf create mode 100644 tutorials/pong/lesson1/pong.qsf create mode 100644 tutorials/pong/lesson1/pong.rbf create mode 100644 tutorials/pong/lesson1/pong.v create mode 100644 tutorials/pong/lesson2/pll.qip create mode 100644 tutorials/pong/lesson2/pll.v create mode 100644 tutorials/pong/lesson2/pong.qpf create mode 100644 tutorials/pong/lesson2/pong.qsf create mode 100644 tutorials/pong/lesson2/pong.rbf create mode 100644 tutorials/pong/lesson2/pong.v create mode 100644 tutorials/pong/lesson3/pll.qip create mode 100644 tutorials/pong/lesson3/pll.v create mode 100644 tutorials/pong/lesson3/pong.qpf create mode 100644 tutorials/pong/lesson3/pong.qsf create mode 100644 tutorials/pong/lesson3/pong.rbf create mode 100644 tutorials/pong/lesson3/pong.v create mode 100644 tutorials/pong/lesson3/user_io.v diff --git a/tutorials/pong/lektion1/pll.qip b/tutorials/pong/lektion1/pll.qip new file mode 100644 index 0000000..8faa322 --- /dev/null +++ b/tutorials/pong/lektion1/pll.qip @@ -0,0 +1,6 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "pll.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_inst.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_bb.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/tutorials/pong/lektion1/pll.v b/tutorials/pong/lektion1/pll.v new file mode 100644 index 0000000..5c34ae7 --- /dev/null +++ b/tutorials/pong/lektion1/pll.v @@ -0,0 +1,301 @@ +// megafunction wizard: %ALTPLL% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altpll + +// ============================================================ +// File Name: pll.v +// Megafunction Name(s): +// altpll +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2014 Altera Corporation +//Your use of Altera Corporation's design tools, logic functions +//and other software and tools, and its AMPP partner logic +//functions, and any output files from any of the foregoing +//(including device programming or simulation files), and any +//associated documentation or information are expressly subject +//to the terms and conditions of the Altera Program License +//Subscription Agreement, Altera MegaCore Function License +//Agreement, or other applicable license agreement, including, +//without limitation, that your use is for the sole purpose of +//programming logic devices manufactured by Altera and sold by +//Altera or its authorized distributors. Please refer to the +//applicable agreement for further details. + + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on +module pll ( + inclk0, + c0); + + input inclk0; + output c0; + + wire [4:0] sub_wire0; + wire [0:0] sub_wire4 = 1'h0; + wire [0:0] sub_wire1 = sub_wire0[0:0]; + wire c0 = sub_wire1; + wire sub_wire2 = inclk0; + wire [1:0] sub_wire3 = {sub_wire4, sub_wire2}; + + altpll altpll_component ( + .inclk (sub_wire3), + .clk (sub_wire0), + .activeclock (), + .areset (1'b0), + .clkbad (), + .clkena ({6{1'b1}}), + .clkloss (), + .clkswitch (1'b0), + .configupdate (1'b0), + .enable0 (), + .enable1 (), + .extclk (), + .extclkena ({4{1'b1}}), + .fbin (1'b1), + .fbmimicbidir (), + .fbout (), + .fref (), + .icdrclk (), + .locked (), + .pfdena (1'b1), + .phasecounterselect ({4{1'b1}}), + .phasedone (), + .phasestep (1'b1), + .phaseupdown (1'b1), + .pllena (1'b1), + .scanaclr (1'b0), + .scanclk (1'b0), + .scanclkena (1'b1), + .scandata (1'b0), + .scandataout (), + .scandone (), + .scanread (1'b0), + .scanwrite (1'b0), + .sclkout0 (), + .sclkout1 (), + .vcooverrange (), + .vcounderrange ()); + defparam + altpll_component.bandwidth_type = "AUTO", + altpll_component.clk0_divide_by = 44, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 41, + altpll_component.clk0_phase_shift = "0", + altpll_component.compensate_clock = "CLK0", + altpll_component.inclk0_input_frequency = 37037, + altpll_component.intended_device_family = "Cyclone III", + altpll_component.lpm_hint = "CBX_MODULE_PREFIX=pll", + altpll_component.lpm_type = "altpll", + altpll_component.operation_mode = "NORMAL", + altpll_component.pll_type = "AUTO", + altpll_component.port_activeclock = "PORT_UNUSED", + altpll_component.port_areset = "PORT_UNUSED", + altpll_component.port_clkbad0 = "PORT_UNUSED", + altpll_component.port_clkbad1 = "PORT_UNUSED", + altpll_component.port_clkloss = "PORT_UNUSED", + altpll_component.port_clkswitch = "PORT_UNUSED", + altpll_component.port_configupdate = "PORT_UNUSED", + altpll_component.port_fbin = "PORT_UNUSED", + altpll_component.port_inclk0 = "PORT_USED", + altpll_component.port_inclk1 = "PORT_UNUSED", + altpll_component.port_locked = "PORT_UNUSED", + altpll_component.port_pfdena = "PORT_UNUSED", + altpll_component.port_phasecounterselect = "PORT_UNUSED", + altpll_component.port_phasedone = "PORT_UNUSED", + altpll_component.port_phasestep = "PORT_UNUSED", + altpll_component.port_phaseupdown = "PORT_UNUSED", + altpll_component.port_pllena = "PORT_UNUSED", + altpll_component.port_scanaclr = "PORT_UNUSED", + altpll_component.port_scanclk = "PORT_UNUSED", + altpll_component.port_scanclkena = "PORT_UNUSED", + altpll_component.port_scandata = "PORT_UNUSED", + altpll_component.port_scandataout = "PORT_UNUSED", + altpll_component.port_scandone = "PORT_UNUSED", + altpll_component.port_scanread = "PORT_UNUSED", + altpll_component.port_scanwrite = "PORT_UNUSED", + altpll_component.port_clk0 = "PORT_USED", + altpll_component.port_clk1 = "PORT_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + altpll_component.port_clk3 = "PORT_UNUSED", + altpll_component.port_clk4 = "PORT_UNUSED", + altpll_component.port_clk5 = "PORT_UNUSED", + altpll_component.port_clkena0 = "PORT_UNUSED", + altpll_component.port_clkena1 = "PORT_UNUSED", + altpll_component.port_clkena2 = "PORT_UNUSED", + altpll_component.port_clkena3 = "PORT_UNUSED", + altpll_component.port_clkena4 = "PORT_UNUSED", + altpll_component.port_clkena5 = "PORT_UNUSED", + altpll_component.port_extclk0 = "PORT_UNUSED", + altpll_component.port_extclk1 = "PORT_UNUSED", + altpll_component.port_extclk2 = "PORT_UNUSED", + altpll_component.port_extclk3 = "PORT_UNUSED", + altpll_component.width_clock = 5; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +// Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +// Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +// Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +// Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +// Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +// Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +// Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +// Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +// Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +// Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +// Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "44" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "25.159090" +// Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +// Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +// Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +// Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +// Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +// Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "41" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "25.17500000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +// Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +// Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +// Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +// Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +// Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +// Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +// Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +// Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +// Retrieval info: PRIVATE: SPREAD_USE STRING "0" +// Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +// Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +// Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +// Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: USE_CLK0 STRING "1" +// Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +// Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +// Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "44" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "41" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +// Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +// Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +// Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +// Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +// Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_bb.v TRUE +// Retrieval info: LIB_FILE: altera_mf +// Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/tutorials/pong/lektion1/pong.qpf b/tutorials/pong/lektion1/pong.qpf new file mode 100644 index 0000000..bce3c64 --- /dev/null +++ b/tutorials/pong/lektion1/pong.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2010 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II +# Version 10.1 Build 153 11/29/2010 SJ Full Version +# Date created = 11:11:11 June 13, 2011 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "10.1" +DATE = "11:11:11 June 13, 2011" + +# Revisions + +PROJECT_REVISION = "pong" diff --git a/tutorials/pong/lektion1/pong.qsf b/tutorials/pong/lektion1/pong.qsf new file mode 100644 index 0000000..0485763 --- /dev/null +++ b/tutorials/pong/lektion1/pong.qsf @@ -0,0 +1,157 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2011 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II +# Version 11.0 Build 157 04/27/2011 SJ Full Version +# Date created = 17:14:01 April 10, 2012 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# led_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name TOP_LEVEL_ENTITY pong +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 11.0 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "17:14:01 APRIL 10, 2012" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name DEVICE_FILTER_PACKAGE "ANY QFP" +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "AS INPUT TRI-STATED" +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" + +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_22 -to CLOCK_50[0] +set_location_assignment PIN_23 -to CLOCK_50[1] +set_location_assignment PIN_128 -to CLOCK_32[0] +set_location_assignment PIN_129 -to CLOCK_32[1] +set_location_assignment PIN_54 -to CLOCK_27[0] +set_location_assignment PIN_55 -to CLOCK_27[1] +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_46 -to UART_TX +set_location_assignment PIN_31 -to UART_RX +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_90 -to SPI_SS4 +set_location_assignment PIN_13 -to CONF_DATA0 + +set_location_assignment PIN_49 -to SDRAM_A[0] +set_location_assignment PIN_44 -to SDRAM_A[1] +set_location_assignment PIN_42 -to SDRAM_A[2] +set_location_assignment PIN_39 -to SDRAM_A[3] +set_location_assignment PIN_4 -to SDRAM_A[4] +set_location_assignment PIN_6 -to SDRAM_A[5] +set_location_assignment PIN_8 -to SDRAM_A[6] +set_location_assignment PIN_10 -to SDRAM_A[7] +set_location_assignment PIN_11 -to SDRAM_A[8] +set_location_assignment PIN_28 -to SDRAM_A[9] +set_location_assignment PIN_50 -to SDRAM_A[10] +set_location_assignment PIN_30 -to SDRAM_A[11] +set_location_assignment PIN_32 -to SDRAM_A[12] +set_location_assignment PIN_83 -to SDRAM_DQ[0] +set_location_assignment PIN_79 -to SDRAM_DQ[1] +set_location_assignment PIN_77 -to SDRAM_DQ[2] +set_location_assignment PIN_76 -to SDRAM_DQ[3] +set_location_assignment PIN_72 -to SDRAM_DQ[4] +set_location_assignment PIN_71 -to SDRAM_DQ[5] +set_location_assignment PIN_69 -to SDRAM_DQ[6] +set_location_assignment PIN_68 -to SDRAM_DQ[7] +set_location_assignment PIN_86 -to SDRAM_DQ[8] +set_location_assignment PIN_87 -to SDRAM_DQ[9] +set_location_assignment PIN_98 -to SDRAM_DQ[10] +set_location_assignment PIN_99 -to SDRAM_DQ[11] +set_location_assignment PIN_100 -to SDRAM_DQ[12] +set_location_assignment PIN_101 -to SDRAM_DQ[13] +set_location_assignment PIN_103 -to SDRAM_DQ[14] +set_location_assignment PIN_104 -to SDRAM_DQ[15] +set_location_assignment PIN_58 -to SDRAM_BA[0] +set_location_assignment PIN_51 -to SDRAM_BA[1] +set_location_assignment PIN_85 -to SDRAM_DQMH +set_location_assignment PIN_67 -to SDRAM_DQML +set_location_assignment PIN_60 -to SDRAM_nRAS +set_location_assignment PIN_64 -to SDRAM_nCAS +set_location_assignment PIN_66 -to SDRAM_nWE +set_location_assignment PIN_59 -to SDRAM_nCS +set_location_assignment PIN_33 -to SDRAM_CKE +set_location_assignment PIN_43 -to SDRAM_CLK + + +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name VERILOG_FILE pll.v +set_global_assignment -name VERILOG_FILE pong.v +set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON +set_global_assignment -name FITTER_EFFORT "FAST FIT" +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/tutorials/pong/lektion1/pong.rbf b/tutorials/pong/lektion1/pong.rbf new file mode 100644 index 0000000000000000000000000000000000000000..d63fce7f074cb90de90eb73a4485f63a6ed29a9f GIT binary patch literal 206006 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 BzBvE@ literal 0 HcmV?d00001 diff --git a/tutorials/pong/lektion1/pong.v b/tutorials/pong/lektion1/pong.v new file mode 100644 index 0000000..f6cf617 --- /dev/null +++ b/tutorials/pong/lektion1/pong.v @@ -0,0 +1,79 @@ +// Ein einfaches Pong-Spiel fuer das MiST-FPGA-Board +// (c) 2015 Till Harbaum + +// Lektion 1: VGA-Signal mit Ball + +module pong ( + input [1:0] CLOCK_27, + output SDRAM_nCS, + output reg VGA_HS, + output reg VGA_VS, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B +); + +// 640x480 60HZ VESA laut http://tinyvga.com/vga-timing/640x480@60Hz +parameter H = 640; // Breite des sichtbaren Bereiches +parameter HFP = 16; // Nicht nutzbarer Bereich vor H-Sync +parameter HS = 96; // Breite des H-Sync +parameter HBP = 48; // Nicht nutzbarer Bereich nach H-Sync + +parameter V = 480; // Höhe des sichtbaren Bereiches +parameter VFP = 10; // Nicht nutzbarer Bereich vor V-Sync +parameter VS = 2; // Höhe des V-Sync +parameter VBP = 33; // Nicht nutzbarer Bereich nach V-Sync + +reg[9:0] h_cnt; // horizontaler Pixelzaehler +reg[9:0] v_cnt; // vertikaler Pixelzaehler + +// Deaktivieren des unbenutzten SDRAMs +assign SDRAM_nCS = 1; + +localparam BALL_SIZE = 16; // Breite und Höse des Balls + +// Ball startet im Zentrum des sichtbaren Bildschirmbereiches +reg [9:0] ball_x = HS + HBP + (H - BALL_SIZE)/2; +reg [9:0] ball_y = VS + VBP + (V - BALL_SIZE)/2; + +// Beide Zaehler starten mit dem Beginn des Sync-Impulses + +// horizontaler Pixelzaehler +always@(posedge pixel_clock) begin + if(h_cnt==HS+HBP+H+HFP-1) h_cnt <= 0; + else h_cnt <= h_cnt + 1; + + // Erzeugung des negativen H-Sync-Signals + VGA_HS <= (h_cnt >= HS); +end + +// vertikaler Pixelzaehler +always@(posedge pixel_clock) begin + // der vertikale Zustand aendert sich am Anfang jeder Zeile + if(h_cnt == 0) begin + if(v_cnt==VS+VBP+V+VFP-1) v_cnt <= 0; + else v_cnt <= v_cnt + 1; + + // Erzeugung des negativen V-Sync-Signals + VGA_VS <= (v_cnt >= VS); + end +end + +// Signal, das anzeigt, wenn der Elektronenstrahl gerade den Ball zeichnet +wire ball = (h_cnt >= ball_x) && (h_cnt < ball_x + BALL_SIZE) && + (v_cnt >= ball_y) && (v_cnt < ball_y + BALL_SIZE); + +wire pixel = ball; + +// Weiss, wenn "pixel" sonst schwarz +assign VGA_R = pixel?6'b111111:6'b000000; +assign VGA_G = pixel?6'b111111:6'b000000; +assign VGA_B = pixel?6'b111111:6'b000000; + +// PLL, um aus den 27MHz den VGA-Pixeltakt zu erzeugen +pll pll ( + .inclk0(CLOCK_27[0]), + .c0(pixel_clock) + ); + +endmodule diff --git a/tutorials/pong/lektion2/pll.qip b/tutorials/pong/lektion2/pll.qip new file mode 100644 index 0000000..8faa322 --- /dev/null +++ b/tutorials/pong/lektion2/pll.qip @@ -0,0 +1,6 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "pll.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_inst.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_bb.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/tutorials/pong/lektion2/pll.v b/tutorials/pong/lektion2/pll.v new file mode 100644 index 0000000..5c34ae7 --- /dev/null +++ b/tutorials/pong/lektion2/pll.v @@ -0,0 +1,301 @@ +// megafunction wizard: %ALTPLL% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altpll + +// ============================================================ +// File Name: pll.v +// Megafunction Name(s): +// altpll +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2014 Altera Corporation +//Your use of Altera Corporation's design tools, logic functions +//and other software and tools, and its AMPP partner logic +//functions, and any output files from any of the foregoing +//(including device programming or simulation files), and any +//associated documentation or information are expressly subject +//to the terms and conditions of the Altera Program License +//Subscription Agreement, Altera MegaCore Function License +//Agreement, or other applicable license agreement, including, +//without limitation, that your use is for the sole purpose of +//programming logic devices manufactured by Altera and sold by +//Altera or its authorized distributors. Please refer to the +//applicable agreement for further details. + + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on +module pll ( + inclk0, + c0); + + input inclk0; + output c0; + + wire [4:0] sub_wire0; + wire [0:0] sub_wire4 = 1'h0; + wire [0:0] sub_wire1 = sub_wire0[0:0]; + wire c0 = sub_wire1; + wire sub_wire2 = inclk0; + wire [1:0] sub_wire3 = {sub_wire4, sub_wire2}; + + altpll altpll_component ( + .inclk (sub_wire3), + .clk (sub_wire0), + .activeclock (), + .areset (1'b0), + .clkbad (), + .clkena ({6{1'b1}}), + .clkloss (), + .clkswitch (1'b0), + .configupdate (1'b0), + .enable0 (), + .enable1 (), + .extclk (), + .extclkena ({4{1'b1}}), + .fbin (1'b1), + .fbmimicbidir (), + .fbout (), + .fref (), + .icdrclk (), + .locked (), + .pfdena (1'b1), + .phasecounterselect ({4{1'b1}}), + .phasedone (), + .phasestep (1'b1), + .phaseupdown (1'b1), + .pllena (1'b1), + .scanaclr (1'b0), + .scanclk (1'b0), + .scanclkena (1'b1), + .scandata (1'b0), + .scandataout (), + .scandone (), + .scanread (1'b0), + .scanwrite (1'b0), + .sclkout0 (), + .sclkout1 (), + .vcooverrange (), + .vcounderrange ()); + defparam + altpll_component.bandwidth_type = "AUTO", + altpll_component.clk0_divide_by = 44, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 41, + altpll_component.clk0_phase_shift = "0", + altpll_component.compensate_clock = "CLK0", + altpll_component.inclk0_input_frequency = 37037, + altpll_component.intended_device_family = "Cyclone III", + altpll_component.lpm_hint = "CBX_MODULE_PREFIX=pll", + altpll_component.lpm_type = "altpll", + altpll_component.operation_mode = "NORMAL", + altpll_component.pll_type = "AUTO", + altpll_component.port_activeclock = "PORT_UNUSED", + altpll_component.port_areset = "PORT_UNUSED", + altpll_component.port_clkbad0 = "PORT_UNUSED", + altpll_component.port_clkbad1 = "PORT_UNUSED", + altpll_component.port_clkloss = "PORT_UNUSED", + altpll_component.port_clkswitch = "PORT_UNUSED", + altpll_component.port_configupdate = "PORT_UNUSED", + altpll_component.port_fbin = "PORT_UNUSED", + altpll_component.port_inclk0 = "PORT_USED", + altpll_component.port_inclk1 = "PORT_UNUSED", + altpll_component.port_locked = "PORT_UNUSED", + altpll_component.port_pfdena = "PORT_UNUSED", + altpll_component.port_phasecounterselect = "PORT_UNUSED", + altpll_component.port_phasedone = "PORT_UNUSED", + altpll_component.port_phasestep = "PORT_UNUSED", + altpll_component.port_phaseupdown = "PORT_UNUSED", + altpll_component.port_pllena = "PORT_UNUSED", + altpll_component.port_scanaclr = "PORT_UNUSED", + altpll_component.port_scanclk = "PORT_UNUSED", + altpll_component.port_scanclkena = "PORT_UNUSED", + altpll_component.port_scandata = "PORT_UNUSED", + altpll_component.port_scandataout = "PORT_UNUSED", + altpll_component.port_scandone = "PORT_UNUSED", + altpll_component.port_scanread = "PORT_UNUSED", + altpll_component.port_scanwrite = "PORT_UNUSED", + altpll_component.port_clk0 = "PORT_USED", + altpll_component.port_clk1 = "PORT_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + altpll_component.port_clk3 = "PORT_UNUSED", + altpll_component.port_clk4 = "PORT_UNUSED", + altpll_component.port_clk5 = "PORT_UNUSED", + altpll_component.port_clkena0 = "PORT_UNUSED", + altpll_component.port_clkena1 = "PORT_UNUSED", + altpll_component.port_clkena2 = "PORT_UNUSED", + altpll_component.port_clkena3 = "PORT_UNUSED", + altpll_component.port_clkena4 = "PORT_UNUSED", + altpll_component.port_clkena5 = "PORT_UNUSED", + altpll_component.port_extclk0 = "PORT_UNUSED", + altpll_component.port_extclk1 = "PORT_UNUSED", + altpll_component.port_extclk2 = "PORT_UNUSED", + altpll_component.port_extclk3 = "PORT_UNUSED", + altpll_component.width_clock = 5; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +// Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +// Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +// Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +// Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +// Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +// Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +// Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +// Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +// Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +// Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +// Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "44" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "25.159090" +// Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +// Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +// Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +// Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +// Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +// Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "41" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "25.17500000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +// Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +// Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +// Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +// Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +// Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +// Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +// Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +// Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +// Retrieval info: PRIVATE: SPREAD_USE STRING "0" +// Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +// Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +// Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +// Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: USE_CLK0 STRING "1" +// Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +// Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +// Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "44" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "41" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +// Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +// Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +// Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +// Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +// Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_bb.v TRUE +// Retrieval info: LIB_FILE: altera_mf +// Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/tutorials/pong/lektion2/pong.qpf b/tutorials/pong/lektion2/pong.qpf new file mode 100644 index 0000000..bce3c64 --- /dev/null +++ b/tutorials/pong/lektion2/pong.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2010 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II +# Version 10.1 Build 153 11/29/2010 SJ Full Version +# Date created = 11:11:11 June 13, 2011 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "10.1" +DATE = "11:11:11 June 13, 2011" + +# Revisions + +PROJECT_REVISION = "pong" diff --git a/tutorials/pong/lektion2/pong.qsf b/tutorials/pong/lektion2/pong.qsf new file mode 100644 index 0000000..0485763 --- /dev/null +++ b/tutorials/pong/lektion2/pong.qsf @@ -0,0 +1,157 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2011 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II +# Version 11.0 Build 157 04/27/2011 SJ Full Version +# Date created = 17:14:01 April 10, 2012 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# led_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name TOP_LEVEL_ENTITY pong +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 11.0 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "17:14:01 APRIL 10, 2012" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name DEVICE_FILTER_PACKAGE "ANY QFP" +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "AS INPUT TRI-STATED" +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" + +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_22 -to CLOCK_50[0] +set_location_assignment PIN_23 -to CLOCK_50[1] +set_location_assignment PIN_128 -to CLOCK_32[0] +set_location_assignment PIN_129 -to CLOCK_32[1] +set_location_assignment PIN_54 -to CLOCK_27[0] +set_location_assignment PIN_55 -to CLOCK_27[1] +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_46 -to UART_TX +set_location_assignment PIN_31 -to UART_RX +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_90 -to SPI_SS4 +set_location_assignment PIN_13 -to CONF_DATA0 + +set_location_assignment PIN_49 -to SDRAM_A[0] +set_location_assignment PIN_44 -to SDRAM_A[1] +set_location_assignment PIN_42 -to SDRAM_A[2] +set_location_assignment PIN_39 -to SDRAM_A[3] +set_location_assignment PIN_4 -to SDRAM_A[4] +set_location_assignment PIN_6 -to SDRAM_A[5] +set_location_assignment PIN_8 -to SDRAM_A[6] +set_location_assignment PIN_10 -to SDRAM_A[7] +set_location_assignment PIN_11 -to SDRAM_A[8] +set_location_assignment PIN_28 -to SDRAM_A[9] +set_location_assignment PIN_50 -to SDRAM_A[10] +set_location_assignment PIN_30 -to SDRAM_A[11] +set_location_assignment PIN_32 -to SDRAM_A[12] +set_location_assignment PIN_83 -to SDRAM_DQ[0] +set_location_assignment PIN_79 -to SDRAM_DQ[1] +set_location_assignment PIN_77 -to SDRAM_DQ[2] +set_location_assignment PIN_76 -to SDRAM_DQ[3] +set_location_assignment PIN_72 -to SDRAM_DQ[4] +set_location_assignment PIN_71 -to SDRAM_DQ[5] +set_location_assignment PIN_69 -to SDRAM_DQ[6] +set_location_assignment PIN_68 -to SDRAM_DQ[7] +set_location_assignment PIN_86 -to SDRAM_DQ[8] +set_location_assignment PIN_87 -to SDRAM_DQ[9] +set_location_assignment PIN_98 -to SDRAM_DQ[10] +set_location_assignment PIN_99 -to SDRAM_DQ[11] +set_location_assignment PIN_100 -to SDRAM_DQ[12] +set_location_assignment PIN_101 -to SDRAM_DQ[13] +set_location_assignment PIN_103 -to SDRAM_DQ[14] +set_location_assignment PIN_104 -to SDRAM_DQ[15] +set_location_assignment PIN_58 -to SDRAM_BA[0] +set_location_assignment PIN_51 -to SDRAM_BA[1] +set_location_assignment PIN_85 -to SDRAM_DQMH +set_location_assignment PIN_67 -to SDRAM_DQML +set_location_assignment PIN_60 -to SDRAM_nRAS +set_location_assignment PIN_64 -to SDRAM_nCAS +set_location_assignment PIN_66 -to SDRAM_nWE +set_location_assignment PIN_59 -to SDRAM_nCS +set_location_assignment PIN_33 -to SDRAM_CKE +set_location_assignment PIN_43 -to SDRAM_CLK + + +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name VERILOG_FILE pll.v +set_global_assignment -name VERILOG_FILE pong.v +set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON +set_global_assignment -name FITTER_EFFORT "FAST FIT" +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/tutorials/pong/lektion2/pong.rbf b/tutorials/pong/lektion2/pong.rbf new file mode 100644 index 0000000000000000000000000000000000000000..1f7de8bc4a5b7691d0bcb85f37d1ddf82b1788eb GIT binary patch literal 206565 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 E0j|g3rT_o{ literal 0 HcmV?d00001 diff --git a/tutorials/pong/lektion2/pong.v b/tutorials/pong/lektion2/pong.v new file mode 100644 index 0000000..7791927 --- /dev/null +++ b/tutorials/pong/lektion2/pong.v @@ -0,0 +1,111 @@ +// Ein einfaches Pong-Spiel fuer das MiST-FPGA-Board +// (c) 2015 Till Harbaum + +// Lektion 2: Beweglicher Ball + +module pong ( + input [1:0] CLOCK_27, + output SDRAM_nCS, + output reg VGA_HS, + output reg VGA_VS, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B +); + +// 640x480 60HZ VESA laut http://tinyvga.com/vga-timing/640x480@60Hz +parameter H = 640; // Breite des sichtbaren Bereiches +parameter HFP = 16; // Nicht nutzbarer Bereich vor H-Sync +parameter HS = 96; // Breite des H-Sync +parameter HBP = 48; // Nicht nutzbarer Bereich nach H-Sync + +parameter V = 480; // Höhe des sichtbaren Bereiches +parameter VFP = 10; // Nicht nutzbarer Bereich vor V-Sync +parameter VS = 2; // Höhe des V-Sync +parameter VBP = 33; // Nicht nutzbarer Bereich nach V-Sync + +reg[9:0] h_cnt; // horizontaler Pixelzaehler +reg[9:0] v_cnt; // vertikaler Pixelzaehler + +// Deaktivieren des unbenutzten SDRAMs +assign SDRAM_nCS = 1; + +localparam BORDER = 8; // Höhe des oberen/unteren Randes +localparam BALL_SIZE = 16; // Breite und Höse des Balls +localparam BALL_SPEED = 4; // Schrittweite des Balles pro V-Sync + +// Ball startet im Zentrum des sichtbaren Bildschirmbereiches +reg [9:0] ball_x = HS + HBP + (H - BALL_SIZE)/2; +reg [9:0] ball_y = VS + VBP + (V - BALL_SIZE)/2; + +// Bewegungsrichtung des Balls +reg ball_move_x = 1'b1; +reg ball_move_y = 1'b1; + +// Berechne neue Ballposition bei jedem VSync +always@(posedge VGA_VS) begin + // Änderung der horizontalen Bewegung, wenn der Rand erreicht ist + if(ball_x < HS+HBP) ball_move_x <= 1'b1; + if(ball_x >= HS+HBP+H-BALL_SIZE) ball_move_x <= 1'b0; + + // horizontale Ballbewegung + if(ball_move_x) ball_x <= ball_x + BALL_SPEED; + else ball_x <= ball_x - BALL_SPEED; + + // Änderung der vertikalen Bewegung, wenn der Rand erreicht ist + if(ball_y < VS+VBP+BORDER) ball_move_y <= 1'b1; + if(ball_y >= VS+VBP+V-BORDER-BALL_SIZE) ball_move_y <= 1'b0; + + // vertikale Ballbewegung + if(ball_move_y) ball_y <= ball_y + BALL_SPEED; + else ball_y <= ball_y - BALL_SPEED; +end + +// Beide Zaehler starten mit dem Beginn des Sync-Impulses + +// horizontaler Pixelzaehler +always@(posedge pixel_clock) begin + if(h_cnt==HS+HBP+H+HFP-1) h_cnt <= 0; + else h_cnt <= h_cnt + 1; + + // Erzeugung des negativen H-Sync-Signals + VGA_HS <= (h_cnt >= HS); +end + +// vertikaler Pixelzaehler +always@(posedge pixel_clock) begin + // der vertikale Zustand aendert sich am Anfang jeder Zeile + if(h_cnt == 0) begin + if(v_cnt==VS+VBP+V+VFP-1) v_cnt <= 0; + else v_cnt <= v_cnt + 1; + + // Erzeugung des negativen V-Sync-Signals + VGA_VS <= (v_cnt >= VS); + end +end + +// Signal, das anzeigt, wenn der Elektronenstrahl gerade den Ball zeichnet +wire ball = (h_cnt >= ball_x) && (h_cnt < ball_x + BALL_SIZE) && + (v_cnt >= ball_y) && (v_cnt < ball_y + BALL_SIZE); + +// Oberer und unterer Rand wird gezeichnet: Elektronenstrahl befindet sich +// im horizontalen Spielfeldbereich und entweder innerhalb des oberen +// Randbereiches oder des unteren +wire border = (h_cnt >= HS+HBP) && (h_cnt < HS+HBP+H) && + (((v_cnt >= VS+VBP) && (v_cnt < VS+VBP+BORDER)) || + ((v_cnt >= VS+VBP+V-BORDER) && (v_cnt < VS+VBP+V))); + +wire pixel = ball || border; + +// Weiss, wenn "pixel" sonst schwarz +assign VGA_R = pixel?6'b111111:6'b000000; +assign VGA_G = pixel?6'b111111:6'b000000; +assign VGA_B = pixel?6'b111111:6'b000000; + +// PLL, um aus den 27MHz den VGA-Pixeltakt zu erzeugen +pll pll ( + .inclk0(CLOCK_27[0]), + .c0(pixel_clock) + ); + +endmodule diff --git a/tutorials/pong/lektion3/pll.qip b/tutorials/pong/lektion3/pll.qip new file mode 100644 index 0000000..8faa322 --- /dev/null +++ b/tutorials/pong/lektion3/pll.qip @@ -0,0 +1,6 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "pll.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_inst.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_bb.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/tutorials/pong/lektion3/pll.v b/tutorials/pong/lektion3/pll.v new file mode 100644 index 0000000..5c34ae7 --- /dev/null +++ b/tutorials/pong/lektion3/pll.v @@ -0,0 +1,301 @@ +// megafunction wizard: %ALTPLL% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altpll + +// ============================================================ +// File Name: pll.v +// Megafunction Name(s): +// altpll +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2014 Altera Corporation +//Your use of Altera Corporation's design tools, logic functions +//and other software and tools, and its AMPP partner logic +//functions, and any output files from any of the foregoing +//(including device programming or simulation files), and any +//associated documentation or information are expressly subject +//to the terms and conditions of the Altera Program License +//Subscription Agreement, Altera MegaCore Function License +//Agreement, or other applicable license agreement, including, +//without limitation, that your use is for the sole purpose of +//programming logic devices manufactured by Altera and sold by +//Altera or its authorized distributors. Please refer to the +//applicable agreement for further details. + + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on +module pll ( + inclk0, + c0); + + input inclk0; + output c0; + + wire [4:0] sub_wire0; + wire [0:0] sub_wire4 = 1'h0; + wire [0:0] sub_wire1 = sub_wire0[0:0]; + wire c0 = sub_wire1; + wire sub_wire2 = inclk0; + wire [1:0] sub_wire3 = {sub_wire4, sub_wire2}; + + altpll altpll_component ( + .inclk (sub_wire3), + .clk (sub_wire0), + .activeclock (), + .areset (1'b0), + .clkbad (), + .clkena ({6{1'b1}}), + .clkloss (), + .clkswitch (1'b0), + .configupdate (1'b0), + .enable0 (), + .enable1 (), + .extclk (), + .extclkena ({4{1'b1}}), + .fbin (1'b1), + .fbmimicbidir (), + .fbout (), + .fref (), + .icdrclk (), + .locked (), + .pfdena (1'b1), + .phasecounterselect ({4{1'b1}}), + .phasedone (), + .phasestep (1'b1), + .phaseupdown (1'b1), + .pllena (1'b1), + .scanaclr (1'b0), + .scanclk (1'b0), + .scanclkena (1'b1), + .scandata (1'b0), + .scandataout (), + .scandone (), + .scanread (1'b0), + .scanwrite (1'b0), + .sclkout0 (), + .sclkout1 (), + .vcooverrange (), + .vcounderrange ()); + defparam + altpll_component.bandwidth_type = "AUTO", + altpll_component.clk0_divide_by = 44, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 41, + altpll_component.clk0_phase_shift = "0", + altpll_component.compensate_clock = "CLK0", + altpll_component.inclk0_input_frequency = 37037, + altpll_component.intended_device_family = "Cyclone III", + altpll_component.lpm_hint = "CBX_MODULE_PREFIX=pll", + altpll_component.lpm_type = "altpll", + altpll_component.operation_mode = "NORMAL", + altpll_component.pll_type = "AUTO", + altpll_component.port_activeclock = "PORT_UNUSED", + altpll_component.port_areset = "PORT_UNUSED", + altpll_component.port_clkbad0 = "PORT_UNUSED", + altpll_component.port_clkbad1 = "PORT_UNUSED", + altpll_component.port_clkloss = "PORT_UNUSED", + altpll_component.port_clkswitch = "PORT_UNUSED", + altpll_component.port_configupdate = "PORT_UNUSED", + altpll_component.port_fbin = "PORT_UNUSED", + altpll_component.port_inclk0 = "PORT_USED", + altpll_component.port_inclk1 = "PORT_UNUSED", + altpll_component.port_locked = "PORT_UNUSED", + altpll_component.port_pfdena = "PORT_UNUSED", + altpll_component.port_phasecounterselect = "PORT_UNUSED", + altpll_component.port_phasedone = "PORT_UNUSED", + altpll_component.port_phasestep = "PORT_UNUSED", + altpll_component.port_phaseupdown = "PORT_UNUSED", + altpll_component.port_pllena = "PORT_UNUSED", + altpll_component.port_scanaclr = "PORT_UNUSED", + altpll_component.port_scanclk = "PORT_UNUSED", + altpll_component.port_scanclkena = "PORT_UNUSED", + altpll_component.port_scandata = "PORT_UNUSED", + altpll_component.port_scandataout = "PORT_UNUSED", + altpll_component.port_scandone = "PORT_UNUSED", + altpll_component.port_scanread = "PORT_UNUSED", + altpll_component.port_scanwrite = "PORT_UNUSED", + altpll_component.port_clk0 = "PORT_USED", + altpll_component.port_clk1 = "PORT_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + altpll_component.port_clk3 = "PORT_UNUSED", + altpll_component.port_clk4 = "PORT_UNUSED", + altpll_component.port_clk5 = "PORT_UNUSED", + altpll_component.port_clkena0 = "PORT_UNUSED", + altpll_component.port_clkena1 = "PORT_UNUSED", + altpll_component.port_clkena2 = "PORT_UNUSED", + altpll_component.port_clkena3 = "PORT_UNUSED", + altpll_component.port_clkena4 = "PORT_UNUSED", + altpll_component.port_clkena5 = "PORT_UNUSED", + altpll_component.port_extclk0 = "PORT_UNUSED", + altpll_component.port_extclk1 = "PORT_UNUSED", + altpll_component.port_extclk2 = "PORT_UNUSED", + altpll_component.port_extclk3 = "PORT_UNUSED", + altpll_component.width_clock = 5; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +// Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +// Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +// Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +// Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +// Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +// Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +// Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +// Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +// Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +// Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +// Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "44" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "25.159090" +// Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +// Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +// Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +// Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +// Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +// Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "41" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "25.17500000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +// Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +// Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +// Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +// Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +// Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +// Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +// Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +// Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +// Retrieval info: PRIVATE: SPREAD_USE STRING "0" +// Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +// Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +// Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +// Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: USE_CLK0 STRING "1" +// Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +// Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +// Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "44" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "41" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +// Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +// Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +// Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +// Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +// Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_bb.v TRUE +// Retrieval info: LIB_FILE: altera_mf +// Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/tutorials/pong/lektion3/pong.qpf b/tutorials/pong/lektion3/pong.qpf new file mode 100644 index 0000000..bce3c64 --- /dev/null +++ b/tutorials/pong/lektion3/pong.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2010 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II +# Version 10.1 Build 153 11/29/2010 SJ Full Version +# Date created = 11:11:11 June 13, 2011 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "10.1" +DATE = "11:11:11 June 13, 2011" + +# Revisions + +PROJECT_REVISION = "pong" diff --git a/tutorials/pong/lektion3/pong.qsf b/tutorials/pong/lektion3/pong.qsf new file mode 100644 index 0000000..1d8a7cf --- /dev/null +++ b/tutorials/pong/lektion3/pong.qsf @@ -0,0 +1,158 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2011 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II +# Version 11.0 Build 157 04/27/2011 SJ Full Version +# Date created = 17:14:01 April 10, 2012 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# led_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name TOP_LEVEL_ENTITY pong +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 11.0 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "17:14:01 APRIL 10, 2012" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name DEVICE_FILTER_PACKAGE "ANY QFP" +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "AS INPUT TRI-STATED" +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" + +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_22 -to CLOCK_50[0] +set_location_assignment PIN_23 -to CLOCK_50[1] +set_location_assignment PIN_128 -to CLOCK_32[0] +set_location_assignment PIN_129 -to CLOCK_32[1] +set_location_assignment PIN_54 -to CLOCK_27[0] +set_location_assignment PIN_55 -to CLOCK_27[1] +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_46 -to UART_TX +set_location_assignment PIN_31 -to UART_RX +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_90 -to SPI_SS4 +set_location_assignment PIN_13 -to CONF_DATA0 + +set_location_assignment PIN_49 -to SDRAM_A[0] +set_location_assignment PIN_44 -to SDRAM_A[1] +set_location_assignment PIN_42 -to SDRAM_A[2] +set_location_assignment PIN_39 -to SDRAM_A[3] +set_location_assignment PIN_4 -to SDRAM_A[4] +set_location_assignment PIN_6 -to SDRAM_A[5] +set_location_assignment PIN_8 -to SDRAM_A[6] +set_location_assignment PIN_10 -to SDRAM_A[7] +set_location_assignment PIN_11 -to SDRAM_A[8] +set_location_assignment PIN_28 -to SDRAM_A[9] +set_location_assignment PIN_50 -to SDRAM_A[10] +set_location_assignment PIN_30 -to SDRAM_A[11] +set_location_assignment PIN_32 -to SDRAM_A[12] +set_location_assignment PIN_83 -to SDRAM_DQ[0] +set_location_assignment PIN_79 -to SDRAM_DQ[1] +set_location_assignment PIN_77 -to SDRAM_DQ[2] +set_location_assignment PIN_76 -to SDRAM_DQ[3] +set_location_assignment PIN_72 -to SDRAM_DQ[4] +set_location_assignment PIN_71 -to SDRAM_DQ[5] +set_location_assignment PIN_69 -to SDRAM_DQ[6] +set_location_assignment PIN_68 -to SDRAM_DQ[7] +set_location_assignment PIN_86 -to SDRAM_DQ[8] +set_location_assignment PIN_87 -to SDRAM_DQ[9] +set_location_assignment PIN_98 -to SDRAM_DQ[10] +set_location_assignment PIN_99 -to SDRAM_DQ[11] +set_location_assignment PIN_100 -to SDRAM_DQ[12] +set_location_assignment PIN_101 -to SDRAM_DQ[13] +set_location_assignment PIN_103 -to SDRAM_DQ[14] +set_location_assignment PIN_104 -to SDRAM_DQ[15] +set_location_assignment PIN_58 -to SDRAM_BA[0] +set_location_assignment PIN_51 -to SDRAM_BA[1] +set_location_assignment PIN_85 -to SDRAM_DQMH +set_location_assignment PIN_67 -to SDRAM_DQML +set_location_assignment PIN_60 -to SDRAM_nRAS +set_location_assignment PIN_64 -to SDRAM_nCAS +set_location_assignment PIN_66 -to SDRAM_nWE +set_location_assignment PIN_59 -to SDRAM_nCS +set_location_assignment PIN_33 -to SDRAM_CKE +set_location_assignment PIN_43 -to SDRAM_CLK + + +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON +set_global_assignment -name FITTER_EFFORT "FAST FIT" +set_global_assignment -name VERILOG_FILE user_io.v +set_global_assignment -name VERILOG_FILE pll.v +set_global_assignment -name VERILOG_FILE pong.v +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/tutorials/pong/lektion3/pong.rbf b/tutorials/pong/lektion3/pong.rbf new file mode 100644 index 0000000000000000000000000000000000000000..a4e1fcd27d58cefc302f4fb59b5fa22c597809b5 GIT binary patch literal 208255 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 E9~sqA&;S4c literal 0 HcmV?d00001 diff --git a/tutorials/pong/lektion3/pong.v b/tutorials/pong/lektion3/pong.v new file mode 100644 index 0000000..8aeca9b --- /dev/null +++ b/tutorials/pong/lektion3/pong.v @@ -0,0 +1,206 @@ +// Ein einfaches Pong-Spiel fuer das MiST-FPGA-Board +// (c) 2015 Till Harbaum + +// Lektion 3: Joystick + +module pong ( + input [1:0] CLOCK_27, + output SDRAM_nCS, + + // SPI-Schnittstelle zum IO-Prozessor + output SPI_DO, + input SPI_DI, + input SPI_SCK, + input CONF_DATA0, + + output reg VGA_HS, + output reg VGA_VS, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B +); + +wire [7:0] joystick_0; +wire [7:0] joystick_1; + +// Einbindung des user_io.v-Submoduls. Dieses erledigt einen grossen Teil der +// Kommunikation mit dem ARM-IO-Controller des MiST. Wir verwenden hier nur die +// Joysticks +user_io user_io ( + .SPI_CLK ( SPI_SCK ), + .SPI_SS_IO ( CONF_DATA0 ), + .SPI_MISO ( SPI_DO ), + .SPI_MOSI ( SPI_DI ), + + .joystick_0 ( joystick_0 ), + .joystick_1 ( joystick_1 ) +); + + + +// 640x480 60HZ VESA laut http://tinyvga.com/vga-timing/640x480@60Hz +parameter H = 640; // Breite des sichtbaren Bereiches +parameter HFP = 16; // Nicht nutzbarer Bereich vor H-Sync +parameter HS = 96; // Breite des H-Sync +parameter HBP = 48; // Nicht nutzbarer Bereich nach H-Sync + +parameter V = 480; // Höhe des sichtbaren Bereiches +parameter VFP = 10; // Nicht nutzbarer Bereich vor V-Sync +parameter VS = 2; // Höhe des V-Sync +parameter VBP = 33; // Nicht nutzbarer Bereich nach V-Sync + +reg[9:0] h_cnt; // horizontaler Pixelzaehler +reg[9:0] v_cnt; // vertikaler Pixelzaehler + +// Deaktivieren des unbenutzten SDRAMs +assign SDRAM_nCS = 1; + +localparam BORDER = 8; // Höhe des oberen/unteren Randes +localparam BALL_SIZE = 16; // Breite und Höse des Balls +localparam BALL_SPEED = 4; // Schrittweite des Balles pro V-Sync + +// Ballposition +reg [9:0] ball_x, ball_y; + +// Bewegungsrichtung des Balls +reg ball_move_x = 1'b1; +reg ball_move_y = 1'b1; + +// vertikale Position der Paddles + +localparam PADDLE_WIDTH = BALL_SIZE; // Breite des Spielerpaddles +localparam PADDLE_HEIGHT = 4*BALL_SIZE; // Höhe des Spielerpaddles +localparam PADDLE_SPEED = 4; // Schrittweite des Paddles pro V-Sync +reg [9:0] paddle_0_y = VS + VBP + (V - PADDLE_HEIGHT)/2; +reg [9:0] paddle_1_y = VS + VBP + (V - PADDLE_HEIGHT)/2; + +// aktualisiere Paddle-Position in jedem V-Sync +always@(posedge VGA_VS) begin + // bewege linkes Paddle zum oberen Rand, wenn es dort noch nicht angekommen ist + if(joystick_0[3] && (paddle_0_y > VS + VBP + BORDER)) + paddle_0_y <= paddle_0_y - PADDLE_SPEED; + + // bewege linkes Paddle zum unteren Rand, wenn es dort noch nicht angekommen ist + if(joystick_0[2] && (paddle_0_y < VS + VBP + V - BORDER - PADDLE_HEIGHT)) + paddle_0_y <= paddle_0_y + PADDLE_SPEED; + + // bewege rechtes Paddle zum oberen Rand, wenn es dort noch nicht angekommen ist + if(joystick_1[3] && (paddle_1_y > VS + VBP + BORDER)) + paddle_1_y <= paddle_1_y - PADDLE_SPEED; + + // bewege rechtes Paddle zum unteren Rand, wenn es dort noch nicht angekommen ist + if(joystick_1[2] && (paddle_1_y < VS + VBP + V - BORDER - PADDLE_HEIGHT)) + paddle_1_y <= paddle_1_y + PADDLE_SPEED; +end + +// erzeuge Kollisionssignale +wire ball_hits_paddle_0 = + (ball_x < HS+HBP+PADDLE_WIDTH) && // Ball ist im Bereich des linken Paddles + (ball_y > paddle_0_y - BALL_SIZE) && // Ball ist niedriger als Oberkante des Paddles + (ball_y < paddle_0_y + PADDLE_HEIGHT); // Ball ist hoeher als Unterkante des Paddles + +wire ball_hits_paddle_1 = + (ball_x > HS+HBP+H-PADDLE_WIDTH-BALL_SIZE) && // Ball ist im Bereich des rechten Paddles + (ball_y > paddle_1_y - BALL_SIZE) && // Ball ist niedriger als Oberkante des Paddles + (ball_y < paddle_1_y + PADDLE_HEIGHT); // Ball ist hoeher als Unterkante des Paddles + +wire ball_exits_left = ball_x <= HS+HBP; // Ball verlaesst Spielfeld nach links +wire ball_exits_right = ball_x >= HS+HBP+H-BALL_SIZE; // -"- nach rechts + +reg game_running = 1'b0; // Spiel ist gestartet + +// start/stop des Spiels +always@(posedge VGA_VS) begin + // Teste, ob de Ball den linke oder rechten Rand erreicht hat und stoppe + // des Spiel falls ja + if(ball_exits_left || ball_exits_right) + game_running <= 1'b0; + + // jeder Feuer-Button startet des Spiel + if(joystick_0[4] || joystick_1[4]) + game_running <= 1'b1; +end + +// Berechne neue Ballposition bei jedem VSync +always@(posedge VGA_VS) begin + // Aenderung der horizontalen Bewegung, wenn ein Paddle getroffen wird oder + // wenn der Ball das Spielfeld zu verlassen droht + if(ball_hits_paddle_0 || ball_exits_left) ball_move_x <= 1'b1; + if(ball_hits_paddle_1 || ball_exits_right) ball_move_x <= 1'b0; + + // Änderung der vertikalen Bewegung, wenn der Rand erreicht ist + if(ball_y < VS+VBP+BORDER) ball_move_y <= 1'b1; + if(ball_y >= VS+VBP+V-BORDER-BALL_SIZE) ball_move_y <= 1'b0; + + // bewege Ball solange Spiel laeuft + if(game_running) begin + // horizontale Ballbewegung + if(ball_move_x) ball_x <= ball_x + BALL_SPEED; + else ball_x <= ball_x - BALL_SPEED; + + // vertikale Ballbewegung + if(ball_move_y) ball_y <= ball_y + BALL_SPEED; + else ball_y <= ball_y - BALL_SPEED; + end else begin + // Spiel ist gestoppt: Ball in die Mitte + ball_x <= HS + HBP + (H - BALL_SIZE)/2; + ball_y <= VS + VBP + (V - BALL_SIZE)/2; + end +end + +// Beide Zaehler starten mit dem Beginn des Sync-Impulses + +// horizontaler Pixelzaehler +always@(posedge pixel_clock) begin + if(h_cnt==HS+HBP+H+HFP-1) h_cnt <= 0; + else h_cnt <= h_cnt + 1; + + // Erzeugung des negativen H-Sync-Signals + VGA_HS <= (h_cnt >= HS); +end + +// vertikaler Pixelzaehler +always@(posedge pixel_clock) begin + // der vertikale Zustand aendert sich am Anfang jeder Zeile + if(h_cnt == 0) begin + if(v_cnt==VS+VBP+V+VFP-1) v_cnt <= 0; + else v_cnt <= v_cnt + 1; + + // Erzeugung des negativen V-Sync-Signals + VGA_VS <= (v_cnt >= VS); + end +end + +// Signal, das anzeigt, wenn der Elektronenstrahl gerade den Ball zeichnet +wire ball = (h_cnt >= ball_x) && (h_cnt < ball_x + BALL_SIZE) && + (v_cnt >= ball_y) && (v_cnt < ball_y + BALL_SIZE); + +// Oberer und unterer Rand wird gezeichnet: Elektronenstrahl befindet sich +// im horizontalen Spielfeldbereich und entweder innerhalb des oberen +// Randbereiches oder des unteren +wire border = (h_cnt >= HS+HBP) && (h_cnt < HS+HBP+H) && + (((v_cnt >= VS+VBP) && (v_cnt < VS+VBP+BORDER)) || + ((v_cnt >= VS+VBP+V-BORDER) && (v_cnt < VS+VBP+V))); + +// linkes Paddle (paddle 0) wird vom Elektronenstrahl gezeichnet +wire paddle_0 = (h_cnt >= HS+HBP) && (h_cnt < HS+HBP+PADDLE_WIDTH) && + (v_cnt >= paddle_0_y) && (v_cnt < paddle_0_y + PADDLE_HEIGHT); + +// rechtes Paddle (paddle 1) wird vom Elektronenstrahl gezeichnet +wire paddle_1 = (h_cnt >= HS+HBP+H-PADDLE_WIDTH) && (h_cnt < HS+HBP+H) && + (v_cnt >= paddle_1_y) && (v_cnt < paddle_1_y + PADDLE_HEIGHT); + +wire pixel = ball || border || paddle_0 || paddle_1; + +// Weiss, wenn "pixel" sonst schwarz +assign VGA_R = pixel?6'b111111:6'b000000; +assign VGA_G = pixel?6'b111111:6'b000000; +assign VGA_B = pixel?6'b111111:6'b000000; + +// PLL, um aus den 27MHz den VGA-Pixeltakt zu erzeugen +pll pll ( + .inclk0(CLOCK_27[0]), + .c0(pixel_clock) + ); + +endmodule diff --git a/tutorials/pong/lektion3/user_io.v b/tutorials/pong/lektion3/user_io.v new file mode 100644 index 0000000..bae35b1 --- /dev/null +++ b/tutorials/pong/lektion3/user_io.v @@ -0,0 +1,410 @@ +// +// user_io.v +// +// user_io for the MiST board +// http://code.google.com/p/mist-board/ +// +// Copyright (c) 2014 Till Harbaum +// +// This source file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This source file is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +// parameter STRLEN and the actual length of conf_str have to match + +module user_io #(parameter STRLEN=0) ( + input [(8*STRLEN)-1:0] conf_str, + + input SPI_CLK, + input SPI_SS_IO, + output reg SPI_MISO, + input SPI_MOSI, + + output reg [7:0] joystick_0, + output reg [7:0] joystick_1, + output reg [15:0] joystick_analog_0, + output reg [15:0] joystick_analog_1, + output [1:0] buttons, + output [1:0] switches, + + output reg [7:0] status, + + // connection to sd card emulation + input [31:0] sd_lba, + input sd_rd, + input sd_wr, + output reg sd_ack, + input sd_conf, + input sd_sdhc, + output [7:0] sd_dout, // valid on rising edge of sd_dout_strobe + output reg sd_dout_strobe, + input [7:0] sd_din, + output reg sd_din_strobe, + + + // ps2 keyboard emulation + input ps2_clk, // 12-16khz provided by core + output ps2_kbd_clk, + output reg ps2_kbd_data, + output ps2_mouse_clk, + output reg ps2_mouse_data, + + // serial com port + input [7:0] serial_data, + input serial_strobe +); + +reg [6:0] sbuf; +reg [7:0] cmd; +reg [2:0] bit_cnt; // counts bits 0-7 0-7 ... +reg [7:0] byte_cnt; // counts bytes +reg [5:0] joystick0; +reg [5:0] joystick1; +reg [3:0] but_sw; +reg [2:0] stick_idx; + +assign buttons = but_sw[1:0]; +assign switches = but_sw[3:2]; +assign sd_dout = { sbuf, SPI_MOSI}; + +// this variant of user_io is for 8 bit cores (type == a4) only +wire [7:0] core_type = 8'ha4; + +// command byte read by the io controller +wire [7:0] sd_cmd = { 4'h5, sd_conf, sd_sdhc, sd_wr, sd_rd }; + +// filter spi clock. the 8 bit gate delay is ~2.5ns in total +wire [7:0] spi_sck_D = { spi_sck_D[6:0], SPI_CLK } /* synthesis keep */; +wire spi_sck = (spi_sck && spi_sck_D != 8'h00) || (!spi_sck && spi_sck_D == 8'hff); + +// drive MISO only when transmitting core id +always@(negedge spi_sck or posedge SPI_SS_IO) begin + if(SPI_SS_IO == 1) begin + SPI_MISO <= 1'bZ; + end else begin + + // first byte returned is always core type, further bytes are + // command dependent + if(byte_cnt == 0) begin + SPI_MISO <= core_type[~bit_cnt]; + + end else begin + // reading serial fifo + if(cmd == 8'h1b) begin + // send alternating flag byte and data + if(byte_cnt[0]) SPI_MISO <= serial_out_status[~bit_cnt]; + else SPI_MISO <= serial_out_byte[~bit_cnt]; + end + + // reading config string + else if(cmd == 8'h14) begin + // returning a byte from string + if(byte_cnt < STRLEN + 1) + SPI_MISO <= conf_str[{STRLEN - byte_cnt,~bit_cnt}]; + else + SPI_MISO <= 1'b0; + end + + // reading sd card status + else if(cmd == 8'h16) begin + if(byte_cnt == 1) + SPI_MISO <= sd_cmd[~bit_cnt]; + else if((byte_cnt >= 2) && (byte_cnt < 6)) + SPI_MISO <= sd_lba[{5-byte_cnt, ~bit_cnt}]; + else + SPI_MISO <= 1'b0; + end + + // reading sd card write data + else if(cmd == 8'h18) + SPI_MISO <= sd_din[~bit_cnt]; + + else + SPI_MISO <= 1'b0; + end + end +end + +// ---------------- PS2 --------------------- + +// 8 byte fifos to store ps2 bytes +localparam PS2_FIFO_BITS = 3; + +// keyboard +reg [7:0] ps2_kbd_fifo [(2**PS2_FIFO_BITS)-1:0]; +reg [PS2_FIFO_BITS-1:0] ps2_kbd_wptr; +reg [PS2_FIFO_BITS-1:0] ps2_kbd_rptr; + +// ps2 transmitter state machine +reg [3:0] ps2_kbd_tx_state; +reg [7:0] ps2_kbd_tx_byte; +reg ps2_kbd_parity; + +assign ps2_kbd_clk = ps2_clk || (ps2_kbd_tx_state == 0); + +// ps2 transmitter +// Takes a byte from the FIFO and sends it in a ps2 compliant serial format. +reg ps2_kbd_r_inc; +always@(posedge ps2_clk) begin + ps2_kbd_r_inc <= 1'b0; + + if(ps2_kbd_r_inc) + ps2_kbd_rptr <= ps2_kbd_rptr + 1; + + // transmitter is idle? + if(ps2_kbd_tx_state == 0) begin + // data in fifo present? + if(ps2_kbd_wptr != ps2_kbd_rptr) begin + // load tx register from fifo + ps2_kbd_tx_byte <= ps2_kbd_fifo[ps2_kbd_rptr]; + ps2_kbd_r_inc <= 1'b1; + + // reset parity + ps2_kbd_parity <= 1'b1; + + // start transmitter + ps2_kbd_tx_state <= 4'd1; + + // put start bit on data line + ps2_kbd_data <= 1'b0; // start bit is 0 + end + end else begin + + // transmission of 8 data bits + if((ps2_kbd_tx_state >= 1)&&(ps2_kbd_tx_state < 9)) begin + ps2_kbd_data <= ps2_kbd_tx_byte[0]; // data bits + ps2_kbd_tx_byte[6:0] <= ps2_kbd_tx_byte[7:1]; // shift down + if(ps2_kbd_tx_byte[0]) + ps2_kbd_parity <= !ps2_kbd_parity; + end + + // transmission of parity + if(ps2_kbd_tx_state == 9) + ps2_kbd_data <= ps2_kbd_parity; + + // transmission of stop bit + if(ps2_kbd_tx_state == 10) + ps2_kbd_data <= 1'b1; // stop bit is 1 + + // advance state machine + if(ps2_kbd_tx_state < 11) + ps2_kbd_tx_state <= ps2_kbd_tx_state + 4'd1; + else + ps2_kbd_tx_state <= 4'd0; + + end +end + +// mouse +reg [7:0] ps2_mouse_fifo [(2**PS2_FIFO_BITS)-1:0]; +reg [PS2_FIFO_BITS-1:0] ps2_mouse_wptr; +reg [PS2_FIFO_BITS-1:0] ps2_mouse_rptr; + +// ps2 transmitter state machine +reg [3:0] ps2_mouse_tx_state; +reg [7:0] ps2_mouse_tx_byte; +reg ps2_mouse_parity; + +assign ps2_mouse_clk = ps2_clk || (ps2_mouse_tx_state == 0); + +// ps2 transmitter +// Takes a byte from the FIFO and sends it in a ps2 compliant serial format. +reg ps2_mouse_r_inc; +always@(posedge ps2_clk) begin + ps2_mouse_r_inc <= 1'b0; + + if(ps2_mouse_r_inc) + ps2_mouse_rptr <= ps2_mouse_rptr + 1; + + // transmitter is idle? + if(ps2_mouse_tx_state == 0) begin + // data in fifo present? + if(ps2_mouse_wptr != ps2_mouse_rptr) begin + // load tx register from fifo + ps2_mouse_tx_byte <= ps2_mouse_fifo[ps2_mouse_rptr]; + ps2_mouse_r_inc <= 1'b1; + + // reset parity + ps2_mouse_parity <= 1'b1; + + // start transmitter + ps2_mouse_tx_state <= 4'd1; + + // put start bit on data line + ps2_mouse_data <= 1'b0; // start bit is 0 + end + end else begin + + // transmission of 8 data bits + if((ps2_mouse_tx_state >= 1)&&(ps2_mouse_tx_state < 9)) begin + ps2_mouse_data <= ps2_mouse_tx_byte[0]; // data bits + ps2_mouse_tx_byte[6:0] <= ps2_mouse_tx_byte[7:1]; // shift down + if(ps2_mouse_tx_byte[0]) + ps2_mouse_parity <= !ps2_mouse_parity; + end + + // transmission of parity + if(ps2_mouse_tx_state == 9) + ps2_mouse_data <= ps2_mouse_parity; + + // transmission of stop bit + if(ps2_mouse_tx_state == 10) + ps2_mouse_data <= 1'b1; // stop bit is 1 + + // advance state machine + if(ps2_mouse_tx_state < 11) + ps2_mouse_tx_state <= ps2_mouse_tx_state + 4'd1; + else + ps2_mouse_tx_state <= 4'd0; + + end +end + +// fifo to receive serial data from core to be forwarded to io controller + +// 16 byte fifo to store serial bytes +localparam SERIAL_OUT_FIFO_BITS = 6; +reg [7:0] serial_out_fifo [(2**SERIAL_OUT_FIFO_BITS)-1:0]; +reg [SERIAL_OUT_FIFO_BITS-1:0] serial_out_wptr; +reg [SERIAL_OUT_FIFO_BITS-1:0] serial_out_rptr; + +wire serial_out_data_available = serial_out_wptr != serial_out_rptr; +wire [7:0] serial_out_byte = serial_out_fifo[serial_out_rptr] /* synthesis keep */; +wire [7:0] serial_out_status = { 7'b1000000, serial_out_data_available}; + +// status[0] is reset signal from io controller and is thus used to flush +// the fifo +always @(posedge serial_strobe or posedge status[0]) begin + if(status[0] == 1) begin + serial_out_wptr <= 0; + end else begin + serial_out_fifo[serial_out_wptr] <= serial_data; + serial_out_wptr <= serial_out_wptr + 1; + end +end + +always@(negedge spi_sck or posedge status[0]) begin + if(status[0] == 1) begin + serial_out_rptr <= 0; + end else begin + if((byte_cnt != 0) && (cmd == 8'h1b)) begin + // read last bit -> advance read pointer + if((bit_cnt == 7) && !byte_cnt[0] && serial_out_data_available) + serial_out_rptr <= serial_out_rptr + 1; + end + end +end + +// SPI receiver +always@(posedge spi_sck or posedge SPI_SS_IO) begin + + if(SPI_SS_IO == 1) begin + bit_cnt <= 3'd0; + byte_cnt <= 8'd0; + sd_ack <= 1'b0; + sd_dout_strobe <= 1'b0; + sd_din_strobe <= 1'b0; + end else begin + sd_dout_strobe <= 1'b0; + sd_din_strobe <= 1'b0; + + sbuf[6:0] <= { sbuf[5:0], SPI_MOSI }; + bit_cnt <= bit_cnt + 3'd1; + if((bit_cnt == 7)&&(byte_cnt != 8'd255)) + byte_cnt <= byte_cnt + 8'd1; + + // finished reading command byte + if(bit_cnt == 7) begin + if(byte_cnt == 0) begin + cmd <= { sbuf, SPI_MOSI}; + + // fetch first byte when sectore FPGA->IO command has been seen + if({ sbuf, SPI_MOSI} == 8'h18) + sd_din_strobe <= 1'b1; + + if(({ sbuf, SPI_MOSI} == 8'h17) || ({ sbuf, SPI_MOSI} == 8'h18)) + sd_ack <= 1'b1; + + end else begin + + // buttons and switches + if(cmd == 8'h01) + but_sw <= { sbuf[2:0], SPI_MOSI }; + + if(cmd == 8'h02) + joystick_0 <= { sbuf, SPI_MOSI }; + + if(cmd == 8'h03) + joystick_1 <= { sbuf, SPI_MOSI }; + + if(cmd == 8'h04) begin + // store incoming ps2 mouse bytes + ps2_mouse_fifo[ps2_mouse_wptr] <= { sbuf, SPI_MOSI }; + ps2_mouse_wptr <= ps2_mouse_wptr + 1; + end + + if(cmd == 8'h05) begin + // store incoming ps2 keyboard bytes + ps2_kbd_fifo[ps2_kbd_wptr] <= { sbuf, SPI_MOSI }; + ps2_kbd_wptr <= ps2_kbd_wptr + 1; + end + + if(cmd == 8'h15) + status <= { sbuf[6:0], SPI_MOSI }; + + // send sector IO -> FPGA + if(cmd == 8'h17) begin + // flag that download begins +// sd_dout <= { sbuf, SPI_MOSI}; + sd_dout_strobe <= 1'b1; + end + + // send sector FPGA -> IO + if(cmd == 8'h18) + sd_din_strobe <= 1'b1; + + // send SD config IO -> FPGA + if(cmd == 8'h19) begin + // flag that download begins +// sd_dout <= { sbuf, SPI_MOSI}; + // sd card knows data is config if sd_dout_strobe is asserted + // with sd_ack still being inactive (low) + sd_dout_strobe <= 1'b1; + end + + // joystick analog + if(cmd == 8'h1a) begin + // first byte is joystick indes + if(byte_cnt == 1) + stick_idx <= { sbuf[1:0], SPI_MOSI }; + else if(byte_cnt == 2) begin + // second byte is x axis + if(stick_idx == 0) + joystick_analog_0[15:8] <= { sbuf, SPI_MOSI }; + else if(stick_idx == 1) + joystick_analog_1[15:8] <= { sbuf, SPI_MOSI }; + end else if(byte_cnt == 3) begin + // third byte is y axis + if(stick_idx == 0) + joystick_analog_0[7:0] <= { sbuf, SPI_MOSI }; + else if(stick_idx == 1) + joystick_analog_1[7:0] <= { sbuf, SPI_MOSI }; + end + end + + end + end + end +end + +endmodule diff --git a/tutorials/pong/lesson1/pll.qip b/tutorials/pong/lesson1/pll.qip new file mode 100644 index 0000000..8faa322 --- /dev/null +++ b/tutorials/pong/lesson1/pll.qip @@ -0,0 +1,6 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "pll.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_inst.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_bb.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/tutorials/pong/lesson1/pll.v b/tutorials/pong/lesson1/pll.v new file mode 100644 index 0000000..5c34ae7 --- /dev/null +++ b/tutorials/pong/lesson1/pll.v @@ -0,0 +1,301 @@ +// megafunction wizard: %ALTPLL% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altpll + +// ============================================================ +// File Name: pll.v +// Megafunction Name(s): +// altpll +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2014 Altera Corporation +//Your use of Altera Corporation's design tools, logic functions +//and other software and tools, and its AMPP partner logic +//functions, and any output files from any of the foregoing +//(including device programming or simulation files), and any +//associated documentation or information are expressly subject +//to the terms and conditions of the Altera Program License +//Subscription Agreement, Altera MegaCore Function License +//Agreement, or other applicable license agreement, including, +//without limitation, that your use is for the sole purpose of +//programming logic devices manufactured by Altera and sold by +//Altera or its authorized distributors. Please refer to the +//applicable agreement for further details. + + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on +module pll ( + inclk0, + c0); + + input inclk0; + output c0; + + wire [4:0] sub_wire0; + wire [0:0] sub_wire4 = 1'h0; + wire [0:0] sub_wire1 = sub_wire0[0:0]; + wire c0 = sub_wire1; + wire sub_wire2 = inclk0; + wire [1:0] sub_wire3 = {sub_wire4, sub_wire2}; + + altpll altpll_component ( + .inclk (sub_wire3), + .clk (sub_wire0), + .activeclock (), + .areset (1'b0), + .clkbad (), + .clkena ({6{1'b1}}), + .clkloss (), + .clkswitch (1'b0), + .configupdate (1'b0), + .enable0 (), + .enable1 (), + .extclk (), + .extclkena ({4{1'b1}}), + .fbin (1'b1), + .fbmimicbidir (), + .fbout (), + .fref (), + .icdrclk (), + .locked (), + .pfdena (1'b1), + .phasecounterselect ({4{1'b1}}), + .phasedone (), + .phasestep (1'b1), + .phaseupdown (1'b1), + .pllena (1'b1), + .scanaclr (1'b0), + .scanclk (1'b0), + .scanclkena (1'b1), + .scandata (1'b0), + .scandataout (), + .scandone (), + .scanread (1'b0), + .scanwrite (1'b0), + .sclkout0 (), + .sclkout1 (), + .vcooverrange (), + .vcounderrange ()); + defparam + altpll_component.bandwidth_type = "AUTO", + altpll_component.clk0_divide_by = 44, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 41, + altpll_component.clk0_phase_shift = "0", + altpll_component.compensate_clock = "CLK0", + altpll_component.inclk0_input_frequency = 37037, + altpll_component.intended_device_family = "Cyclone III", + altpll_component.lpm_hint = "CBX_MODULE_PREFIX=pll", + altpll_component.lpm_type = "altpll", + altpll_component.operation_mode = "NORMAL", + altpll_component.pll_type = "AUTO", + altpll_component.port_activeclock = "PORT_UNUSED", + altpll_component.port_areset = "PORT_UNUSED", + altpll_component.port_clkbad0 = "PORT_UNUSED", + altpll_component.port_clkbad1 = "PORT_UNUSED", + altpll_component.port_clkloss = "PORT_UNUSED", + altpll_component.port_clkswitch = "PORT_UNUSED", + altpll_component.port_configupdate = "PORT_UNUSED", + altpll_component.port_fbin = "PORT_UNUSED", + altpll_component.port_inclk0 = "PORT_USED", + altpll_component.port_inclk1 = "PORT_UNUSED", + altpll_component.port_locked = "PORT_UNUSED", + altpll_component.port_pfdena = "PORT_UNUSED", + altpll_component.port_phasecounterselect = "PORT_UNUSED", + altpll_component.port_phasedone = "PORT_UNUSED", + altpll_component.port_phasestep = "PORT_UNUSED", + altpll_component.port_phaseupdown = "PORT_UNUSED", + altpll_component.port_pllena = "PORT_UNUSED", + altpll_component.port_scanaclr = "PORT_UNUSED", + altpll_component.port_scanclk = "PORT_UNUSED", + altpll_component.port_scanclkena = "PORT_UNUSED", + altpll_component.port_scandata = "PORT_UNUSED", + altpll_component.port_scandataout = "PORT_UNUSED", + altpll_component.port_scandone = "PORT_UNUSED", + altpll_component.port_scanread = "PORT_UNUSED", + altpll_component.port_scanwrite = "PORT_UNUSED", + altpll_component.port_clk0 = "PORT_USED", + altpll_component.port_clk1 = "PORT_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + altpll_component.port_clk3 = "PORT_UNUSED", + altpll_component.port_clk4 = "PORT_UNUSED", + altpll_component.port_clk5 = "PORT_UNUSED", + altpll_component.port_clkena0 = "PORT_UNUSED", + altpll_component.port_clkena1 = "PORT_UNUSED", + altpll_component.port_clkena2 = "PORT_UNUSED", + altpll_component.port_clkena3 = "PORT_UNUSED", + altpll_component.port_clkena4 = "PORT_UNUSED", + altpll_component.port_clkena5 = "PORT_UNUSED", + altpll_component.port_extclk0 = "PORT_UNUSED", + altpll_component.port_extclk1 = "PORT_UNUSED", + altpll_component.port_extclk2 = "PORT_UNUSED", + altpll_component.port_extclk3 = "PORT_UNUSED", + altpll_component.width_clock = 5; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +// Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +// Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +// Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +// Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +// Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +// Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +// Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +// Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +// Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +// Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +// Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "44" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "25.159090" +// Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +// Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +// Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +// Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +// Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +// Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "41" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "25.17500000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +// Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +// Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +// Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +// Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +// Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +// Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +// Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +// Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +// Retrieval info: PRIVATE: SPREAD_USE STRING "0" +// Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +// Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +// Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +// Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: USE_CLK0 STRING "1" +// Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +// Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +// Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "44" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "41" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +// Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +// Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +// Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +// Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +// Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_bb.v TRUE +// Retrieval info: LIB_FILE: altera_mf +// Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/tutorials/pong/lesson1/pong.qpf b/tutorials/pong/lesson1/pong.qpf new file mode 100644 index 0000000..bce3c64 --- /dev/null +++ b/tutorials/pong/lesson1/pong.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2010 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II +# Version 10.1 Build 153 11/29/2010 SJ Full Version +# Date created = 11:11:11 June 13, 2011 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "10.1" +DATE = "11:11:11 June 13, 2011" + +# Revisions + +PROJECT_REVISION = "pong" diff --git a/tutorials/pong/lesson1/pong.qsf b/tutorials/pong/lesson1/pong.qsf new file mode 100644 index 0000000..0485763 --- /dev/null +++ b/tutorials/pong/lesson1/pong.qsf @@ -0,0 +1,157 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2011 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II +# Version 11.0 Build 157 04/27/2011 SJ Full Version +# Date created = 17:14:01 April 10, 2012 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# led_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name TOP_LEVEL_ENTITY pong +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 11.0 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "17:14:01 APRIL 10, 2012" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name DEVICE_FILTER_PACKAGE "ANY QFP" +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "AS INPUT TRI-STATED" +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" + +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_22 -to CLOCK_50[0] +set_location_assignment PIN_23 -to CLOCK_50[1] +set_location_assignment PIN_128 -to CLOCK_32[0] +set_location_assignment PIN_129 -to CLOCK_32[1] +set_location_assignment PIN_54 -to CLOCK_27[0] +set_location_assignment PIN_55 -to CLOCK_27[1] +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_46 -to UART_TX +set_location_assignment PIN_31 -to UART_RX +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_90 -to SPI_SS4 +set_location_assignment PIN_13 -to CONF_DATA0 + +set_location_assignment PIN_49 -to SDRAM_A[0] +set_location_assignment PIN_44 -to SDRAM_A[1] +set_location_assignment PIN_42 -to SDRAM_A[2] +set_location_assignment PIN_39 -to SDRAM_A[3] +set_location_assignment PIN_4 -to SDRAM_A[4] +set_location_assignment PIN_6 -to SDRAM_A[5] +set_location_assignment PIN_8 -to SDRAM_A[6] +set_location_assignment PIN_10 -to SDRAM_A[7] +set_location_assignment PIN_11 -to SDRAM_A[8] +set_location_assignment PIN_28 -to SDRAM_A[9] +set_location_assignment PIN_50 -to SDRAM_A[10] +set_location_assignment PIN_30 -to SDRAM_A[11] +set_location_assignment PIN_32 -to SDRAM_A[12] +set_location_assignment PIN_83 -to SDRAM_DQ[0] +set_location_assignment PIN_79 -to SDRAM_DQ[1] +set_location_assignment PIN_77 -to SDRAM_DQ[2] +set_location_assignment PIN_76 -to SDRAM_DQ[3] +set_location_assignment PIN_72 -to SDRAM_DQ[4] +set_location_assignment PIN_71 -to SDRAM_DQ[5] +set_location_assignment PIN_69 -to SDRAM_DQ[6] +set_location_assignment PIN_68 -to SDRAM_DQ[7] +set_location_assignment PIN_86 -to SDRAM_DQ[8] +set_location_assignment PIN_87 -to SDRAM_DQ[9] +set_location_assignment PIN_98 -to SDRAM_DQ[10] +set_location_assignment PIN_99 -to SDRAM_DQ[11] +set_location_assignment PIN_100 -to SDRAM_DQ[12] +set_location_assignment PIN_101 -to SDRAM_DQ[13] +set_location_assignment PIN_103 -to SDRAM_DQ[14] +set_location_assignment PIN_104 -to SDRAM_DQ[15] +set_location_assignment PIN_58 -to SDRAM_BA[0] +set_location_assignment PIN_51 -to SDRAM_BA[1] +set_location_assignment PIN_85 -to SDRAM_DQMH +set_location_assignment PIN_67 -to SDRAM_DQML +set_location_assignment PIN_60 -to SDRAM_nRAS +set_location_assignment PIN_64 -to SDRAM_nCAS +set_location_assignment PIN_66 -to SDRAM_nWE +set_location_assignment PIN_59 -to SDRAM_nCS +set_location_assignment PIN_33 -to SDRAM_CKE +set_location_assignment PIN_43 -to SDRAM_CLK + + +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name VERILOG_FILE pll.v +set_global_assignment -name VERILOG_FILE pong.v +set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON +set_global_assignment -name FITTER_EFFORT "FAST FIT" +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/tutorials/pong/lesson1/pong.rbf b/tutorials/pong/lesson1/pong.rbf new file mode 100644 index 0000000000000000000000000000000000000000..d63fce7f074cb90de90eb73a4485f63a6ed29a9f GIT binary patch literal 206006 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 BzBvE@ literal 0 HcmV?d00001 diff --git a/tutorials/pong/lesson1/pong.v b/tutorials/pong/lesson1/pong.v new file mode 100644 index 0000000..2ed6fca --- /dev/null +++ b/tutorials/pong/lesson1/pong.v @@ -0,0 +1,79 @@ +// A simple pong game for the MIST FPGA board +// (c) 2015 Till Harbaum + +// Lesson 1: VGA signal with ball + +module pong ( + input [1:0] CLOCK_27, + output SDRAM_nCS, + output reg VGA_HS, + output reg VGA_VS, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B +); + +// 640x480 60HZ VESA laut http://tinyvga.com/vga-timing/640x480@60Hz +parameter H = 640; // width of visible area +parameter HFP = 16; // unused area before h sync +parameter HS = 96; // length of h sync +parameter HBP = 48; // unused area after h sync + +parameter V = 480; // height of visible area +parameter VFP = 10; // unused area before v sync +parameter VS = 2; // length of v sync +parameter VBP = 33; // unused area after v sync + +reg[9:0] h_cnt; // horizontal pixel counter +reg[9:0] v_cnt; // vertical pixel counter + +// deactivate unused sdram +assign SDRAM_nCS = 1; + +localparam BALL_SIZE = 16; // width and height of ball + +// ball starts in center of visible area +reg [9:0] ball_x = HS + HBP + (H - BALL_SIZE)/2; +reg [9:0] ball_y = VS + VBP + (V - BALL_SIZE)/2; + +// both counters start with the begin of the sync phases + +// horizontal pixel counter +always@(posedge pixel_clock) begin + if(h_cnt==HS+HBP+H+HFP-1) h_cnt <= 0; + else h_cnt <= h_cnt + 1; + + // generation of the negative h sync signal + VGA_HS <= (h_cnt >= HS); +end + +// vertical pixel counter +always@(posedge pixel_clock) begin + // the vertical state changes at the begin of each line + if(h_cnt == 0) begin + if(v_cnt==VS+VBP+V+VFP-1) v_cnt <= 0; + else v_cnt <= v_cnt + 1; + + // generation of the negative v sync signal + VGA_VS <= (v_cnt >= VS); + end +end + +// signal indicating the presence of the ball at the current beam position +wire ball = (h_cnt >= ball_x) && (h_cnt < ball_x + BALL_SIZE) && + (v_cnt >= ball_y) && (v_cnt < ball_y + BALL_SIZE); + +wire pixel = ball; + +// white if pixel, black otherwise +assign VGA_R = pixel?6'b111111:6'b000000; +assign VGA_G = pixel?6'b111111:6'b000000; +assign VGA_B = pixel?6'b111111:6'b000000; + +// pll to generate the VGA pixel clock from the 27Mhz board clock +pll pll ( + .inclk0(CLOCK_27[0]), + .c0(pixel_clock) + ); + +endmodule diff --git a/tutorials/pong/lesson2/pll.qip b/tutorials/pong/lesson2/pll.qip new file mode 100644 index 0000000..8faa322 --- /dev/null +++ b/tutorials/pong/lesson2/pll.qip @@ -0,0 +1,6 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "pll.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_inst.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_bb.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/tutorials/pong/lesson2/pll.v b/tutorials/pong/lesson2/pll.v new file mode 100644 index 0000000..5c34ae7 --- /dev/null +++ b/tutorials/pong/lesson2/pll.v @@ -0,0 +1,301 @@ +// megafunction wizard: %ALTPLL% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altpll + +// ============================================================ +// File Name: pll.v +// Megafunction Name(s): +// altpll +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2014 Altera Corporation +//Your use of Altera Corporation's design tools, logic functions +//and other software and tools, and its AMPP partner logic +//functions, and any output files from any of the foregoing +//(including device programming or simulation files), and any +//associated documentation or information are expressly subject +//to the terms and conditions of the Altera Program License +//Subscription Agreement, Altera MegaCore Function License +//Agreement, or other applicable license agreement, including, +//without limitation, that your use is for the sole purpose of +//programming logic devices manufactured by Altera and sold by +//Altera or its authorized distributors. Please refer to the +//applicable agreement for further details. + + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on +module pll ( + inclk0, + c0); + + input inclk0; + output c0; + + wire [4:0] sub_wire0; + wire [0:0] sub_wire4 = 1'h0; + wire [0:0] sub_wire1 = sub_wire0[0:0]; + wire c0 = sub_wire1; + wire sub_wire2 = inclk0; + wire [1:0] sub_wire3 = {sub_wire4, sub_wire2}; + + altpll altpll_component ( + .inclk (sub_wire3), + .clk (sub_wire0), + .activeclock (), + .areset (1'b0), + .clkbad (), + .clkena ({6{1'b1}}), + .clkloss (), + .clkswitch (1'b0), + .configupdate (1'b0), + .enable0 (), + .enable1 (), + .extclk (), + .extclkena ({4{1'b1}}), + .fbin (1'b1), + .fbmimicbidir (), + .fbout (), + .fref (), + .icdrclk (), + .locked (), + .pfdena (1'b1), + .phasecounterselect ({4{1'b1}}), + .phasedone (), + .phasestep (1'b1), + .phaseupdown (1'b1), + .pllena (1'b1), + .scanaclr (1'b0), + .scanclk (1'b0), + .scanclkena (1'b1), + .scandata (1'b0), + .scandataout (), + .scandone (), + .scanread (1'b0), + .scanwrite (1'b0), + .sclkout0 (), + .sclkout1 (), + .vcooverrange (), + .vcounderrange ()); + defparam + altpll_component.bandwidth_type = "AUTO", + altpll_component.clk0_divide_by = 44, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 41, + altpll_component.clk0_phase_shift = "0", + altpll_component.compensate_clock = "CLK0", + altpll_component.inclk0_input_frequency = 37037, + altpll_component.intended_device_family = "Cyclone III", + altpll_component.lpm_hint = "CBX_MODULE_PREFIX=pll", + altpll_component.lpm_type = "altpll", + altpll_component.operation_mode = "NORMAL", + altpll_component.pll_type = "AUTO", + altpll_component.port_activeclock = "PORT_UNUSED", + altpll_component.port_areset = "PORT_UNUSED", + altpll_component.port_clkbad0 = "PORT_UNUSED", + altpll_component.port_clkbad1 = "PORT_UNUSED", + altpll_component.port_clkloss = "PORT_UNUSED", + altpll_component.port_clkswitch = "PORT_UNUSED", + altpll_component.port_configupdate = "PORT_UNUSED", + altpll_component.port_fbin = "PORT_UNUSED", + altpll_component.port_inclk0 = "PORT_USED", + altpll_component.port_inclk1 = "PORT_UNUSED", + altpll_component.port_locked = "PORT_UNUSED", + altpll_component.port_pfdena = "PORT_UNUSED", + altpll_component.port_phasecounterselect = "PORT_UNUSED", + altpll_component.port_phasedone = "PORT_UNUSED", + altpll_component.port_phasestep = "PORT_UNUSED", + altpll_component.port_phaseupdown = "PORT_UNUSED", + altpll_component.port_pllena = "PORT_UNUSED", + altpll_component.port_scanaclr = "PORT_UNUSED", + altpll_component.port_scanclk = "PORT_UNUSED", + altpll_component.port_scanclkena = "PORT_UNUSED", + altpll_component.port_scandata = "PORT_UNUSED", + altpll_component.port_scandataout = "PORT_UNUSED", + altpll_component.port_scandone = "PORT_UNUSED", + altpll_component.port_scanread = "PORT_UNUSED", + altpll_component.port_scanwrite = "PORT_UNUSED", + altpll_component.port_clk0 = "PORT_USED", + altpll_component.port_clk1 = "PORT_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + altpll_component.port_clk3 = "PORT_UNUSED", + altpll_component.port_clk4 = "PORT_UNUSED", + altpll_component.port_clk5 = "PORT_UNUSED", + altpll_component.port_clkena0 = "PORT_UNUSED", + altpll_component.port_clkena1 = "PORT_UNUSED", + altpll_component.port_clkena2 = "PORT_UNUSED", + altpll_component.port_clkena3 = "PORT_UNUSED", + altpll_component.port_clkena4 = "PORT_UNUSED", + altpll_component.port_clkena5 = "PORT_UNUSED", + altpll_component.port_extclk0 = "PORT_UNUSED", + altpll_component.port_extclk1 = "PORT_UNUSED", + altpll_component.port_extclk2 = "PORT_UNUSED", + altpll_component.port_extclk3 = "PORT_UNUSED", + altpll_component.width_clock = 5; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +// Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +// Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +// Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +// Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +// Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +// Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +// Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +// Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +// Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +// Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +// Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "44" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "25.159090" +// Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +// Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +// Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +// Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +// Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +// Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "41" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "25.17500000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +// Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +// Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +// Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +// Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +// Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +// Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +// Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +// Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +// Retrieval info: PRIVATE: SPREAD_USE STRING "0" +// Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +// Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +// Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +// Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: USE_CLK0 STRING "1" +// Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +// Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +// Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "44" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "41" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +// Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +// Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +// Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +// Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +// Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_bb.v TRUE +// Retrieval info: LIB_FILE: altera_mf +// Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/tutorials/pong/lesson2/pong.qpf b/tutorials/pong/lesson2/pong.qpf new file mode 100644 index 0000000..bce3c64 --- /dev/null +++ b/tutorials/pong/lesson2/pong.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2010 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II +# Version 10.1 Build 153 11/29/2010 SJ Full Version +# Date created = 11:11:11 June 13, 2011 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "10.1" +DATE = "11:11:11 June 13, 2011" + +# Revisions + +PROJECT_REVISION = "pong" diff --git a/tutorials/pong/lesson2/pong.qsf b/tutorials/pong/lesson2/pong.qsf new file mode 100644 index 0000000..0485763 --- /dev/null +++ b/tutorials/pong/lesson2/pong.qsf @@ -0,0 +1,157 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2011 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II +# Version 11.0 Build 157 04/27/2011 SJ Full Version +# Date created = 17:14:01 April 10, 2012 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# led_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name TOP_LEVEL_ENTITY pong +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 11.0 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "17:14:01 APRIL 10, 2012" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name DEVICE_FILTER_PACKAGE "ANY QFP" +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "AS INPUT TRI-STATED" +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" + +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_22 -to CLOCK_50[0] +set_location_assignment PIN_23 -to CLOCK_50[1] +set_location_assignment PIN_128 -to CLOCK_32[0] +set_location_assignment PIN_129 -to CLOCK_32[1] +set_location_assignment PIN_54 -to CLOCK_27[0] +set_location_assignment PIN_55 -to CLOCK_27[1] +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_46 -to UART_TX +set_location_assignment PIN_31 -to UART_RX +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_90 -to SPI_SS4 +set_location_assignment PIN_13 -to CONF_DATA0 + +set_location_assignment PIN_49 -to SDRAM_A[0] +set_location_assignment PIN_44 -to SDRAM_A[1] +set_location_assignment PIN_42 -to SDRAM_A[2] +set_location_assignment PIN_39 -to SDRAM_A[3] +set_location_assignment PIN_4 -to SDRAM_A[4] +set_location_assignment PIN_6 -to SDRAM_A[5] +set_location_assignment PIN_8 -to SDRAM_A[6] +set_location_assignment PIN_10 -to SDRAM_A[7] +set_location_assignment PIN_11 -to SDRAM_A[8] +set_location_assignment PIN_28 -to SDRAM_A[9] +set_location_assignment PIN_50 -to SDRAM_A[10] +set_location_assignment PIN_30 -to SDRAM_A[11] +set_location_assignment PIN_32 -to SDRAM_A[12] +set_location_assignment PIN_83 -to SDRAM_DQ[0] +set_location_assignment PIN_79 -to SDRAM_DQ[1] +set_location_assignment PIN_77 -to SDRAM_DQ[2] +set_location_assignment PIN_76 -to SDRAM_DQ[3] +set_location_assignment PIN_72 -to SDRAM_DQ[4] +set_location_assignment PIN_71 -to SDRAM_DQ[5] +set_location_assignment PIN_69 -to SDRAM_DQ[6] +set_location_assignment PIN_68 -to SDRAM_DQ[7] +set_location_assignment PIN_86 -to SDRAM_DQ[8] +set_location_assignment PIN_87 -to SDRAM_DQ[9] +set_location_assignment PIN_98 -to SDRAM_DQ[10] +set_location_assignment PIN_99 -to SDRAM_DQ[11] +set_location_assignment PIN_100 -to SDRAM_DQ[12] +set_location_assignment PIN_101 -to SDRAM_DQ[13] +set_location_assignment PIN_103 -to SDRAM_DQ[14] +set_location_assignment PIN_104 -to SDRAM_DQ[15] +set_location_assignment PIN_58 -to SDRAM_BA[0] +set_location_assignment PIN_51 -to SDRAM_BA[1] +set_location_assignment PIN_85 -to SDRAM_DQMH +set_location_assignment PIN_67 -to SDRAM_DQML +set_location_assignment PIN_60 -to SDRAM_nRAS +set_location_assignment PIN_64 -to SDRAM_nCAS +set_location_assignment PIN_66 -to SDRAM_nWE +set_location_assignment PIN_59 -to SDRAM_nCS +set_location_assignment PIN_33 -to SDRAM_CKE +set_location_assignment PIN_43 -to SDRAM_CLK + + +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name VERILOG_FILE pll.v +set_global_assignment -name VERILOG_FILE pong.v +set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON +set_global_assignment -name FITTER_EFFORT "FAST FIT" +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/tutorials/pong/lesson2/pong.rbf b/tutorials/pong/lesson2/pong.rbf new file mode 100644 index 0000000000000000000000000000000000000000..1f7de8bc4a5b7691d0bcb85f37d1ddf82b1788eb GIT binary patch literal 206565 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 E0j|g3rT_o{ literal 0 HcmV?d00001 diff --git a/tutorials/pong/lesson2/pong.v b/tutorials/pong/lesson2/pong.v new file mode 100644 index 0000000..9bb48b8 --- /dev/null +++ b/tutorials/pong/lesson2/pong.v @@ -0,0 +1,110 @@ +// A simple pong game for the MIST FPGA board +// (c) 2015 Till Harbaum + +// Lesson 2: A moving ball + +module pong ( + input [1:0] CLOCK_27, + output SDRAM_nCS, + output reg VGA_HS, + output reg VGA_VS, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B +); + +// 640x480 60HZ VESA laut http://tinyvga.com/vga-timing/640x480@60Hz +parameter H = 640; // width of visible area +parameter HFP = 16; // unused area before h sync +parameter HS = 96; // length of h sync +parameter HBP = 48; // unused area after h sync + +parameter V = 480; // height of visible area +parameter VFP = 10; // unused area before v sync +parameter VS = 2; // length of v sync +parameter VBP = 33; // unused area after v sync + +reg[9:0] h_cnt; // horizontal pixel counter +reg[9:0] v_cnt; // vertical pixel counter + +// deactivate unused sdram +assign SDRAM_nCS = 1; + +localparam BORDER = 8; // height of top and bottom border +localparam BALL_SIZE = 16; // width and height of ball +localparam BALL_SPEED = 4; // step width of ball per v sync + +// ball starts in center of visible area +reg [9:0] ball_x = HS + HBP + (H - BALL_SIZE)/2; +reg [9:0] ball_y = VS + VBP + (V - BALL_SIZE)/2; + +// balls direction of movement +reg ball_move_x = 1'b1; +reg ball_move_y = 1'b1; + +// calculate new ball position each v sync +always@(posedge VGA_VS) begin + // change horizontal movement if border has been reached + if(ball_x < HS+HBP) ball_move_x <= 1'b1; + if(ball_x >= HS+HBP+H-BALL_SIZE) ball_move_x <= 1'b0; + + // horizontal movement + if(ball_move_x) ball_x <= ball_x + BALL_SPEED; + else ball_x <= ball_x - BALL_SPEED; + + // change vertical movement if border has been reached + if(ball_y < VS+VBP+BORDER) ball_move_y <= 1'b1; + if(ball_y >= VS+VBP+V-BORDER-BALL_SIZE) ball_move_y <= 1'b0; + + // vertical movement + if(ball_move_y) ball_y <= ball_y + BALL_SPEED; + else ball_y <= ball_y - BALL_SPEED; +end + +// both counters start with the begin of the sync phases + +// horizontal pixel counter +always@(posedge pixel_clock) begin + if(h_cnt==HS+HBP+H+HFP-1) h_cnt <= 0; + else h_cnt <= h_cnt + 1; + + // generation of the negative h sync signal + VGA_HS <= (h_cnt >= HS); +end + +// vertical pixel counter +always@(posedge pixel_clock) begin + // the vertical state changes at the begin of each line + if(h_cnt == 0) begin + if(v_cnt==VS+VBP+V+VFP-1) v_cnt <= 0; + else v_cnt <= v_cnt + 1; + + // generation of the negative v sync signal + VGA_VS <= (v_cnt >= VS); + end +end + +// signal indicating the presence of the ball at the current beam position +wire ball = (h_cnt >= ball_x) && (h_cnt < ball_x + BALL_SIZE) && + (v_cnt >= ball_y) && (v_cnt < ball_y + BALL_SIZE); + +// top and bottom border: is being painted of the beam is horizontally within +// the playing area and vertically within the border area +wire border = (h_cnt >= HS+HBP) && (h_cnt < HS+HBP+H) && + (((v_cnt >= VS+VBP) && (v_cnt < VS+VBP+BORDER)) || + ((v_cnt >= VS+VBP+V-BORDER) && (v_cnt < VS+VBP+V))); + +wire pixel = ball || border; + +// white if pixel, black otherwise +assign VGA_R = pixel?6'b111111:6'b000000; +assign VGA_G = pixel?6'b111111:6'b000000; +assign VGA_B = pixel?6'b111111:6'b000000; + +// pll to generate the VGA pixel clock from the 27Mhz board clock +pll pll ( + .inclk0(CLOCK_27[0]), + .c0(pixel_clock) + ); + +endmodule diff --git a/tutorials/pong/lesson3/pll.qip b/tutorials/pong/lesson3/pll.qip new file mode 100644 index 0000000..8faa322 --- /dev/null +++ b/tutorials/pong/lesson3/pll.qip @@ -0,0 +1,6 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "pll.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_inst.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_bb.v"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"] diff --git a/tutorials/pong/lesson3/pll.v b/tutorials/pong/lesson3/pll.v new file mode 100644 index 0000000..5c34ae7 --- /dev/null +++ b/tutorials/pong/lesson3/pll.v @@ -0,0 +1,301 @@ +// megafunction wizard: %ALTPLL% +// GENERATION: STANDARD +// VERSION: WM1.0 +// MODULE: altpll + +// ============================================================ +// File Name: pll.v +// Megafunction Name(s): +// altpll +// +// Simulation Library Files(s): +// altera_mf +// ============================================================ +// ************************************************************ +// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +// +// 13.1.4 Build 182 03/12/2014 SJ Web Edition +// ************************************************************ + + +//Copyright (C) 1991-2014 Altera Corporation +//Your use of Altera Corporation's design tools, logic functions +//and other software and tools, and its AMPP partner logic +//functions, and any output files from any of the foregoing +//(including device programming or simulation files), and any +//associated documentation or information are expressly subject +//to the terms and conditions of the Altera Program License +//Subscription Agreement, Altera MegaCore Function License +//Agreement, or other applicable license agreement, including, +//without limitation, that your use is for the sole purpose of +//programming logic devices manufactured by Altera and sold by +//Altera or its authorized distributors. Please refer to the +//applicable agreement for further details. + + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on +module pll ( + inclk0, + c0); + + input inclk0; + output c0; + + wire [4:0] sub_wire0; + wire [0:0] sub_wire4 = 1'h0; + wire [0:0] sub_wire1 = sub_wire0[0:0]; + wire c0 = sub_wire1; + wire sub_wire2 = inclk0; + wire [1:0] sub_wire3 = {sub_wire4, sub_wire2}; + + altpll altpll_component ( + .inclk (sub_wire3), + .clk (sub_wire0), + .activeclock (), + .areset (1'b0), + .clkbad (), + .clkena ({6{1'b1}}), + .clkloss (), + .clkswitch (1'b0), + .configupdate (1'b0), + .enable0 (), + .enable1 (), + .extclk (), + .extclkena ({4{1'b1}}), + .fbin (1'b1), + .fbmimicbidir (), + .fbout (), + .fref (), + .icdrclk (), + .locked (), + .pfdena (1'b1), + .phasecounterselect ({4{1'b1}}), + .phasedone (), + .phasestep (1'b1), + .phaseupdown (1'b1), + .pllena (1'b1), + .scanaclr (1'b0), + .scanclk (1'b0), + .scanclkena (1'b1), + .scandata (1'b0), + .scandataout (), + .scandone (), + .scanread (1'b0), + .scanwrite (1'b0), + .sclkout0 (), + .sclkout1 (), + .vcooverrange (), + .vcounderrange ()); + defparam + altpll_component.bandwidth_type = "AUTO", + altpll_component.clk0_divide_by = 44, + altpll_component.clk0_duty_cycle = 50, + altpll_component.clk0_multiply_by = 41, + altpll_component.clk0_phase_shift = "0", + altpll_component.compensate_clock = "CLK0", + altpll_component.inclk0_input_frequency = 37037, + altpll_component.intended_device_family = "Cyclone III", + altpll_component.lpm_hint = "CBX_MODULE_PREFIX=pll", + altpll_component.lpm_type = "altpll", + altpll_component.operation_mode = "NORMAL", + altpll_component.pll_type = "AUTO", + altpll_component.port_activeclock = "PORT_UNUSED", + altpll_component.port_areset = "PORT_UNUSED", + altpll_component.port_clkbad0 = "PORT_UNUSED", + altpll_component.port_clkbad1 = "PORT_UNUSED", + altpll_component.port_clkloss = "PORT_UNUSED", + altpll_component.port_clkswitch = "PORT_UNUSED", + altpll_component.port_configupdate = "PORT_UNUSED", + altpll_component.port_fbin = "PORT_UNUSED", + altpll_component.port_inclk0 = "PORT_USED", + altpll_component.port_inclk1 = "PORT_UNUSED", + altpll_component.port_locked = "PORT_UNUSED", + altpll_component.port_pfdena = "PORT_UNUSED", + altpll_component.port_phasecounterselect = "PORT_UNUSED", + altpll_component.port_phasedone = "PORT_UNUSED", + altpll_component.port_phasestep = "PORT_UNUSED", + altpll_component.port_phaseupdown = "PORT_UNUSED", + altpll_component.port_pllena = "PORT_UNUSED", + altpll_component.port_scanaclr = "PORT_UNUSED", + altpll_component.port_scanclk = "PORT_UNUSED", + altpll_component.port_scanclkena = "PORT_UNUSED", + altpll_component.port_scandata = "PORT_UNUSED", + altpll_component.port_scandataout = "PORT_UNUSED", + altpll_component.port_scandone = "PORT_UNUSED", + altpll_component.port_scanread = "PORT_UNUSED", + altpll_component.port_scanwrite = "PORT_UNUSED", + altpll_component.port_clk0 = "PORT_USED", + altpll_component.port_clk1 = "PORT_UNUSED", + altpll_component.port_clk2 = "PORT_UNUSED", + altpll_component.port_clk3 = "PORT_UNUSED", + altpll_component.port_clk4 = "PORT_UNUSED", + altpll_component.port_clk5 = "PORT_UNUSED", + altpll_component.port_clkena0 = "PORT_UNUSED", + altpll_component.port_clkena1 = "PORT_UNUSED", + altpll_component.port_clkena2 = "PORT_UNUSED", + altpll_component.port_clkena3 = "PORT_UNUSED", + altpll_component.port_clkena4 = "PORT_UNUSED", + altpll_component.port_clkena5 = "PORT_UNUSED", + altpll_component.port_extclk0 = "PORT_UNUSED", + altpll_component.port_extclk1 = "PORT_UNUSED", + altpll_component.port_extclk2 = "PORT_UNUSED", + altpll_component.port_extclk3 = "PORT_UNUSED", + altpll_component.width_clock = 5; + + +endmodule + +// ============================================================ +// CNX file retrieval info +// ============================================================ +// Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +// Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +// Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +// Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +// Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +// Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +// Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +// Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +// Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +// Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +// Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +// Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +// Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +// Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "44" +// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "25.159090" +// Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +// Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +// Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +// Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +// Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0" +// Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "41" +// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "25.17500000" +// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +// Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +// Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +// Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +// Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +// Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +// Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll.mif" +// Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +// Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +// Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +// Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +// Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +// Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +// Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +// Retrieval info: PRIVATE: SPREAD_USE STRING "0" +// Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +// Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +// Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +// Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +// Retrieval info: PRIVATE: USE_CLK0 STRING "1" +// Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +// Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +// Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +// Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "44" +// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "41" +// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +// Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +// Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +// Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +// Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +// Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +// Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +// Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +// Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +// Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +// Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +// Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.v TRUE +// Retrieval info: GEN_FILE: TYPE_NORMAL pll_bb.v TRUE +// Retrieval info: LIB_FILE: altera_mf +// Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/tutorials/pong/lesson3/pong.qpf b/tutorials/pong/lesson3/pong.qpf new file mode 100644 index 0000000..bce3c64 --- /dev/null +++ b/tutorials/pong/lesson3/pong.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2010 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II +# Version 10.1 Build 153 11/29/2010 SJ Full Version +# Date created = 11:11:11 June 13, 2011 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "10.1" +DATE = "11:11:11 June 13, 2011" + +# Revisions + +PROJECT_REVISION = "pong" diff --git a/tutorials/pong/lesson3/pong.qsf b/tutorials/pong/lesson3/pong.qsf new file mode 100644 index 0000000..1d8a7cf --- /dev/null +++ b/tutorials/pong/lesson3/pong.qsf @@ -0,0 +1,158 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2011 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II +# Version 11.0 Build 157 04/27/2011 SJ Full Version +# Date created = 17:14:01 April 10, 2012 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# led_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name TOP_LEVEL_ENTITY pong +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 11.0 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "17:14:01 APRIL 10, 2012" +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name DEVICE_FILTER_PACKAGE "ANY QFP" +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "AS INPUT TRI-STATED" +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" + +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_22 -to CLOCK_50[0] +set_location_assignment PIN_23 -to CLOCK_50[1] +set_location_assignment PIN_128 -to CLOCK_32[0] +set_location_assignment PIN_129 -to CLOCK_32[1] +set_location_assignment PIN_54 -to CLOCK_27[0] +set_location_assignment PIN_55 -to CLOCK_27[1] +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_46 -to UART_TX +set_location_assignment PIN_31 -to UART_RX +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_90 -to SPI_SS4 +set_location_assignment PIN_13 -to CONF_DATA0 + +set_location_assignment PIN_49 -to SDRAM_A[0] +set_location_assignment PIN_44 -to SDRAM_A[1] +set_location_assignment PIN_42 -to SDRAM_A[2] +set_location_assignment PIN_39 -to SDRAM_A[3] +set_location_assignment PIN_4 -to SDRAM_A[4] +set_location_assignment PIN_6 -to SDRAM_A[5] +set_location_assignment PIN_8 -to SDRAM_A[6] +set_location_assignment PIN_10 -to SDRAM_A[7] +set_location_assignment PIN_11 -to SDRAM_A[8] +set_location_assignment PIN_28 -to SDRAM_A[9] +set_location_assignment PIN_50 -to SDRAM_A[10] +set_location_assignment PIN_30 -to SDRAM_A[11] +set_location_assignment PIN_32 -to SDRAM_A[12] +set_location_assignment PIN_83 -to SDRAM_DQ[0] +set_location_assignment PIN_79 -to SDRAM_DQ[1] +set_location_assignment PIN_77 -to SDRAM_DQ[2] +set_location_assignment PIN_76 -to SDRAM_DQ[3] +set_location_assignment PIN_72 -to SDRAM_DQ[4] +set_location_assignment PIN_71 -to SDRAM_DQ[5] +set_location_assignment PIN_69 -to SDRAM_DQ[6] +set_location_assignment PIN_68 -to SDRAM_DQ[7] +set_location_assignment PIN_86 -to SDRAM_DQ[8] +set_location_assignment PIN_87 -to SDRAM_DQ[9] +set_location_assignment PIN_98 -to SDRAM_DQ[10] +set_location_assignment PIN_99 -to SDRAM_DQ[11] +set_location_assignment PIN_100 -to SDRAM_DQ[12] +set_location_assignment PIN_101 -to SDRAM_DQ[13] +set_location_assignment PIN_103 -to SDRAM_DQ[14] +set_location_assignment PIN_104 -to SDRAM_DQ[15] +set_location_assignment PIN_58 -to SDRAM_BA[0] +set_location_assignment PIN_51 -to SDRAM_BA[1] +set_location_assignment PIN_85 -to SDRAM_DQMH +set_location_assignment PIN_67 -to SDRAM_DQML +set_location_assignment PIN_60 -to SDRAM_nRAS +set_location_assignment PIN_64 -to SDRAM_nCAS +set_location_assignment PIN_66 -to SDRAM_nWE +set_location_assignment PIN_59 -to SDRAM_nCS +set_location_assignment PIN_33 -to SDRAM_CKE +set_location_assignment PIN_43 -to SDRAM_CLK + + +set_global_assignment -name ENABLE_SIGNALTAP OFF +set_global_assignment -name USE_SIGNALTAP_FILE stp1.stp +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON +set_global_assignment -name FITTER_EFFORT "FAST FIT" +set_global_assignment -name VERILOG_FILE user_io.v +set_global_assignment -name VERILOG_FILE pll.v +set_global_assignment -name VERILOG_FILE pong.v +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/tutorials/pong/lesson3/pong.rbf b/tutorials/pong/lesson3/pong.rbf new file mode 100644 index 0000000000000000000000000000000000000000..a4e1fcd27d58cefc302f4fb59b5fa22c597809b5 GIT binary patch literal 208255 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 E9~sqA&;S4c literal 0 HcmV?d00001 diff --git a/tutorials/pong/lesson3/pong.v b/tutorials/pong/lesson3/pong.v new file mode 100644 index 0000000..7c5f3ac --- /dev/null +++ b/tutorials/pong/lesson3/pong.v @@ -0,0 +1,201 @@ +// A simple pong game for the MIST FPGA board +// (c) 2015 Till Harbaum + +// Lesson 3: using the joystick + +module pong ( + input [1:0] CLOCK_27, + output SDRAM_nCS, + + // spi interface to mists io processor + output SPI_DO, + input SPI_DI, + input SPI_SCK, + input CONF_DATA0, + + output reg VGA_HS, + output reg VGA_VS, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B +); + +wire [7:0] joystick_0; +wire [7:0] joystick_1; + +// Include user_io.v submodule. This dies the major part of the communication with +// the arm io controller. We are only using the joystick here +user_io user_io ( + .SPI_CLK ( SPI_SCK ), + .SPI_SS_IO ( CONF_DATA0 ), + .SPI_MISO ( SPI_DO ), + .SPI_MOSI ( SPI_DI ), + + .joystick_0 ( joystick_0 ), + .joystick_1 ( joystick_1 ) +); + +// 640x480 60HZ VESA laut http://tinyvga.com/vga-timing/640x480@60Hz +parameter H = 640; // width of visible area +parameter HFP = 16; // unused area before h sync +parameter HS = 96; // length of h sync +parameter HBP = 48; // unused area after h sync + +parameter V = 480; // height of visible area +parameter VFP = 10; // unused area before v sync +parameter VS = 2; // length of v sync +parameter VBP = 33; // unused area after v sync + +reg[9:0] h_cnt; // horizontal pixel counter +reg[9:0] v_cnt; // vertical pixel counter + +// deactivate unused sdram +assign SDRAM_nCS = 1; + +localparam BORDER = 8; // height of top and bottom border +localparam BALL_SIZE = 16; // width and height of ball +localparam BALL_SPEED = 4; // step width of ball per v sync + +// ball starts in center of visible area +reg [9:0] ball_x = HS + HBP + (H - BALL_SIZE)/2; +reg [9:0] ball_y = VS + VBP + (V - BALL_SIZE)/2; + +// balls direction of movement +reg ball_move_x = 1'b1; +reg ball_move_y = 1'b1; + +// vertical position of the paddles +localparam PADDLE_WIDTH = BALL_SIZE; // width of paddle +localparam PADDLE_HEIGHT = 4*BALL_SIZE; // heihgt of paddle +localparam PADDLE_SPEED = 4; // step width of paddle per v sync +reg [9:0] paddle_0_y = VS + VBP + (V - PADDLE_HEIGHT)/2; +reg [9:0] paddle_1_y = VS + VBP + (V - PADDLE_HEIGHT)/2; + +// update paddle position every v sync +always@(posedge VGA_VS) begin + // move left paddle up if it isn't already at the top + if(joystick_0[3] && (paddle_0_y > VS + VBP + BORDER)) + paddle_0_y <= paddle_0_y - PADDLE_SPEED; + + // move left paddle down if it isn't already at the bottom + if(joystick_0[2] && (paddle_0_y < VS + VBP + V - BORDER - PADDLE_HEIGHT)) + paddle_0_y <= paddle_0_y + PADDLE_SPEED; + + // move right paddle up if it isn't already at the top + if(joystick_1[3] && (paddle_1_y > VS + VBP + BORDER)) + paddle_1_y <= paddle_1_y - PADDLE_SPEED; + + // move right paddle down if it isn't already at the bottom + if(joystick_1[2] && (paddle_1_y < VS + VBP + V - BORDER - PADDLE_HEIGHT)) + paddle_1_y <= paddle_1_y + PADDLE_SPEED; +end + +// generate collision signals +wire ball_hits_paddle_0 = + (ball_x < HS+HBP+PADDLE_WIDTH) && // ball is in range of left paddle + (ball_y > paddle_0_y - BALL_SIZE) && // ball is below paddles top edge + (ball_y < paddle_0_y + PADDLE_HEIGHT); // ball is above paddles bottom edge + +wire ball_hits_paddle_1 = + (ball_x > HS+HBP+H-PADDLE_WIDTH-BALL_SIZE) && // ball is in range of right paddle + (ball_y > paddle_1_y - BALL_SIZE) && // ball is below paddles top edge + (ball_y < paddle_1_y + PADDLE_HEIGHT); // ball is above paddles bottom edge + +wire ball_exits_left = ball_x <= HS+HBP; // ball leaves playfield to the left +wire ball_exits_right = ball_x >= HS+HBP+H-BALL_SIZE; // -"- to the right + +reg game_running = 1'b0; // game is running + +// start/stop of game +always@(posedge VGA_VS) begin + // check if ball has reached left or right border and stop game if yes + if(ball_exits_left || ball_exits_right) + game_running <= 1'b0; + + // any fire button starts game + if(joystick_0[4] || joystick_1[4]) + game_running <= 1'b1; +end + +// calculate new ball position each v sync +always@(posedge VGA_VS) begin + // change horizontal movement if paddle is being hit or if the ball is + // about to leave the playfield area + if(ball_hits_paddle_0 || ball_exits_left) ball_move_x <= 1'b1; + if(ball_hits_paddle_1 || ball_exits_right) ball_move_x <= 1'b0; + + // change vertical movement if border has been reached + if(ball_y < VS+VBP+BORDER) ball_move_y <= 1'b1; + if(ball_y >= VS+VBP+V-BORDER-BALL_SIZE) ball_move_y <= 1'b0; + + // move ball as long as game runs + if(game_running) begin + // horizontal movement + if(ball_move_x) ball_x <= ball_x + BALL_SPEED; + else ball_x <= ball_x - BALL_SPEED; + + // vertical movement + if(ball_move_y) ball_y <= ball_y + BALL_SPEED; + else ball_y <= ball_y - BALL_SPEED; + end else begin + // center ball if game is stopped + ball_x <= HS + HBP + (H - BALL_SIZE)/2; + ball_y <= VS + VBP + (V - BALL_SIZE)/2; + end +end + +// both counters start with the begin of the sync phases + +// horizontal pixel counter +always@(posedge pixel_clock) begin + if(h_cnt==HS+HBP+H+HFP-1) h_cnt <= 0; + else h_cnt <= h_cnt + 1; + + // generation of the negative h sync signal + VGA_HS <= (h_cnt >= HS); +end + +// vertical pixel counter +always@(posedge pixel_clock) begin + // the vertical state changes at the begin of each line + if(h_cnt == 0) begin + if(v_cnt==VS+VBP+V+VFP-1) v_cnt <= 0; + else v_cnt <= v_cnt + 1; + + // generation of the negative v sync signal + VGA_VS <= (v_cnt >= VS); + end +end + +// signal indicating the presence of the ball at the current beam position +wire ball = (h_cnt >= ball_x) && (h_cnt < ball_x + BALL_SIZE) && + (v_cnt >= ball_y) && (v_cnt < ball_y + BALL_SIZE); + +// top and bottom border: is being painted of the beam is horizontally within +// the playing area and vertically within the border area +wire border = (h_cnt >= HS+HBP) && (h_cnt < HS+HBP+H) && + (((v_cnt >= VS+VBP) && (v_cnt < VS+VBP+BORDER)) || + ((v_cnt >= VS+VBP+V-BORDER) && (v_cnt < VS+VBP+V))); + +// left paddle (paddle 0) is being drawn +wire paddle_0 = (h_cnt >= HS+HBP) && (h_cnt < HS+HBP+PADDLE_WIDTH) && + (v_cnt >= paddle_0_y) && (v_cnt < paddle_0_y + PADDLE_HEIGHT); + +// right paddle (paddle 1) is being drawn +wire paddle_1 = (h_cnt >= HS+HBP+H-PADDLE_WIDTH) && (h_cnt < HS+HBP+H) && + (v_cnt >= paddle_1_y) && (v_cnt < paddle_1_y + PADDLE_HEIGHT); + +wire pixel = ball || border || paddle_0 || paddle_1; + +// white if pixel, black otherwise +assign VGA_R = pixel?6'b111111:6'b000000; +assign VGA_G = pixel?6'b111111:6'b000000; +assign VGA_B = pixel?6'b111111:6'b000000; + +// pll to generate the VGA pixel clock from the 27Mhz board clock +pll pll ( + .inclk0(CLOCK_27[0]), + .c0(pixel_clock) + ); + +endmodule diff --git a/tutorials/pong/lesson3/user_io.v b/tutorials/pong/lesson3/user_io.v new file mode 100644 index 0000000..bae35b1 --- /dev/null +++ b/tutorials/pong/lesson3/user_io.v @@ -0,0 +1,410 @@ +// +// user_io.v +// +// user_io for the MiST board +// http://code.google.com/p/mist-board/ +// +// Copyright (c) 2014 Till Harbaum +// +// This source file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This source file is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +// parameter STRLEN and the actual length of conf_str have to match + +module user_io #(parameter STRLEN=0) ( + input [(8*STRLEN)-1:0] conf_str, + + input SPI_CLK, + input SPI_SS_IO, + output reg SPI_MISO, + input SPI_MOSI, + + output reg [7:0] joystick_0, + output reg [7:0] joystick_1, + output reg [15:0] joystick_analog_0, + output reg [15:0] joystick_analog_1, + output [1:0] buttons, + output [1:0] switches, + + output reg [7:0] status, + + // connection to sd card emulation + input [31:0] sd_lba, + input sd_rd, + input sd_wr, + output reg sd_ack, + input sd_conf, + input sd_sdhc, + output [7:0] sd_dout, // valid on rising edge of sd_dout_strobe + output reg sd_dout_strobe, + input [7:0] sd_din, + output reg sd_din_strobe, + + + // ps2 keyboard emulation + input ps2_clk, // 12-16khz provided by core + output ps2_kbd_clk, + output reg ps2_kbd_data, + output ps2_mouse_clk, + output reg ps2_mouse_data, + + // serial com port + input [7:0] serial_data, + input serial_strobe +); + +reg [6:0] sbuf; +reg [7:0] cmd; +reg [2:0] bit_cnt; // counts bits 0-7 0-7 ... +reg [7:0] byte_cnt; // counts bytes +reg [5:0] joystick0; +reg [5:0] joystick1; +reg [3:0] but_sw; +reg [2:0] stick_idx; + +assign buttons = but_sw[1:0]; +assign switches = but_sw[3:2]; +assign sd_dout = { sbuf, SPI_MOSI}; + +// this variant of user_io is for 8 bit cores (type == a4) only +wire [7:0] core_type = 8'ha4; + +// command byte read by the io controller +wire [7:0] sd_cmd = { 4'h5, sd_conf, sd_sdhc, sd_wr, sd_rd }; + +// filter spi clock. the 8 bit gate delay is ~2.5ns in total +wire [7:0] spi_sck_D = { spi_sck_D[6:0], SPI_CLK } /* synthesis keep */; +wire spi_sck = (spi_sck && spi_sck_D != 8'h00) || (!spi_sck && spi_sck_D == 8'hff); + +// drive MISO only when transmitting core id +always@(negedge spi_sck or posedge SPI_SS_IO) begin + if(SPI_SS_IO == 1) begin + SPI_MISO <= 1'bZ; + end else begin + + // first byte returned is always core type, further bytes are + // command dependent + if(byte_cnt == 0) begin + SPI_MISO <= core_type[~bit_cnt]; + + end else begin + // reading serial fifo + if(cmd == 8'h1b) begin + // send alternating flag byte and data + if(byte_cnt[0]) SPI_MISO <= serial_out_status[~bit_cnt]; + else SPI_MISO <= serial_out_byte[~bit_cnt]; + end + + // reading config string + else if(cmd == 8'h14) begin + // returning a byte from string + if(byte_cnt < STRLEN + 1) + SPI_MISO <= conf_str[{STRLEN - byte_cnt,~bit_cnt}]; + else + SPI_MISO <= 1'b0; + end + + // reading sd card status + else if(cmd == 8'h16) begin + if(byte_cnt == 1) + SPI_MISO <= sd_cmd[~bit_cnt]; + else if((byte_cnt >= 2) && (byte_cnt < 6)) + SPI_MISO <= sd_lba[{5-byte_cnt, ~bit_cnt}]; + else + SPI_MISO <= 1'b0; + end + + // reading sd card write data + else if(cmd == 8'h18) + SPI_MISO <= sd_din[~bit_cnt]; + + else + SPI_MISO <= 1'b0; + end + end +end + +// ---------------- PS2 --------------------- + +// 8 byte fifos to store ps2 bytes +localparam PS2_FIFO_BITS = 3; + +// keyboard +reg [7:0] ps2_kbd_fifo [(2**PS2_FIFO_BITS)-1:0]; +reg [PS2_FIFO_BITS-1:0] ps2_kbd_wptr; +reg [PS2_FIFO_BITS-1:0] ps2_kbd_rptr; + +// ps2 transmitter state machine +reg [3:0] ps2_kbd_tx_state; +reg [7:0] ps2_kbd_tx_byte; +reg ps2_kbd_parity; + +assign ps2_kbd_clk = ps2_clk || (ps2_kbd_tx_state == 0); + +// ps2 transmitter +// Takes a byte from the FIFO and sends it in a ps2 compliant serial format. +reg ps2_kbd_r_inc; +always@(posedge ps2_clk) begin + ps2_kbd_r_inc <= 1'b0; + + if(ps2_kbd_r_inc) + ps2_kbd_rptr <= ps2_kbd_rptr + 1; + + // transmitter is idle? + if(ps2_kbd_tx_state == 0) begin + // data in fifo present? + if(ps2_kbd_wptr != ps2_kbd_rptr) begin + // load tx register from fifo + ps2_kbd_tx_byte <= ps2_kbd_fifo[ps2_kbd_rptr]; + ps2_kbd_r_inc <= 1'b1; + + // reset parity + ps2_kbd_parity <= 1'b1; + + // start transmitter + ps2_kbd_tx_state <= 4'd1; + + // put start bit on data line + ps2_kbd_data <= 1'b0; // start bit is 0 + end + end else begin + + // transmission of 8 data bits + if((ps2_kbd_tx_state >= 1)&&(ps2_kbd_tx_state < 9)) begin + ps2_kbd_data <= ps2_kbd_tx_byte[0]; // data bits + ps2_kbd_tx_byte[6:0] <= ps2_kbd_tx_byte[7:1]; // shift down + if(ps2_kbd_tx_byte[0]) + ps2_kbd_parity <= !ps2_kbd_parity; + end + + // transmission of parity + if(ps2_kbd_tx_state == 9) + ps2_kbd_data <= ps2_kbd_parity; + + // transmission of stop bit + if(ps2_kbd_tx_state == 10) + ps2_kbd_data <= 1'b1; // stop bit is 1 + + // advance state machine + if(ps2_kbd_tx_state < 11) + ps2_kbd_tx_state <= ps2_kbd_tx_state + 4'd1; + else + ps2_kbd_tx_state <= 4'd0; + + end +end + +// mouse +reg [7:0] ps2_mouse_fifo [(2**PS2_FIFO_BITS)-1:0]; +reg [PS2_FIFO_BITS-1:0] ps2_mouse_wptr; +reg [PS2_FIFO_BITS-1:0] ps2_mouse_rptr; + +// ps2 transmitter state machine +reg [3:0] ps2_mouse_tx_state; +reg [7:0] ps2_mouse_tx_byte; +reg ps2_mouse_parity; + +assign ps2_mouse_clk = ps2_clk || (ps2_mouse_tx_state == 0); + +// ps2 transmitter +// Takes a byte from the FIFO and sends it in a ps2 compliant serial format. +reg ps2_mouse_r_inc; +always@(posedge ps2_clk) begin + ps2_mouse_r_inc <= 1'b0; + + if(ps2_mouse_r_inc) + ps2_mouse_rptr <= ps2_mouse_rptr + 1; + + // transmitter is idle? + if(ps2_mouse_tx_state == 0) begin + // data in fifo present? + if(ps2_mouse_wptr != ps2_mouse_rptr) begin + // load tx register from fifo + ps2_mouse_tx_byte <= ps2_mouse_fifo[ps2_mouse_rptr]; + ps2_mouse_r_inc <= 1'b1; + + // reset parity + ps2_mouse_parity <= 1'b1; + + // start transmitter + ps2_mouse_tx_state <= 4'd1; + + // put start bit on data line + ps2_mouse_data <= 1'b0; // start bit is 0 + end + end else begin + + // transmission of 8 data bits + if((ps2_mouse_tx_state >= 1)&&(ps2_mouse_tx_state < 9)) begin + ps2_mouse_data <= ps2_mouse_tx_byte[0]; // data bits + ps2_mouse_tx_byte[6:0] <= ps2_mouse_tx_byte[7:1]; // shift down + if(ps2_mouse_tx_byte[0]) + ps2_mouse_parity <= !ps2_mouse_parity; + end + + // transmission of parity + if(ps2_mouse_tx_state == 9) + ps2_mouse_data <= ps2_mouse_parity; + + // transmission of stop bit + if(ps2_mouse_tx_state == 10) + ps2_mouse_data <= 1'b1; // stop bit is 1 + + // advance state machine + if(ps2_mouse_tx_state < 11) + ps2_mouse_tx_state <= ps2_mouse_tx_state + 4'd1; + else + ps2_mouse_tx_state <= 4'd0; + + end +end + +// fifo to receive serial data from core to be forwarded to io controller + +// 16 byte fifo to store serial bytes +localparam SERIAL_OUT_FIFO_BITS = 6; +reg [7:0] serial_out_fifo [(2**SERIAL_OUT_FIFO_BITS)-1:0]; +reg [SERIAL_OUT_FIFO_BITS-1:0] serial_out_wptr; +reg [SERIAL_OUT_FIFO_BITS-1:0] serial_out_rptr; + +wire serial_out_data_available = serial_out_wptr != serial_out_rptr; +wire [7:0] serial_out_byte = serial_out_fifo[serial_out_rptr] /* synthesis keep */; +wire [7:0] serial_out_status = { 7'b1000000, serial_out_data_available}; + +// status[0] is reset signal from io controller and is thus used to flush +// the fifo +always @(posedge serial_strobe or posedge status[0]) begin + if(status[0] == 1) begin + serial_out_wptr <= 0; + end else begin + serial_out_fifo[serial_out_wptr] <= serial_data; + serial_out_wptr <= serial_out_wptr + 1; + end +end + +always@(negedge spi_sck or posedge status[0]) begin + if(status[0] == 1) begin + serial_out_rptr <= 0; + end else begin + if((byte_cnt != 0) && (cmd == 8'h1b)) begin + // read last bit -> advance read pointer + if((bit_cnt == 7) && !byte_cnt[0] && serial_out_data_available) + serial_out_rptr <= serial_out_rptr + 1; + end + end +end + +// SPI receiver +always@(posedge spi_sck or posedge SPI_SS_IO) begin + + if(SPI_SS_IO == 1) begin + bit_cnt <= 3'd0; + byte_cnt <= 8'd0; + sd_ack <= 1'b0; + sd_dout_strobe <= 1'b0; + sd_din_strobe <= 1'b0; + end else begin + sd_dout_strobe <= 1'b0; + sd_din_strobe <= 1'b0; + + sbuf[6:0] <= { sbuf[5:0], SPI_MOSI }; + bit_cnt <= bit_cnt + 3'd1; + if((bit_cnt == 7)&&(byte_cnt != 8'd255)) + byte_cnt <= byte_cnt + 8'd1; + + // finished reading command byte + if(bit_cnt == 7) begin + if(byte_cnt == 0) begin + cmd <= { sbuf, SPI_MOSI}; + + // fetch first byte when sectore FPGA->IO command has been seen + if({ sbuf, SPI_MOSI} == 8'h18) + sd_din_strobe <= 1'b1; + + if(({ sbuf, SPI_MOSI} == 8'h17) || ({ sbuf, SPI_MOSI} == 8'h18)) + sd_ack <= 1'b1; + + end else begin + + // buttons and switches + if(cmd == 8'h01) + but_sw <= { sbuf[2:0], SPI_MOSI }; + + if(cmd == 8'h02) + joystick_0 <= { sbuf, SPI_MOSI }; + + if(cmd == 8'h03) + joystick_1 <= { sbuf, SPI_MOSI }; + + if(cmd == 8'h04) begin + // store incoming ps2 mouse bytes + ps2_mouse_fifo[ps2_mouse_wptr] <= { sbuf, SPI_MOSI }; + ps2_mouse_wptr <= ps2_mouse_wptr + 1; + end + + if(cmd == 8'h05) begin + // store incoming ps2 keyboard bytes + ps2_kbd_fifo[ps2_kbd_wptr] <= { sbuf, SPI_MOSI }; + ps2_kbd_wptr <= ps2_kbd_wptr + 1; + end + + if(cmd == 8'h15) + status <= { sbuf[6:0], SPI_MOSI }; + + // send sector IO -> FPGA + if(cmd == 8'h17) begin + // flag that download begins +// sd_dout <= { sbuf, SPI_MOSI}; + sd_dout_strobe <= 1'b1; + end + + // send sector FPGA -> IO + if(cmd == 8'h18) + sd_din_strobe <= 1'b1; + + // send SD config IO -> FPGA + if(cmd == 8'h19) begin + // flag that download begins +// sd_dout <= { sbuf, SPI_MOSI}; + // sd card knows data is config if sd_dout_strobe is asserted + // with sd_ack still being inactive (low) + sd_dout_strobe <= 1'b1; + end + + // joystick analog + if(cmd == 8'h1a) begin + // first byte is joystick indes + if(byte_cnt == 1) + stick_idx <= { sbuf[1:0], SPI_MOSI }; + else if(byte_cnt == 2) begin + // second byte is x axis + if(stick_idx == 0) + joystick_analog_0[15:8] <= { sbuf, SPI_MOSI }; + else if(stick_idx == 1) + joystick_analog_1[15:8] <= { sbuf, SPI_MOSI }; + end else if(byte_cnt == 3) begin + // third byte is y axis + if(stick_idx == 0) + joystick_analog_0[7:0] <= { sbuf, SPI_MOSI }; + else if(stick_idx == 1) + joystick_analog_1[7:0] <= { sbuf, SPI_MOSI }; + end + end + + end + end + end +end + +endmodule diff --git a/tutorials/readme.md b/tutorials/readme.md index 8f9d87a..3e7475c 100644 --- a/tutorials/readme.md +++ b/tutorials/readme.md @@ -6,3 +6,9 @@ LED A blinking led: A simple "Hello World" for the MIST board. Use this as a quick start to compile your first own core. + +Pong +---- + +A very simple implementation of the pong. Demonstrates the generation +of VGA video signals and the usage of joysticks.