From 2b8582820b14840f73457fa505edd8eda1e4c9b0 Mon Sep 17 00:00:00 2001 From: Gehstock Date: Tue, 4 Dec 2018 06:29:23 +0100 Subject: [PATCH] new Core Arkanoid --- .../Computer Space.jpg | Bin .../ComputerSpace_MiST/ComputerSpace.qpf | 0 .../ComputerSpace_MiST/ComputerSpace.qsf | 0 .../ComputerSpace_MiST/ComputerSpace.srf | 0 .../ComputerSpace_MiST/README.txt | 0 .../Release/ComputerSpace.rbf | Bin .../ComputerSpace_MiST/clean.bat | 0 .../ComputerSpace_MiST/rtl/CSpace.sv | 0 .../ComputerSpace_MiST/rtl/bakam.qip | 0 .../ComputerSpace_MiST/rtl/bakam.vhd | 0 .../ComputerSpace_MiST/rtl/bakamb_8_11.hex | 0 .../ComputerSpace_MiST/rtl/build_id.tcl | 0 .../ComputerSpace_MiST/rtl/build_id.v | 0 .../ComputerSpace_MiST/rtl/clocks.vhd | 0 .../rtl/computer_space_logic.vhd | 0 .../rtl/computer_space_top.vhd | 0 .../ComputerSpace_MiST/rtl/explosion.qip | 0 .../ComputerSpace_MiST/rtl/explosion.vhd | 0 .../ComputerSpace_MiST/rtl/explosion_8_11.hex | 0 .../ComputerSpace_MiST/rtl/hq2x.sv | 0 .../ComputerSpace_MiST/rtl/keyboard.v | 0 .../ComputerSpace_MiST/rtl/memory_board.vhd | 0 .../ComputerSpace_MiST/rtl/mist_io.v | 0 .../ComputerSpace_MiST/rtl/motion_board.vhd | 0 .../ComputerSpace_MiST/rtl/osd.v | 0 .../ComputerSpace_MiST/rtl/pll.qip | 0 .../ComputerSpace_MiST/rtl/pll.v | 0 .../rtl/rocket_diode_images.vhd | 0 .../ComputerSpace_MiST/rtl/rocket_rotate.qip | 0 .../ComputerSpace_MiST/rtl/rocket_rotate.vhd | 0 .../rtl/rocket_shooting.qip | 0 .../rtl/rocket_shooting.vhd | 0 .../rtl/rocket_shooting_8_11.hex | 0 .../ComputerSpace_MiST/rtl/rocket_thrust.qip | 0 .../ComputerSpace_MiST/rtl/rocket_thrust.vhd | 0 .../ComputerSpace_MiST/rtl/rotate_8_11.hex | 0 .../rtl/saucer_diode_image.vhd | 0 .../rtl/saucer_shooting.qip | 0 .../rtl/saucer_shooting.vhd | 0 .../rtl/saucer_shooting_8_11.hex | 0 .../ComputerSpace_MiST/rtl/scan_counter.vhd | 0 .../ComputerSpace_MiST/rtl/scandoubler.v | 0 .../ComputerSpace_MiST/rtl/sigma_delta_dac.v | 0 .../ComputerSpace_MiST/rtl/sound.vhd | 0 .../rtl/sync_star_board.vhd | 0 .../ComputerSpace_MiST/rtl/thrust_8_11.hex | 0 .../ComputerSpace_MiST/rtl/v74161.vhd | 0 .../ComputerSpace_MiST/rtl/v74161_16bit.vhd | 0 .../ComputerSpace_MiST/rtl/video_mixer.sv | 0 .../Arkanoid_MiST/Arkanoid Level Editor.jar | Bin 0 -> 13560 bytes .../Non Arcade/Arkanoid_MiST/Arkanoid.qpf | 30 + .../Non Arcade/Arkanoid_MiST/Arkanoid.qsf | 165 ++ .../Non Arcade/Arkanoid_MiST/README.md | 35 + .../Arkanoid_MiST/Release/Arkanoid.rbf | Bin 0 -> 304712 bytes .../Non Arcade/Arkanoid_MiST/clean.bat | 37 + .../Arkanoid_MiST/rtl/Arkanoid_Mist.sv | 147 ++ .../Non Arcade/Arkanoid_MiST/rtl/PLL.vhd | 446 ++++ .../Non Arcade/Arkanoid_MiST/rtl/arkanoid.vhd | 189 ++ .../Arkanoid_MiST/rtl/arkanoid_controller.vhd | 145 ++ .../Arkanoid_MiST/rtl/arkanoid_datapath.vhd | 576 +++++ .../Arkanoid_MiST/rtl/arkanoid_levels_rom.vhd | 169 ++ .../Arkanoid_MiST/rtl/arkanoid_package.vhd | 115 + .../Arkanoid_MiST/rtl/arkanoid_sound.vhd | 99 + .../Arkanoid_MiST/rtl/arkanoid_view.vhd | 433 ++++ .../Non Arcade/Arkanoid_MiST/rtl/build_id.tcl | 35 + .../Non Arcade/Arkanoid_MiST/rtl/build_id.v | 2 + .../Non Arcade/Arkanoid_MiST/rtl/hq2x.sv | 454 ++++ .../Non Arcade/Arkanoid_MiST/rtl/keyboard.v | 82 + .../Non Arcade/Arkanoid_MiST/rtl/mist_io.v | 491 ++++ .../Non Arcade/Arkanoid_MiST/rtl/osd.v | 179 ++ .../Arkanoid_MiST/rtl/roms/levels.mif | 2055 +++++++++++++++++ .../Arkanoid_MiST/rtl/scandoubler.v | 194 ++ .../Non Arcade/Arkanoid_MiST/rtl/sqrt.vhd | 56 + .../Arkanoid_MiST/rtl/vga_package.vhd | 105 + .../Arkanoid_MiST/rtl/video_mixer.sv | 246 ++ Arcade_MiST/README.txt | 3 +- .../Galaksija_MiST/rtl/galaksija_top.sv | 2 +- 77 files changed, 6488 insertions(+), 2 deletions(-) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/Computer Space.jpg (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/ComputerSpace.qpf (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/ComputerSpace.qsf (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/ComputerSpace.srf (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/README.txt (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/Release/ComputerSpace.rbf (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/clean.bat (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/CSpace.sv (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/bakam.qip (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/bakam.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/bakamb_8_11.hex (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/build_id.tcl (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/build_id.v (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/clocks.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/computer_space_logic.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/computer_space_top.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/explosion.qip (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/explosion.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/explosion_8_11.hex (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/hq2x.sv (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/keyboard.v (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/memory_board.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/mist_io.v (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/motion_board.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/osd.v (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/pll.qip (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/pll.v (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/rocket_diode_images.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/rocket_rotate.qip (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/rocket_rotate.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/rocket_shooting.qip (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/rocket_shooting.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/rocket_shooting_8_11.hex (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/rocket_thrust.qip (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/rocket_thrust.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/rotate_8_11.hex (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/saucer_diode_image.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/saucer_shooting.qip (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/saucer_shooting.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/saucer_shooting_8_11.hex (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/scan_counter.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/scandoubler.v (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/sigma_delta_dac.v (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/sound.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/sync_star_board.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/thrust_8_11.hex (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/v74161.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/v74161_16bit.vhd (100%) rename Arcade_MiST/{Atari Discrete Logic Hardware => Atari Discrete Logic}/ComputerSpace_MiST/rtl/video_mixer.sv (100%) create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/Arkanoid Level Editor.jar create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/Arkanoid.qpf create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/Arkanoid.qsf create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/README.md create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/Release/Arkanoid.rbf create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/clean.bat create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/Arkanoid_Mist.sv create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/PLL.vhd create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid.vhd create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_controller.vhd create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_datapath.vhd create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_levels_rom.vhd create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_package.vhd create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_sound.vhd create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_view.vhd create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/build_id.v create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/hq2x.sv create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/keyboard.v create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/mist_io.v create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/osd.v create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/roms/levels.mif create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/scandoubler.v create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/sqrt.vhd create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/vga_package.vhd create mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/video_mixer.sv diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/Computer Space.jpg b/Arcade_MiST/Atari Discrete Logic/Computer Space.jpg similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/Computer Space.jpg rename to Arcade_MiST/Atari Discrete Logic/Computer Space.jpg diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/ComputerSpace.qpf b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/ComputerSpace.qpf similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/ComputerSpace.qpf rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/ComputerSpace.qpf diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/ComputerSpace.qsf b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/ComputerSpace.qsf similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/ComputerSpace.qsf rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/ComputerSpace.qsf diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/ComputerSpace.srf b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/ComputerSpace.srf similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/ComputerSpace.srf rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/ComputerSpace.srf diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/README.txt b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/README.txt similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/README.txt rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/README.txt diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/Release/ComputerSpace.rbf b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/Release/ComputerSpace.rbf similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/Release/ComputerSpace.rbf rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/Release/ComputerSpace.rbf diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/clean.bat b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/clean.bat similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/clean.bat rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/clean.bat diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/CSpace.sv b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/CSpace.sv similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/CSpace.sv rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/CSpace.sv diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/bakam.qip b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/bakam.qip similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/bakam.qip rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/bakam.qip diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/bakam.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/bakam.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/bakam.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/bakam.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/bakamb_8_11.hex b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/bakamb_8_11.hex similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/bakamb_8_11.hex rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/bakamb_8_11.hex diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/build_id.tcl b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/build_id.tcl similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/build_id.tcl rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/build_id.tcl diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/build_id.v b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/build_id.v similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/build_id.v rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/build_id.v diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/clocks.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/clocks.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/clocks.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/clocks.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/computer_space_logic.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/computer_space_logic.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/computer_space_logic.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/computer_space_logic.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/computer_space_top.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/computer_space_top.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/computer_space_top.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/computer_space_top.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/explosion.qip b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/explosion.qip similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/explosion.qip rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/explosion.qip diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/explosion.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/explosion.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/explosion.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/explosion.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/explosion_8_11.hex b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/explosion_8_11.hex similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/explosion_8_11.hex rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/explosion_8_11.hex diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/hq2x.sv b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/hq2x.sv similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/hq2x.sv rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/hq2x.sv diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/keyboard.v b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/keyboard.v similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/keyboard.v rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/keyboard.v diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/memory_board.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/memory_board.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/memory_board.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/memory_board.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/mist_io.v b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/mist_io.v similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/mist_io.v rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/mist_io.v diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/motion_board.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/motion_board.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/motion_board.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/motion_board.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/osd.v b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/osd.v similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/osd.v rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/osd.v diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/pll.qip b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/pll.qip similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/pll.qip rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/pll.qip diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/pll.v b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/pll.v similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/pll.v rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/pll.v diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_diode_images.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_diode_images.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_diode_images.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_diode_images.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_rotate.qip b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_rotate.qip similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_rotate.qip rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_rotate.qip diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_rotate.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_rotate.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_rotate.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_rotate.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_shooting.qip b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_shooting.qip similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_shooting.qip rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_shooting.qip diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_shooting.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_shooting.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_shooting.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_shooting.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_shooting_8_11.hex b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_shooting_8_11.hex similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_shooting_8_11.hex rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_shooting_8_11.hex diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_thrust.qip b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_thrust.qip similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_thrust.qip rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_thrust.qip diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_thrust.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_thrust.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rocket_thrust.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rocket_thrust.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rotate_8_11.hex b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rotate_8_11.hex similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/rotate_8_11.hex rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/rotate_8_11.hex diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/saucer_diode_image.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/saucer_diode_image.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/saucer_diode_image.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/saucer_diode_image.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/saucer_shooting.qip b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/saucer_shooting.qip similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/saucer_shooting.qip rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/saucer_shooting.qip diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/saucer_shooting.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/saucer_shooting.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/saucer_shooting.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/saucer_shooting.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/saucer_shooting_8_11.hex b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/saucer_shooting_8_11.hex similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/saucer_shooting_8_11.hex rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/saucer_shooting_8_11.hex diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/scan_counter.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/scan_counter.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/scan_counter.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/scan_counter.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/scandoubler.v b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/scandoubler.v similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/scandoubler.v rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/scandoubler.v diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/sigma_delta_dac.v b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/sigma_delta_dac.v similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/sigma_delta_dac.v rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/sigma_delta_dac.v diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/sound.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/sound.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/sound.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/sound.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/sync_star_board.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/sync_star_board.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/sync_star_board.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/sync_star_board.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/thrust_8_11.hex b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/thrust_8_11.hex similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/thrust_8_11.hex rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/thrust_8_11.hex diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/v74161.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/v74161.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/v74161.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/v74161.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/v74161_16bit.vhd b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/v74161_16bit.vhd similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/v74161_16bit.vhd rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/v74161_16bit.vhd diff --git a/Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/video_mixer.sv b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/video_mixer.sv similarity index 100% rename from Arcade_MiST/Atari Discrete Logic Hardware/ComputerSpace_MiST/rtl/video_mixer.sv rename to Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/video_mixer.sv diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/Arkanoid Level Editor.jar b/Arcade_MiST/Non Arcade/Arkanoid_MiST/Arkanoid Level Editor.jar new file mode 100644 index 0000000000000000000000000000000000000000..d24b9ffe66dce4b1875b7b19aabd8f0d88bd9ad0 GIT binary patch literal 13560 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 Import Assignments -> File name: /PATH_TO/DE1.qsf -> Ok (DE1.qsf is located in "arkanoid-vhdl-master" folder) +3. Compile +4. Program device (after connecting DE1 board through USB port) +5. Connect a display through DE1 VGA port +6. Connect a PS/2 Keyboard to DE1 PS/2 Port +7. (optional) Connect a buzzer to DE1 GPIO_0(0) pin +8. Press spacebar +9. Enjoy :) + + +##Key bindings +* Move LEFT: "Y" +* Move RIGHT: "I" +* Start: spacebar +* Pause: "P" +* Reset: Altera DE1 Key(0) physical button + +##Authors +Pietro Bassi + +Marco Torsello diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/Release/Arkanoid.rbf b/Arcade_MiST/Non Arcade/Arkanoid_MiST/Release/Arkanoid.rbf new file mode 100644 index 0000000000000000000000000000000000000000..defce72db855dbc7d578f8655aa2e3caec4afc9a GIT binary patch literal 304712 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 literal 0 HcmV?d00001 diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/clean.bat b/Arcade_MiST/Non Arcade/Arkanoid_MiST/clean.bat new file mode 100644 index 00000000..b3b7c3b5 --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/clean.bat @@ -0,0 +1,37 @@ +@echo off +del /s *.bak +del /s *.orig +del /s *.rej +del /s *~ +rmdir /s /q db +rmdir /s /q incremental_db +rmdir /s /q output_files +rmdir /s /q simulation +rmdir /s /q greybox_tmp +rmdir /s /q hc_output +rmdir /s /q .qsys_edit +rmdir /s /q hps_isw_handoff +rmdir /s /q sys\.qsys_edit +rmdir /s /q sys\vip +cd sys +for /d %%i in (*_sim) do rmdir /s /q "%%~nxi" +cd .. +for /d %%i in (*_sim) do rmdir /s /q "%%~nxi" +del build_id.v +del c5_pin_model_dump.txt +del PLLJ_PLLSPE_INFO.txt +del /s *.qws +del /s *.ppf +del /s *.ddb +del /s *.csv +del /s *.cmp +del /s *.sip +del /s *.spd +del /s *.bsf +del /s *.f +del /s *.sopcinfo +del /s *.xml +del /s new_rtl_netlist +del /s old_rtl_netlist + +pause diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/Arkanoid_Mist.sv b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/Arkanoid_Mist.sv new file mode 100644 index 00000000..26f3d7d0 --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/Arkanoid_Mist.sv @@ -0,0 +1,147 @@ +//============================================================================ +// Arcade: Arkanoid +// +// Port to MiST +// Copyright (C) 2018 Gehstock +// +// This program 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 2 of the License, or (at your option) +// any later version. +// +// This program 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//============================================================================ + +module Arkanoid_Mist +( + output LED, + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_HS, + output VGA_VS, + output AUDIO_L, + output AUDIO_R, + input SPI_SCK, + output SPI_DO, + input SPI_DI, + input SPI_SS2, + input SPI_SS3, + input CONF_DATA0, + input CLOCK_27 +); + +`include "rtl\build_id.v" + +localparam CONF_STR = { + "Arkanoid;;", + "O34,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;", + "T7,Reset;", + "V,v1.00.",`BUILD_DATE +}; + +wire [31:0] status; +wire [1:0] buttons; +wire [1:0] switches; +wire [9:0] kbjoy; +wire [7:0] joystick_0; +wire [7:0] joystick_1; +wire scandoubler_disable; +wire ypbpr; +wire ps2_kbd_clk, ps2_kbd_data; + +assign LED = 1; + +wire clk_50, clk_25, clk_6p25; + +pll pll( + .inclk0(CLOCK_27), + .c0(clk_50), + .c1(clk_25), + .c3(clk_6p25) +); + +arkanoid arkanoid( + .CLOCK(clk_50), + .CLOCKVGA(clk_25), + .RESET(~(status[0] | status[7] | buttons[1])), + .K_LEFT(kbjoy[6] | joystick_0[1] | joystick_1[1]), + .K_RIGHT(kbjoy[7] | joystick_0[0] | joystick_1[0]), + .K_PAUSE(kbjoy[3] | joystick_0[5] | joystick_1[5]), + .K_START(kbjoy[0] | joystick_0[4] | joystick_1[4]), + .VGA_R(r), + .VGA_G(g), + .VGA_B(b), + .VGA_HS(hs), + .VGA_VS(vs), + .audio(AUDIO_L) + ); + +assign AUDIO_R = AUDIO_L; + +wire hs, vs; +wire [3:0] r, g, b; + +video_mixer #(.LINE_LENGTH(480), .HALF_DEPTH(0)) video_mixer +( + .clk_sys(clk_25), + .ce_pix(clk_6p25), + .ce_pix_actual(clk_6p25), + .SPI_SCK(SPI_SCK), + .SPI_SS3(SPI_SS3), + .SPI_DI(SPI_DI), + .R({r,r[1:0]}), + .G({g,g[1:0]}), + .B({b,b[1:0]}), + .HSync(hs), + .VSync(vs), + .VGA_R(VGA_R), + .VGA_G(VGA_G), + .VGA_B(VGA_B), + .VGA_VS(VGA_VS), + .VGA_HS(VGA_HS), + .scandoubler_disable(1'b1),//scandoubler_disable), + .scanlines(scandoubler_disable ? 2'b00 : {status[4:3] == 2'b11, status[4:3] == 2'b10, status[4:3] == 2'b01}), + .hq2x(status[4:3]==1), + .ypbpr_full(1), + .line_start(0), + .mono(0) +); + +mist_io #(.STRLEN(($size(CONF_STR)>>3))) mist_io +( + .clk_sys (clk_25 ), + .conf_str (CONF_STR ), + .SPI_SCK (SPI_SCK ), + .CONF_DATA0 (CONF_DATA0 ), + .SPI_SS2 (SPI_SS2 ), + .SPI_DO (SPI_DO ), + .SPI_DI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable(scandoubler_disable), + .ypbpr (ypbpr ), + .ps2_kbd_clk (ps2_kbd_clk ), + .ps2_kbd_data (ps2_kbd_data ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) +); + +keyboard keyboard( + .clk(clk_25), + .reset(), + .ps2_kbd_clk(ps2_kbd_clk), + .ps2_kbd_data(ps2_kbd_data), + .joystick(kbjoy) + ); + + +endmodule diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/PLL.vhd b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/PLL.vhd new file mode 100644 index 00000000..5cd67210 --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/PLL.vhd @@ -0,0 +1,446 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: PLL.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.0.1 Build 232 06/12/2013 SP 1 SJ Full Version +-- ************************************************************ + + +--Copyright (C) 1991-2013 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY PLL IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + c2 : OUT STD_LOGIC ; + c3 : OUT STD_LOGIC + ); +END PLL; + + +ARCHITECTURE SYN OF pll IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + clk2_divide_by : NATURAL; + clk2_duty_cycle : NATURAL; + clk2_multiply_by : NATURAL; + clk2_phase_shift : STRING; + clk3_divide_by : NATURAL; + clk3_duty_cycle : NATURAL; + clk3_multiply_by : NATURAL; + clk3_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + width_clock : NATURAL + ); + PORT ( + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire4 <= sub_wire0(2); + sub_wire3 <= sub_wire0(0); + sub_wire2 <= sub_wire0(3); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + c3 <= sub_wire2; + c0 <= sub_wire3; + c2 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 27, + clk0_duty_cycle => 50, + clk0_multiply_by => 50, + clk0_phase_shift => "0", + clk1_divide_by => 27, + clk1_duty_cycle => 50, + clk1_multiply_by => 25, + clk1_phase_shift => "0", + clk2_divide_by => 54, + clk2_duty_cycle => 50, + clk2_multiply_by => 25, + clk2_phase_shift => "0", + clk3_divide_by => 108, + clk3_duty_cycle => 50, + clk3_multiply_by => 25, + clk3_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=PLL", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_UNUSED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_UNUSED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_USED", + port_clk3 => "PORT_USED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + width_clock => 5 + ) + PORT MAP ( + inclk => sub_wire6, + clk => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- 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 "1" +-- 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 "27" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "27" +-- Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "54" +-- Retrieval info: PRIVATE: DIV_FACTOR3 NUMERIC "108" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE2 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE3 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "50.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "25.000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "12.500000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "6.250000" +-- 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: LVDS_PHASE_SHIFT_UNIT1 STRING "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT3 STRING "ps" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK2 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK3 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "50" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "25" +-- Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "25" +-- Retrieval info: PRIVATE: MULT_FACTOR3 NUMERIC "25" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "50.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "25.00000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "12.50000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "6.25000000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE3 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT2 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT3 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_SHIFT1 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT2 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT3 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT3 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: STICKY_CLK1 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK2 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK3 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_CLK1 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK2 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK3 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA2 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA3 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 "27" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "27" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "25" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "54" +-- Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "25" +-- Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "108" +-- Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "25" +-- Retrieval info: CONSTANT: CLK3_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_USED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_USED" +-- 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: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +-- Retrieval info: USED_PORT: c2 0 0 0 0 OUTPUT_CLK_EXT VCC "c2" +-- Retrieval info: USED_PORT: c3 0 0 0 0 OUTPUT_CLK_EXT VCC "c3" +-- 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: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +-- Retrieval info: CONNECT: c2 0 0 0 0 @clk 0 0 1 2 +-- Retrieval info: CONNECT: c3 0 0 0 0 @clk 0 0 1 3 +-- Retrieval info: GEN_FILE: TYPE_NORMAL PLL.vhd 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.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid.vhd b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid.vhd new file mode 100644 index 00000000..f899f230 --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid.vhd @@ -0,0 +1,189 @@ +--Authors: Pietro Bassi, Marco Torsello + +library ieee; +use ieee.numeric_std.all; +use ieee.std_logic_1164.all; +use work.arkanoid_package.all; + +entity arkanoid is +port + ( + CLOCK : in std_logic;--50 + CLOCKVGA : in std_logic;--25 + RESET : in std_logic; + K_LEFT : in std_logic; + K_RIGHT : in std_logic; + K_PAUSE : in std_logic; + K_START : in std_logic; + VGA_R : out std_logic_vector(3 downto 0); + VGA_G : out std_logic_vector(3 downto 0); + VGA_B : out std_logic_vector(3 downto 0); + VGA_HS : out std_logic; + VGA_VS : out std_logic; + audio : out std_logic + ); + +end; + +architecture RTL of arkanoid is + +signal ballX : integer range -BALL_MAX_SPEED to GAME_WIDTH+BALL_MAX_SPEED := BALL_STARTING_POSX; +signal ballY : integer range -BALL_MAX_SPEED to GAME_HEIGHT+BALL_MAX_SPEED := BALL_STARTING_POSY; +signal powerUpX : natural range 0 to GAME_WIDTH; +signal powerUpY : natural range 0 to GAME_HEIGHT+100; +signal paddleX : integer range -PADDLE_SPEED_X to GAME_WIDTH+PADDLE_SPEED_X := PADDLE_STARTING_POSX; +signal paddleWidth : natural range PADDLE_STARTING_WIDTH to 2*PADDLE_STARTING_WIDTH := PADDLE_STARTING_WIDTH; +signal currentLevel : natural range 0 to LEVELS; +signal state : state_type; +signal gameTime : std_logic; +signal paddleMoveDir : integer range -1 to 1; +signal brickMatrix : brick_matrix_type(0 to BRICK_MAX_ROW-1, 0 to BRICK_MAX_COL-1); +signal resetSyncReg : std_logic; +signal RESET_N : std_logic; +signal bricksForNextLevel : unsigned(0 to 7); +signal levelComplete : std_logic; +signal lives : natural range 0 to MAX_LIVES; +signal lifeLost : std_logic; +signal levelLoaded : std_logic; +signal romAddr : std_logic_vector(10 downto 0); +signal romQ : std_logic_vector(3 downto 0); +signal powerUpType : powerup_type; +signal sound : sound_type; +signal squaredX : std_logic_vector(15 downto 0); +signal squaredY : std_logic_vector(15 downto 0); +signal rootX : std_logic_vector(7 downto 0); +signal rootY : std_logic_vector(7 downto 0); +signal clear : std_logic; + +begin + + datapath : entity work.arkanoid_datapath + port map + ( + CLOCK => clock, + GAME_LOGIC_UPDATE => gameTime, + RESET_N => RESET_N, + PADDLE_MOVE_DIR => paddleMoveDir, + STATE => state, + BALL_X => ballX, + BALL_Y => ballY, + PADDLE_X => paddleX, + PADDLE_WIDTH => paddleWidth, + BRICK_MATRIX => brickMatrix, + LEVEL_COMPLETE => levelComplete, + LIVES => lives, + LIFE_LOST => lifeLost, + LEVEL_LOADED => levelLoaded, + ROM_ADDR => romAddr, + ROM_Q => romQ, + SQUARED_X => squaredX, + SQUARED_Y => squaredY, + ROOT_X => rootX, + ROOT_Y => rootY, + SQRT_CLEAR => clear, + POWERUP_X => powerUpX, + POWERUP_Y => powerUpY, + POWERUP => powerUpType, + SOUND => sound + ); + + controller : entity work.arkanoid_controller + port map + ( + CLOCK => clock, + RESET_N => RESET_N, + BUTTON_LEFT => K_LEFT, + BUTTON_RIGHT => K_RIGHT, + BUTTON_PAUSE => K_PAUSE, + BUTTON_START => K_START, + PADDLE_MOVE_DIR => paddleMoveDir, + STATE => state, + LEVEL_COMPLETE => levelComplete, + LIVES => lives, + LIFE_LOST => lifeLost, + LEVEL_LOADED => levelLoaded + ); + + view : entity work.arkanoid_view + port map + ( + CLOCK => clockVGA, + RESET_N => RESET_N, + VGA_R => VGA_R, + VGA_G => VGA_G, + VGA_B => VGA_B, + VGA_HS => VGA_HS, + VGA_VS => VGA_VS, + BALL_X => ballX/UNIT, + BALL_Y => ballY/UNIT, + PADDLE_X => paddleX/UNIT, + PADDLE_WIDTH => paddleWidth/UNIT, + BRICK_MATRIX => brickMatrix, + LIVES => lives, + STATE => state, + POWERUP_X => powerUpX/UNIT, + POWERUP_Y => powerUpY/UNIT, + POWERUP => powerUpType + ); + + arkanoid_levels_rom : entity work.arkanoid_levels_rom + port map + ( + address => romAddr, + clock => clock, + q => romQ + ); + + sqrtX : entity work.sqrt + port map + ( + CLOCK => clock, + CLEAR => clear, + DATA_IN => squaredX, + DATA_OUT => rootX + ); + + sqrtY : entity work.sqrt + port map + ( + CLOCK => clock, + CLEAR => clear, + DATA_IN => squaredY, + DATA_OUT => rootY + ); + + arkanoid_sound : entity work.arkanoid_sound + port map + ( + CLOCK => clock, + RESET_N => RESET_N, + SOUND_PIN => audio, + SOUND_CODE => sound + ); + + reset_sync : process(clock) + begin + if (rising_edge(clock)) then + resetSyncReg <= RESET; + RESET_N <= resetSyncReg; + end if; + end process; + + game_time_generator : process(clock, RESET_N) + variable counter : integer range 0 to (GAME_LOGIC_UPDATE_RATE-1); + begin + if (RESET_N = '0') then + counter := 0; + gameTime <= '0'; + elsif (rising_edge(clock)) then + if(counter = counter'high) then + counter := 0; + gameTime <= '1'; + else + counter := counter+1; + gameTime <= '0'; + end if; + end if; + end process; + +end architecture; \ No newline at end of file diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_controller.vhd b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_controller.vhd new file mode 100644 index 00000000..5c85dfd3 --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_controller.vhd @@ -0,0 +1,145 @@ +--Authors: Pietro Bassi, Marco Torsello + +library ieee; +use ieee.numeric_std.all; +use ieee.std_logic_1164.all; +library work; +use work.arkanoid_package.all; + +entity arkanoid_controller is +port + ( + CLOCK : in std_logic; + RESET_N : in std_logic; + BUTTON_LEFT : in std_logic; + BUTTON_RIGHT : in std_logic; + BUTTON_PAUSE : in std_logic; + BUTTON_START : in std_logic; + LEVEL_COMPLETE : in std_logic; + LEVEL_LOADED : in std_logic; + LIVES : in natural; + LIFE_LOST : in std_logic; + PADDLE_MOVE_DIR : out integer; + STATE : out state_type + ); +end arkanoid_controller; + +architecture RTL of arkanoid_controller is + +constant DIR_LEFT : integer := -1; +constant DIR_RIGHT : integer := 1; + +signal currState : state_type := S_INIT; + +signal startRegister : std_logic:='0'; + +begin + + StateSwitcher : process(CLOCK, RESET_N) + + variable currentLevel : natural range 0 to LEVELS :=0; + + begin + if (RESET_N='0') then + currState<=S_INIT; + elsif (rising_edge(CLOCK)) then + --in order to register the "key down" event only + startRegister<=BUTTON_START; + + case currState is + --INIT + when S_INIT=> + currentLevel:=0; + currState <= S_CHANGELEVEL; + --PAUSED + when S_PAUSED=> + if (BUTTON_START = '1' and startRegister='0') then + currState <= S_PLAYING; + else + currState <= S_PAUSED; + end if; + --PLAYING + when S_PLAYING=> + if (BUTTON_PAUSE = '1') then + currState <= S_PAUSED; + elsif(LEVEL_COMPLETE='1') then + currentLevel:=currentLevel+1; + if(currentLevel/=currentLevel'high) then + currState <= S_CHANGELEVEL; + else + currState <= S_GAMEWON; + end if; + elsif(LIFE_LOST='1') then + if(LIVES>0) then + currState <= S_LIFELOST; + else + currState <= S_GAMELOST; + end if; + end if; + --CHANGELEVEL + when S_CHANGELEVEL=> + if(LEVEL_LOADED='1') then + currState <= S_PAUSED; + else + currState <= S_CHANGELEVEL; + end if; + --LIFELOST + when S_LIFELOST=> + currState <= S_PAUSED; + --GAMELOST + when S_GAMELOST=> + if (BUTTON_START='1' and startRegister='0') then + currState <= S_INIT; + else + currState <= S_GAMELOST; + end if; + --GAMEWON + when S_GAMEWON=> + if (BUTTON_START='1' and startRegister='0') then + currState <= S_INIT; + else + currState <= S_GAMEWON; + end if; + end case; + end if; + end process; + + StateOutput : process(currState) + begin + case currState is + when S_INIT => + STATE <= S_INIT; + when S_PAUSED => + STATE <= S_PAUSED; + when S_PLAYING => + STATE <= S_PLAYING; + when S_CHANGELEVEL => + STATE <= S_CHANGELEVEL; + when S_LIFELOST => + STATE <= S_LIFELOST; + when S_GAMELOST => + STATE <= S_GAMELOST; + when S_GAMEWON => + STATE <= S_GAMEWON; + end case; + end process; + + + InputProcess : process(CLOCK, RESET_N) + + begin + if (rising_edge(CLOCK)) then + --process signals from arkanoid_keyboard and send PADDLE_MOVE_DIR to arkanoid_datapath + if (BUTTON_LEFT='1') then + PADDLE_MOVE_DIR<=DIR_LEFT; + elsif (BUTTON_RIGHT='1') then + PADDLE_MOVE_DIR<=DIR_RIGHT; + elsif (BUTTON_LEFT='0' and BUTTON_RIGHT='0') then + PADDLE_MOVE_DIR<=0; + end if; + + end if; + + end process; + +end architecture; \ No newline at end of file diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_datapath.vhd b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_datapath.vhd new file mode 100644 index 00000000..e605c2ba --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_datapath.vhd @@ -0,0 +1,576 @@ +--Authors: Pietro Bassi, Marco Torsello + +library ieee; +use ieee.numeric_std.all; +use ieee.std_logic_1164.all; +library work; +use work.arkanoid_package.all; + +entity arkanoid_datapath is +port + ( + CLOCK : in std_logic; + GAME_LOGIC_UPDATE : in std_logic; + RESET_N : in std_logic; + PADDLE_MOVE_DIR : in integer; + STATE : in state_type; + ROM_Q : in std_logic_vector(3 downto 0); + ROOT_X : in std_logic_vector (7 downto 0); + ROOT_Y : in std_logic_vector (7 downto 0); + LIFE_LOST : inout std_logic; + LEVEL_LOADED : inout std_logic; + ROM_ADDR : inout std_logic_vector(10 downto 0); + SQUARED_X : out std_logic_vector (15 downto 0); + SQUARED_Y : out std_logic_vector (15 downto 0); + SQRT_CLEAR : out std_logic; + POWERUP : out powerup_type; + SOUND : out sound_type; + LEVEL_COMPLETE : out std_logic; + BALL_X : out integer; + BALL_Y : out integer; + POWERUP_X : out integer; + POWERUP_Y : out integer; + PADDLE_X : out integer; + PADDLE_WIDTH : out integer; + LIVES : out natural; + BRICK_MATRIX : out brick_matrix_type(0 to BRICK_MAX_ROW-1, 0 to BRICK_MAX_COL-1) + ); +end arkanoid_datapath; + +architecture RTL of arkanoid_datapath is + +--ball signals +signal ballX : integer range -BALL_MAX_SPEED to GAME_WIDTH+BALL_MAX_SPEED := BALL_STARTING_POSX; +signal ballY : integer range -BALL_MAX_SPEED to GAME_HEIGHT+BALL_MAX_SPEED := BALL_STARTING_POSY; +signal X : integer range ballX'low to ballX'high; +signal Y : integer range ballY'low to ballY'high; + +signal ballTopX : integer range ballX'low to ballX'high; +signal ballBotX : integer range ballX'low to ballX'high; +signal ballLeftX : integer range ballX'low to ballX'high; +signal ballRightX : integer range ballX'low to ballX'high; +signal ballTopLeftX : integer range ballX'low to ballX'high; +signal ballTopRightX : integer range ballX'low to ballX'high; +signal ballBotLeftX : integer range ballX'low to ballX'high; +signal ballBotRightX : integer range ballX'low to ballX'high; +signal ballTopY : integer range ballX'low to ballX'high; +signal ballBotY : integer range ballX'low to ballX'high; +signal ballLeftY : integer range ballX'low to ballX'high; +signal ballRightY : integer range ballX'low to ballX'high; +signal ballTopLeftY : integer range ballX'low to ballX'high; +signal ballTopRightY : integer range ballX'low to ballX'high; +signal ballBotLeftY : integer range ballX'low to ballX'high; +signal ballBotRightY : integer range ballX'low to ballX'high; + +signal ballAngleX : integer range -UNIT to UNIT:=0; +signal ballAngleY : integer range -UNIT to UNIT:=0; +signal signX : integer range -1 to 1; +signal signY : integer range -1 to 1; +signal squaredSpeed : natural range 0 to BALL_MAX_SPEED**2; + +--paddle signals +signal paddleX : integer range -PADDLE_SPEED_X to GAME_WIDTH+PADDLE_SPEED_X := PADDLE_STARTING_POSX; +signal paddleWidth : natural range PADDLE_STARTING_WIDTH to 2*PADDLE_STARTING_WIDTH := PADDLE_STARTING_WIDTH; +signal nextPaddleX : integer range paddleX'low to paddleX'high; +shared variable paddleEnlarged : std_logic:='0'; + +--powerup signals +signal powerUpX : natural range 0 to GAME_WIDTH; +signal powerUpY : natural range 0 to GAME_HEIGHT+100; +signal powerUpFalling : std_logic:='0'; +signal powerUpType : powerup_type; +signal powerUpCounter : unsigned(0 to 4); +signal powerUpCaught : powerup_type; + +--current level signals +signal brickMatrix : brick_matrix_type(0 to BRICK_MAX_ROW-1, 0 to BRICK_MAX_COL-1); +shared variable i : natural range 0 to BRICK_MAX_ROW:=BRICK_MAX_ROW; +shared variable k : natural range 0 to BRICK_MAX_COL:=BRICK_MAX_COL; +signal romRdy : unsigned(3 downto 0):="0000"; +signal romAddr : unsigned(10 downto 0); +signal bricksForNextLevel : natural range 0 to BRICK_MAX_ROW*BRICK_MAX_COL*UNIT:=1; +signal i_rom : natural range 0 to BRICK_MAX_ROW; +signal k_rom : natural range 0 to BRICK_MAX_COL; +shared variable brickHit : brickhit_type; +shared variable brickX : natural range 0 to BOUND_RIGHT; +shared variable brickY : natural range 0 to BOUND_BOTTOM; +signal brickCollisionCheckEnded : std_logic; + +--game signals +signal gameLogicEnded : std_logic:='1'; +signal currentLevel : natural range 0 to LEVELS-1; +signal livesLeft : natural range 0 to MAX_LIVES; + +begin + + LevelProcess : process(CLOCK, RESET_N, brickMatrix) + + begin + if(rising_edge(CLOCK)) then + --INIT + if(STATE=S_INIT) then + currentLevel<=0; + romAddr<="00000000000"; + romRdy<="0000"; + LEVEL_LOADED<='0'; + i_rom<=0; + k_rom<=0; + bricksForNextLevel<=0; + --CHANGELEVEL + elsif(STATE=S_CHANGELEVEL) then + LEVEL_COMPLETE<='0'; + --load level + if(LEVEL_LOADED='0') then + ROM_ADDR<=std_logic_vector(romAddr(ROM_ADDR'range)); + romAddr<=romAddr+"00000000001"; + if(i_rom/=BRICK_MAX_ROW) then + brickMatrix(i_rom,k_rom) <= unsigned(ROM_Q); + if(unsigned(ROM_Q)>=B_WHITE and unsigned(ROM_Q)<=B_GREY5 and romRdy="0011") then + bricksForNextLevel<=bricksForNextLevel+1; + end if; + if(romRdy<"0011") then + romRdy<=romRdy+1; + else + if(k_rom/=BRICK_MAX_COL-1)then + k_rom<=k_rom+1; + else + k_rom<=0; + i_rom<=i_rom+1; + end if; + end if; + else + LEVEL_LOADED<='1'; + end if; + --when level has been loaded + else + romRdy<="0000"; + i_rom<=0; + k_rom<=0; + LEVEL_LOADED<='0'; + LEVEL_COMPLETE<='0'; + end if; + --PLAYING + elsif(STATE=S_PLAYING) then + --update brick matrix if a collision has happened + if((brickHit=B_BOUNCE or brickHit=B_DESTROYED) and brickCollisionCheckEnded='1') then + brickMatrix(i,k)<=brick_collision_result(brickMatrix(i,k)); + if(brickMatrix(i,k)>=B_WHITE and brickMatrix(i,k)<=B_GREY1) then + bricksForNextLevel<=bricksForNextLevel-1; + end if; + end if; + + --game logic update + if(GAME_LOGIC_UPDATE='1') then + --check if there are no bricks left + if(bricksForNextLevel=0) then + if(currentLevel=LEVELS-1) then + currentLevel<=0; + else + currentLevel<=currentLevel+1; + romAddr<=romAddr+"00000000100"; + end if; + LEVEL_COMPLETE<='1'; + end if; + end if; + end if; + + end if; --clock if + + BRICK_MATRIX<=brickMatrix; + + end process; + + + BallProcess : process(CLOCK, RESET_N, ballX, ballY, livesLeft) + + variable hitPoint : integer range -1 to 9; + + begin + if(rising_edge(CLOCK)) then + --INIT + if(STATE=S_INIT) then + livesLeft<=STARTING_LIVES; + LIFE_LOST<='0'; + --CHANGELEVEL + elsif(STATE=S_CHANGELEVEL) then + if(LEVEL_LOADED='1') then + ballX<=BALL_STARTING_POSX; + ballY<=BALL_STARTING_POSY; + ballAngleX<=0; + ballAngleY<=UNIT; + signX<=1; + signY<=1; + + i:=BRICK_MAX_ROW; + k:=BRICK_MAX_COL; + end if; + --PAUSED + elsif(STATE=S_PAUSED) then + LIFE_LOST<='0'; + --LIFELOST + elsif(STATE=S_LIFELOST) then + ballX<=BALL_STARTING_POSX; + ballY<=BALL_STARTING_POSY; + ballAngleX<=0; + ballAngleY<=UNIT; + signX<=1; + signY<=1; + --PLAYING + elsif(STATE=S_PLAYING) then + SOUND<=PLAY_NULL; + brickCollisionCheckEnded<='0'; + --after game logic phase, send squares of x and y speed components to sqrt entities + if(gameLogicEnded='1') then + SQRT_CLEAR<='1'; + SQUARED_X<=std_logic_vector(to_unsigned(squaredSpeed*ballAngleX, SQUARED_X'length)); + SQUARED_Y<=std_logic_vector(to_unsigned(squaredSpeed*ballAngleY, SQUARED_Y'length)); + gameLogicEnded<='0'; + --reset i and k values so the bounce check can start + i:=0; + k:=0; + else + SQRT_CLEAR<='0'; + end if; + + --store in X and Y the prediction of ball position, based on square roots of x and y speed components + X<=ballX+to_integer(unsigned(ROOT_X))*signX; + Y<=ballY+to_integer(unsigned(ROOT_Y))*signY; + ballTopX <= X+BALL_SIZE/2; + ballTopY <= Y; + ballBotX <= X+BALL_SIZE/2; + ballBotY <= Y+BALL_SIZE-1*UNIT; + ballLeftX <= X; + ballLeftY <= Y+BALL_SIZE/2; + ballRightX <= X+BALL_SIZE-1*UNIT; + ballRightY <= Y+BALL_SIZE/2; + ballTopLeftX <= X+2*UNIT; + ballTopLeftY <= Y+2*UNIT; + ballTopRightX <= X+BALL_SIZE-3*UNIT; + ballTopRightY <= Y+2*UNIT; + ballBotLeftX <= X+2*UNIT; + ballBotLeftY <= Y+BALL_SIZE-3*UNIT; + ballBotRightX <= X+BALL_SIZE-3*UNIT; + ballBotRightY <= Y+BALL_SIZE-3*UNIT; + + --brick matrix bounce + if(i/=BRICK_MAX_ROW and brickHit=B_NULL) then + brickX:=k*BRICK_WIDTH+BRICK_MATRIX_X; + brickY:=i*BRICK_HEIGHT+BRICK_MATRIX_Y; + --if there is a collision with a non-empty brick + if(brickMatrix(i,k)>B_EMPTY) then + --ball hits the LEFT side of the brick + if(is_colliding(ballRightX,ballRightY,brickX,brickY)) then + signX<=-1; + if(brick_collision_result(brickMatrix(i,k))=B_EMPTY) then + brickHit:=B_DESTROYED; + else + brickHit:=B_BOUNCE; + end if; + ballX<=2*brickX-2*BALL_SIZE-X; + --ball hits the RIGHT side of the brick + elsif(is_colliding(ballLeftX,ballLeftY,brickX,brickY)) then + signX<=1; + if(brick_collision_result(brickMatrix(i,k))=B_EMPTY) then + brickHit:=B_DESTROYED; + else + brickHit:=B_BOUNCE; + end if; + ballX<=2*brickX+2*BRICK_WIDTH-X; + --ball hits the TOP side of the brick + elsif(is_colliding(ballBotX,ballBotY,brickX,brickY)) then + signY<=-1; + if(brick_collision_result(brickMatrix(i,k))=B_EMPTY) then + brickHit:=B_DESTROYED; + else + brickHit:=B_BOUNCE; + end if; + ballY<=2*brickY-2*BALL_SIZE-Y; + --ball hits the BOT side of the brick + elsif(is_colliding(ballTopX,ballTopY,brickX,brickY)) then + signY<=1; + if(brick_collision_result(brickMatrix(i,k))=B_EMPTY) then + brickHit:=B_DESTROYED; + else + brickHit:=B_BOUNCE; + end if; + ballY<=2*brickY+2*BRICK_HEIGHT-Y; + + --ball hits the BOTTOM-LEFT edge of the brick + elsif(is_colliding(ballTopRightX,ballTopRightY,brickX,brickY)) then + signX<=-1; + signY<=1; + if(brick_collision_result(brickMatrix(i,k))=B_EMPTY) then + brickHit:=B_DESTROYED; + else + brickHit:=B_BOUNCE; + end if; + --ball hits the BOTTOM-RIGHT edge of the brick + elsif(is_colliding(ballTopLeftX,ballTopLeftY,brickX,brickY)) then + signX<=1; + signY<=1; + if(brick_collision_result(brickMatrix(i,k))=B_EMPTY) then + brickHit:=B_DESTROYED; + else + brickHit:=B_BOUNCE; + end if; + --ball hits the TOP-LEFT edge of the brick + elsif(is_colliding(ballBotRightX,ballBotRightY,brickX,brickY)) then + signX<=-1; + signY<=-1; + if(brick_collision_result(brickMatrix(i,k))=B_EMPTY) then + brickHit:=B_DESTROYED; + else + brickHit:=B_BOUNCE; + end if; + --ball hits the TOP-RIGHT edge of the brick + elsif(is_colliding(ballBotLeftX,ballBotLeftY,brickX,brickY)) then + signX<=1; + signY<=-1; + if(brick_collision_result(brickMatrix(i,k))=B_EMPTY) then + brickHit:=B_DESTROYED; + else + brickHit:=B_BOUNCE; + end if; + end if; + end if; + + if(brickHit=B_NULL) then + k:=k+1; + if(k=BRICK_MAX_COL) then + k:=0; + i:=i+1; + end if; + else + brickCollisionCheckEnded<='1'; + SOUND<=PLAY_BRICK; + end if; + end if; + + --game logic update (and playing) + if(GAME_LOGIC_UPDATE='1') then + gameLogicEnded<='1'; + brickHit:=B_NULL; + + --right bound bounce + if (ballRightX>BOUND_RIGHT) then + ballX<=2*BOUND_RIGHT-2*BALL_SIZE-X; + signX<=-1; + SOUND<=PLAY_BOUND; + --left bound bounce + elsif (ballLeftX<=BOUND_LEFT) then + ballX<=2*BOUND_LEFT-X; + signX<=1; + SOUND<=PLAY_BOUND; + --top bound bounce + elsif (ballTopYBOUND_BOTTOM) then + livesLeft<=livesLeft-1; + LIFE_LOST<='1'; + --paddle bounce + elsif (ballBotY>=PADDLE_STARTING_POSY and ballBotY=paddleX and ballLeftX<=paddleX+paddleWidth) then + if(ballBotX>=paddleX+PADDLE_SIDE_SIZE and ballBotX<=paddleX+paddleWidth-PADDLE_SIDE_SIZE) then + if(paddleEnlarged='0') then + hitPoint:=((ballBotX)-(paddleX+PADDLE_SIDE_SIZE))/(10*UNIT); --total sections: 104-24=80/10=8 + else + hitPoint:=((ballBotX)-(paddleX+PADDLE_SIDE_SIZE))/(30*UNIT/2); + end if; + case hitPoint is + when 0 => ballAngleX<=6; ballAngleY<=10; signX<=-1; signY<=-1; + when 1 => ballAngleX<=4; ballAngleY<=12; signX<=-1; signY<=-1; + when 2 => ballAngleX<=2; ballAngleY<=14; signX<=-1; signY<=-1; + when 3 => ballAngleX<=1; ballAngleY<=15; signX<=-1; signY<=-1; + when 4 => ballAngleX<=1; ballAngleY<=15; signX<=1; signY<=-1; + when 5 => ballAngleX<=2; ballAngleY<=14; signX<=1; signY<=-1; + when 6 => ballAngleX<=4; ballAngleY<=12; signX<=1; signY<=-1; + when 7 => ballAngleX<=6; ballAngleY<=10; signX<=1; signY<=-1; + + when others => ballAngleX<=6; ballAngleY<=10; signX<=1; signY<=-1; + end case; + ballY<=(PADDLE_STARTING_POSY-BALL_SIZE)-(Y+BALL_SIZE-PADDLE_STARTING_POSY); + else + --left side bounce + if(ballBotX=PADDLE_STARTING_POSY) then + ballAngleX<=10; ballAngleY<=6; signX<=-1; signY<=-1; + ballX<=(paddleX-BALL_SIZE)-(X+BALL_SIZE-paddleX)+PADDLE_SPEED_X*PADDLE_MOVE_DIR-2; + else + ballAngleX<=8; ballAngleY<=8; signX<=-1; signY<=-1; + ballY<=(PADDLE_STARTING_POSY-BALL_SIZE)-(Y+BALL_SIZE-PADDLE_STARTING_POSY); + end if; + --right side bounce + else + if(ballLeftY>=PADDLE_STARTING_POSY) then + ballAngleX<=10; ballAngleY<=6; signX<=1; signY<=-1; + ballX<=paddleX+paddleWidth+(paddleX+paddleWidth-X)+PADDLE_SPEED_X*PADDLE_MOVE_DIR+2; + else + ballAngleX<=8; ballAngleY<=8; signX<=1; signY<=-1; + ballY<=(PADDLE_STARTING_POSY-BALL_SIZE)-(Y+BALL_SIZE-PADDLE_STARTING_POSY); + end if; + end if; + end if; --paddle middle if + SOUND<=PLAY_PADDLE; + else + ballX<=X; + ballY<=Y; + end if; --bounce if + --powerup: death + if(powerUpCaught=P_DEATH) then + livesLeft<=livesLeft-1; + LIFE_LOST<='1'; + --powerup: life + elsif(powerUpCaught=P_LIFE and livesLeftBOUND_RIGHT) then + paddleX<=BOUND_RIGHT-paddleWidth; + else + paddleX<=nextPaddleX; + end if; + --powerup: enlarge + if(powerUpCaught=P_ENLARGE) then + paddleEnlarged:='1'; + paddleWidth<=(3*(PADDLE_STARTING_WIDTH-2*PADDLE_SIDE_SIZE))/2+2*PADDLE_SIDE_SIZE; + elsif(powerUpCaught=P_LIFE) then + paddleEnlarged:='0'; + paddleWidth<=PADDLE_STARTING_WIDTH; + end if; + end if; + end if; + end if; + PADDLE_X <= paddleX; + PADDLE_WIDTH <= paddleWidth; + end process; + + + + PowerupProcess : process(CLOCK, RESET_N, powerUpX, powerUpY, powerUpType) + + begin + if (rising_edge(CLOCK)) then + powerUpCounter<=powerUpCounter+1; + --INIT, CHANGELEVEL, LIFELOST + if(STATE=S_INIT or STATE=S_CHANGELEVEL or STATE=S_LIFELOST) then + powerUpType<=P_NULL; + powerUpY<=POWERUP_OFF_Y; + powerUpCaught<=P_NULL; + --PLAYING + elsif(STATE=S_PLAYING) then + --game logic update + if(GAME_LOGIC_UPDATE='1') then + powerUpCaught<=P_NULL; + --if a brick has just been hit and the powerup is not active + if(brickHit=B_DESTROYED and powerUpY>=POWERUP_OFF_Y) then + powerUpX<=brickX+4*UNIT; + powerUpY<=brickY+3*UNIT; + case powerUpCounter is + when "00000" + => powerUpType<=P_LIFE; + when "00001" + => powerUpType<=P_SLOW; + when "00010" + => powerUpType<=P_ENLARGE; + when "00011"|"10011" + => powerUpType<=P_DEATH; + when "11000"|"11100" + => powerUpType<=P_FAST; + + when others => powerUpType<=P_NULL; + end case; + end if; + + --if the powerup is active + if(powerUpY=paddleX-POWERUP_WIDTH and powerUpX=PADDLE_STARTING_POSY and powerUpY+POWERUP_HEIGHT/2(BALL_MAX_SPEED**2)/UNIT) then + squaredSpeed<=(BALL_MAX_SPEED**2)/UNIT; + else + squaredSpeed<=squaredSpeed+POWERUP_SPEED_MOD; + end if; + end if; + end if; + end if; + end if; + end process; + +end architecture; \ No newline at end of file diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_levels_rom.vhd b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_levels_rom.vhd new file mode 100644 index 00000000..e4bcd191 --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_levels_rom.vhd @@ -0,0 +1,169 @@ +-- megafunction wizard: %ROM: 1-PORT% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: arkanoid_levels_rom.vhd +-- Megafunction Name(s): +-- altsyncram +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.0.1 Build 232 06/12/2013 SP 1 SJ Full Version +-- ************************************************************ + + +--Copyright (C) 1991-2013 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. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.all; + +ENTITY arkanoid_levels_rom IS + PORT + ( + address : IN STD_LOGIC_VECTOR (10 DOWNTO 0); + clock : IN STD_LOGIC := '1'; + q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) + ); +END arkanoid_levels_rom; + + +ARCHITECTURE SYN OF arkanoid_levels_rom IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (3 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + address_aclr_a : STRING; + clock_enable_input_a : STRING; + clock_enable_output_a : STRING; + init_file : STRING; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + numwords_a : NATURAL; + operation_mode : STRING; + outdata_aclr_a : STRING; + outdata_reg_a : STRING; + widthad_a : NATURAL; + width_a : NATURAL; + width_byteena_a : NATURAL + ); + PORT ( + address_a : IN STD_LOGIC_VECTOR (10 DOWNTO 0); + clock0 : IN STD_LOGIC ; + q_a : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(3 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + address_aclr_a => "NONE", + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => "./roms/levels.mif", + intended_device_family => "Cyclone III", + lpm_hint => "ENABLE_RUNTIME_MOD=NO", + lpm_type => "altsyncram", + numwords_a => 2048, + operation_mode => "ROM", + outdata_aclr_a => "NONE", + outdata_reg_a => "CLOCK0", + widthad_a => 11, + width_a => 4, + width_byteena_a => 1 + ) + PORT MAP ( + address_a => address, + clock0 => clock, + q_a => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: AclrAddr NUMERIC "0" +-- Retrieval info: PRIVATE: AclrByte NUMERIC "0" +-- Retrieval info: PRIVATE: AclrOutput NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clken NUMERIC "0" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0" +-- Retrieval info: PRIVATE: JTAG_ID STRING "NONE" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "./roms/levels.mif" +-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "2048" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: RegAddr NUMERIC "1" +-- Retrieval info: PRIVATE: RegOutput NUMERIC "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: SingleClock NUMERIC "1" +-- Retrieval info: PRIVATE: UseDQRAM NUMERIC "0" +-- Retrieval info: PRIVATE: WidthAddr NUMERIC "11" +-- Retrieval info: PRIVATE: WidthData NUMERIC "4" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" +-- Retrieval info: CONSTANT: INIT_FILE STRING "./roms/levels.mif" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "2048" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "11" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "4" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: USED_PORT: address 0 0 11 0 INPUT NODEFVAL "address[10..0]" +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" +-- Retrieval info: USED_PORT: q 0 0 4 0 OUTPUT NODEFVAL "q[3..0]" +-- Retrieval info: CONNECT: @address_a 0 0 11 0 address 0 0 11 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: CONNECT: q 0 0 4 0 @q_a 0 0 4 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL arkanoid_levels_rom.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL arkanoid_levels_rom.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL arkanoid_levels_rom.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL arkanoid_levels_rom.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL arkanoid_levels_rom_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_package.vhd b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_package.vhd new file mode 100644 index 00000000..979e326d --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_package.vhd @@ -0,0 +1,115 @@ +--Authors: Pietro Bassi, Marco Torsello + +library ieee; +use ieee.numeric_std.all; +use ieee.std_logic_1164.all; + +package arkanoid_package is + --CONSTANTS + + --game + constant UNIT : positive := 16; + constant GAME_LOGIC_UPDATE_RATE : positive := 416667; + constant GAME_WIDTH : natural := 640*UNIT; + constant GAME_HEIGHT : natural := 480*UNIT; + constant LEVELS : positive := 13; + constant STARTING_LIVES : positive := 3; + constant MAX_LIVES : positive := 4; + + --bounds + constant BOUND_TOP_THICKNESS : natural := 50*UNIT; + constant BOUND_LAT_THICKNESS : natural := 20*UNIT; + constant BOUND_TOP : natural := BOUND_TOP_THICKNESS; + constant BOUND_LEFT : natural := BOUND_LAT_THICKNESS; + constant BOUND_RIGHT : natural := GAME_WIDTH-BOUND_LAT_THICKNESS; + constant BOUND_BOTTOM : natural := GAME_HEIGHT; + + --ball + constant BALL_SIZE : natural := 13*UNIT; + constant BALL_STARTING_POSX : natural := GAME_WIDTH/2-BALL_SIZE; + constant BALL_STARTING_POSY : natural := 340*UNIT; + constant BALL_STARTING_SPEED : integer := 13*UNIT/4; + constant BALL_MAX_SPEED : integer := 5*UNIT; + constant BALL_SPEEDUP_RATE : integer := 15000000; + + --paddle + constant PADDLE_HEIGHT : natural := 18*UNIT; + constant PADDLE_STARTING_WIDTH : natural := 104*UNIT; + constant PADDLE_STARTING_POSX : natural := GAME_WIDTH/2-PADDLE_STARTING_WIDTH/2; + constant PADDLE_STARTING_POSY : natural := GAME_HEIGHT-PADDLE_HEIGHT-16*UNIT; + constant PADDLE_SPEED_X : natural := 5*UNIT; + constant PADDLE_SIDE_SIZE : natural := 12*UNIT; + + --brick + constant BRICK_WIDTH : natural := 40*UNIT; + constant BRICK_HEIGHT : natural := 20*UNIT; + constant BRICK_MATRIX_X : natural := BOUND_LEFT; + constant BRICK_MATRIX_Y : natural := BOUND_TOP+BRICK_HEIGHT*3; + constant BRICK_MAX_ROW : natural := 10; + constant BRICK_MAX_COL : natural := 15; + constant BRICK_TOTAL : natural := BRICK_MAX_ROW*BRICK_MAX_COL; + + --powerup + constant POWERUP_WIDTH : natural := 32*UNIT; + constant POWERUP_HEIGHT : natural := 14*UNIT; + constant POWERUP_SPEED_Y : natural := 5*UNIT/2; + constant POWERUP_OFF_Y : natural := GAME_HEIGHT; + constant POWERUP_SPEED_MOD : natural := 4*UNIT; + + --types definition + type state_type is (S_INIT, S_PAUSED, S_PLAYING, S_CHANGELEVEL, S_LIFELOST, S_GAMELOST, S_GAMEWON); + type powerup_type is (P_NULL, P_LIFE, P_SLOW, P_FAST, P_ENLARGE, P_DEATH); + type brickhit_type is (B_NULL, B_BOUNCE, B_DESTROYED); + type sound_type is (PLAY_NULL, PLAY_PADDLE, PLAY_BRICK, PLAY_BOUND); + subtype brick_type is unsigned(0 to 3); + type brick_matrix_type is array(natural range <>, natural range <>) of brick_type; + + --bricks constants + constant B_EMPTY : brick_type := X"0"; + constant B_WHITE : brick_type := X"1"; + constant B_ORANGE : brick_type := X"2"; + constant B_CYAN : brick_type := X"3"; + constant B_GREEN : brick_type := X"4"; + constant B_RED : brick_type := X"5"; + constant B_BLUE : brick_type := X"6"; + constant B_PINK : brick_type := X"7"; + constant B_PURPLE : brick_type := X"8"; + constant B_YELLOW : brick_type := X"9"; + constant B_GREY1 : brick_type := X"A"; + constant B_GREY2 : brick_type := X"B"; + constant B_GREY3 : brick_type := X"C"; + constant B_GREY4 : brick_type := X"D"; + constant B_GREY5 : brick_type := X"E"; + constant B_GOLD : brick_type := X"F"; + + --FUNCTIONS + function brick_collision_result ( brick : brick_type ) return brick_type; + function is_colliding ( pointX : integer; pointY : integer; brickX : integer; brickY : integer ) return boolean; + +end package; + +package body arkanoid_package is + + function brick_collision_result ( brick : brick_type ) return brick_type is + begin + if (brick<=B_GREY1) then + return B_EMPTY; + elsif (brick>=B_GREY2 and brick<=B_GREY5) then + return brick-1; + else + return brick; + end if; + end brick_collision_result; + + function is_colliding ( pointX : integer; pointY : integer; brickX : integer; brickY : integer ) return boolean is + begin + if (pointX>=brickX and pointX=brickY and pointY 0) then + + case sound is + when PLAY_PADDLE => SOUND_PIN<= soundPaddle; + when PLAY_BRICK => SOUND_PIN<= soundBrick; + when PLAY_BOUND => SOUND_PIN<= soundBound; + when others => SOUND_PIN<= '0'; + end case; + else + SOUND_PIN<= '0'; + sound:=PLAY_NULL; + end if; + end if; + end if; + end process; + + +end architecture; \ No newline at end of file diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_view.vhd b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_view.vhd new file mode 100644 index 00000000..472731dd --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/arkanoid_view.vhd @@ -0,0 +1,433 @@ +--Authors: Pietro Bassi, Marco Torsello + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use work.arkanoid_package.all; +use work.vga_package.all; + +entity arkanoid_view is + +port + ( + CLOCK : in std_logic; + RESET_N : in std_logic; + BALL_X : in integer; + BALL_Y : in integer; + PADDLE_X : in integer; + PADDLE_WIDTH : in integer; + BRICK_MATRIX : in brick_matrix_type(0 to BRICK_MAX_ROW-1, 0 to BRICK_MAX_COL-1); + LIVES : in natural; + STATE : in state_type; + POWERUP_X : in integer; + POWERUP_Y : in integer; + POWERUP : in powerup_type; + VGA_HS : out std_logic; + VGA_VS : out std_logic; + VGA_R : out std_logic_vector(3 downto 0); + VGA_G : out std_logic_vector(3 downto 0); + VGA_B : out std_logic_vector(3 downto 0) + ); +end; +architecture RTL of arkanoid_view is + +type light_state_type is (LS_DARKER_UP, LS_DARK_UP, LS_LIGHT_DN, LS_DARK_DN); + +signal lightState : light_state_type; +signal backgroundFlagX : std_logic :='0'; +signal backgroundFlagY : std_logic :='0'; +signal changeLight : std_logic:='0'; +signal lightColor : color_type:=COLOR_LIGHTDARKER; +signal heartColor : color_type:=COLOR_HEARTDARK; + +begin + DrawProcess : process(CLOCK,RESET_N) + + variable old_x : integer range 0 to TOTAL_W:=0; + variable old_y : integer range 0 to TOTAL_H:=0; + variable x : integer range 0 to VISIBLE_WIDTH:=0; + variable y : integer range 0 to VISIBLE_HEIGHT:=0; + + variable brickX : integer; + variable brickY : integer; + + variable brickColor : color_type; + + alias R_BRICK is brickColor(0 to 3); + alias G_BRICK is brickColor(4 to 7); + alias B_BRICK is brickColor(8 to 11); + + variable powerupColor : powerup_color_type; + alias R_POWERUP_LIGHT is powerupColor(0 to 3); + alias G_POWERUP_LIGHT is powerupColor(4 to 7); + alias B_POWERUP_LIGHT is powerupColor(8 to 11); + alias R_POWERUP_DARK is powerupColor(12 to 15); + alias G_POWERUP_DARK is powerupColor(16 to 19); + alias B_POWERUP_DARK is powerupColor(20 to 23); + + begin + if(RESET_N='0') then + old_x:=0; + old_y:=0; + x:=0; + y:=0; + VGA_HS<='0'; + VGA_VS<='0'; + VGA_R <= X"0"; + VGA_G <= X"0"; + VGA_B <= X"0"; + backgroundFlagX<='0'; + backgroundFlagY<='0'; + elsif rising_edge(CLOCK) then + + if(changeLight = '1') then + case lightState is + when LS_DARKER_UP=> + lightState<=LS_DARK_UP; + when LS_DARK_UP=> + lightState<=LS_LIGHT_DN; + when LS_LIGHT_DN=> + lightState<=LS_DARK_DN; + when LS_DARK_DN=> + lightState<=LS_DARKER_UP; + end case; + end if; + + --Vertical sync + if (old_y=WINDOW_HORIZONTAL_START and old_x=WINDOW_VERTICAL_START and old_y=0 and x=BOUND_RIGHT/UNIT or y=BOUND_LEFT/UNIT-2 and x=BOUND_TOP/UNIT-2) then + VGA_R <= X"0"; + VGA_G <= X"0"; + VGA_B <= X"0"; + end if; + end if; + --end draw bounds + + --draw lives + if(y<=LIVES_Y+24) then + for i in 0 to MAX_LIVES-1 loop + if(i+1<=LIVES) then + if + ( + (x>=LIVES_X+i*32+4 and x=LIVES_Y+0 and y=LIVES_X+i*32+16 and x=LIVES_Y+0 and y=LIVES_X+i*32+2 and x=LIVES_Y+2 and y=LIVES_X+i*32+14 and x=LIVES_Y+2 and y=LIVES_X+i*32+0 and x=LIVES_Y+4 and y=LIVES_X+i*32+2 and x=LIVES_Y+12 and y=LIVES_X+i*32+4 and x=LIVES_Y+14 and y=LIVES_X+i*32+6 and x=LIVES_Y+16 and y=LIVES_X+i*32+8 and x=LIVES_Y+18 and y=LIVES_X+i*32+10 and x=LIVES_Y+20 and y=LIVES_X+i*32+12 and x=LIVES_Y+22 and y=LIVES_X+i*32+4 and x=LIVES_Y+10 and y=LIVES_X+i*32+4 and x=LIVES_Y+4 and y=LIVES_X+i*32+6 and x=LIVES_Y+4 and y=BRICK_MATRIX_Y/UNIT and y=brickX and x=brickY and y=PADDLE_X and x=PADDLE_STARTING_POSY/UNIT and y=PADDLE_X+12 and x=PADDLE_STARTING_POSY/UNIT+2 and y=PADDLE_X+14 and x=PADDLE_X+6 and x=PADDLE_X+PADDLE_WIDTH-12 and x=PADDLE_X+4 and x=PADDLE_STARTING_POSY/UNIT+2 and y=PADDLE_X+PADDLE_WIDTH-6 and x=PADDLE_STARTING_POSY/UNIT+2 and y=PADDLE_X+4 and x=PADDLE_STARTING_POSY/UNIT+4 and y=PADDLE_X+PADDLE_WIDTH-12 and x=PADDLE_STARTING_POSY/UNIT+4 and y=PADDLE_X and x=PADDLE_STARTING_POSY/UNIT+6 and y=PADDLE_X+2 and x=PADDLE_STARTING_POSY/UNIT+4 and y=PADDLE_X+PADDLE_WIDTH-2 and x=PADDLE_STARTING_POSY/UNIT+6 and y=PADDLE_X+PADDLE_WIDTH-4 and x=PADDLE_STARTING_POSY/UNIT+4 and y=PADDLE_X+6 and x=PADDLE_STARTING_POSY/UNIT+2 and y=PADDLE_X+4 and x=PADDLE_STARTING_POSY/UNIT+4 and y=PADDLE_X+PADDLE_WIDTH-12 and x=PADDLE_STARTING_POSY/UNIT+2 and y=PADDLE_X and x=PADDLE_STARTING_POSY/UNIT+6 and y=PADDLE_X+PADDLE_WIDTH-4 and x=PADDLE_STARTING_POSY/UNIT+6 and y powerUpColor:=get_powerup_color(P_LIFE); + when P_SLOW => powerUpColor:=get_powerup_color(P_SLOW); + when P_ENLARGE => powerUpColor:=get_powerup_color(P_ENLARGE); + when P_DEATH => powerUpColor:=get_powerup_color(P_DEATH); + when P_FAST => powerUpColor:=get_powerup_color(P_FAST); + + when others => + end case; + + if(x>=POWERUP_X and x=POWERUP_Y and y=POWERUP_X+2 and x=POWERUP_Y+2 and y=POWERUP_X+4 and x=POWERUP_Y+2 and y=POWERUP_X+2 and x=POWERUP_Y+4 and y=POWERUP_X+2 and x=POWERUP_Y+2 and y=POWERUP_X+0 and x=POWERUP_Y+4 and y=BALL_X and x=BALL_Y and y=BALL_X+4 and x=BALL_Y+0 and y=BALL_X+2 and x=BALL_Y+1 and y=BALL_X+1 and x=BALL_Y+2 and y=BALL_X+0 and x=BALL_Y+4 and y=BALL_X+5 and x=BALL_Y+2 and y=BALL_X+3 and x=BALL_Y+3 and y=BALL_X+2 and x=BALL_Y+5 and y + lightColor<=COLOR_LIGHTDARKER; + heartColor<=COLOR_HEARTDARK; + when LS_DARK_UP=> + lightColor<=COLOR_LIGHTDARK; + heartColor<=COLOR_HEARTDARK; + when LS_LIGHT_DN=> + lightColor<=COLOR_LIGHTLIGHT; + heartColor<=COLOR_HEARTLIGHT; + when LS_DARK_DN=> + lightColor<=COLOR_LIGHTDARK; + heartColor<=COLOR_HEARTLIGHT; + end case; + end process; + + animation_time_generator : process(CLOCK, RESET_N) + variable counter : integer range 0 to (ANIMATION_RATE-1); + begin + if (RESET_N = '0') then + counter := 0; + changeLight <= '0'; + elsif (rising_edge(CLOCK)) then + if(counter = counter'high) then + counter := 0; + changeLight <= '1'; + else + counter := counter+1; + changeLight <= '0'; + end if; + end if; + end process; + +end architecture; \ No newline at end of file diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/build_id.tcl b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/build_id.v b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/build_id.v new file mode 100644 index 00000000..f9432adb --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/build_id.v @@ -0,0 +1,2 @@ +`define BUILD_DATE "181204" +`define BUILD_TIME "062230" diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/hq2x.sv b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/hq2x.sv new file mode 100644 index 00000000..f17732b6 --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/hq2x.sv @@ -0,0 +1,454 @@ +// +// +// Copyright (c) 2012-2013 Ludvig Strigeus +// Copyright (c) 2017 Sorgelig +// +// This program is GPL Licensed. See COPYING for the full license. +// +// +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +// synopsys translate_off +`timescale 1 ps / 1 ps +// synopsys translate_on + +`define BITS_TO_FIT(N) ( \ + N <= 2 ? 0 : \ + N <= 4 ? 1 : \ + N <= 8 ? 2 : \ + N <= 16 ? 3 : \ + N <= 32 ? 4 : \ + N <= 64 ? 5 : \ + N <= 128 ? 6 : \ + N <= 256 ? 7 : \ + N <= 512 ? 8 : \ + N <=1024 ? 9 : 10 ) + +module hq2x_in #(parameter LENGTH, parameter DWIDTH) +( + input clk, + + input [AWIDTH:0] rdaddr, + input rdbuf, + output[DWIDTH:0] q, + + input [AWIDTH:0] wraddr, + input wrbuf, + input [DWIDTH:0] data, + input wren +); + + localparam AWIDTH = `BITS_TO_FIT(LENGTH); + wire [DWIDTH:0] out[2]; + assign q = out[rdbuf]; + + hq2x_buf #(.NUMWORDS(LENGTH), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf0(clk,data,rdaddr,wraddr,wren && (wrbuf == 0),out[0]); + hq2x_buf #(.NUMWORDS(LENGTH), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf1(clk,data,rdaddr,wraddr,wren && (wrbuf == 1),out[1]); +endmodule + + +module hq2x_out #(parameter LENGTH, parameter DWIDTH) +( + input clk, + + input [AWIDTH:0] rdaddr, + input [1:0] rdbuf, + output[DWIDTH:0] q, + + input [AWIDTH:0] wraddr, + input [1:0] wrbuf, + input [DWIDTH:0] data, + input wren +); + + localparam AWIDTH = `BITS_TO_FIT(LENGTH*2); + wire [DWIDTH:0] out[4]; + assign q = out[rdbuf]; + + hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf0(clk,data,rdaddr,wraddr,wren && (wrbuf == 0),out[0]); + hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf1(clk,data,rdaddr,wraddr,wren && (wrbuf == 1),out[1]); + hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf2(clk,data,rdaddr,wraddr,wren && (wrbuf == 2),out[2]); + hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf3(clk,data,rdaddr,wraddr,wren && (wrbuf == 3),out[3]); +endmodule + + +module hq2x_buf #(parameter NUMWORDS, parameter AWIDTH, parameter DWIDTH) +( + input clock, + input [DWIDTH:0] data, + input [AWIDTH:0] rdaddress, + input [AWIDTH:0] wraddress, + input wren, + output [DWIDTH:0] q +); + + altsyncram altsyncram_component ( + .address_a (wraddress), + .clock0 (clock), + .data_a (data), + .wren_a (wren), + .address_b (rdaddress), + .q_b(q), + .aclr0 (1'b0), + .aclr1 (1'b0), + .addressstall_a (1'b0), + .addressstall_b (1'b0), + .byteena_a (1'b1), + .byteena_b (1'b1), + .clock1 (1'b1), + .clocken0 (1'b1), + .clocken1 (1'b1), + .clocken2 (1'b1), + .clocken3 (1'b1), + .data_b ({(DWIDTH+1){1'b1}}), + .eccstatus (), + .q_a (), + .rden_a (1'b1), + .rden_b (1'b1), + .wren_b (1'b0)); + defparam + altsyncram_component.address_aclr_b = "NONE", + altsyncram_component.address_reg_b = "CLOCK0", + altsyncram_component.clock_enable_input_a = "BYPASS", + altsyncram_component.clock_enable_input_b = "BYPASS", + altsyncram_component.clock_enable_output_b = "BYPASS", + altsyncram_component.intended_device_family = "Cyclone III", + altsyncram_component.lpm_type = "altsyncram", + altsyncram_component.numwords_a = NUMWORDS, + altsyncram_component.numwords_b = NUMWORDS, + altsyncram_component.operation_mode = "DUAL_PORT", + altsyncram_component.outdata_aclr_b = "NONE", + altsyncram_component.outdata_reg_b = "UNREGISTERED", + altsyncram_component.power_up_uninitialized = "FALSE", + altsyncram_component.read_during_write_mode_mixed_ports = "DONT_CARE", + altsyncram_component.widthad_a = AWIDTH+1, + altsyncram_component.widthad_b = AWIDTH+1, + altsyncram_component.width_a = DWIDTH+1, + altsyncram_component.width_b = DWIDTH+1, + altsyncram_component.width_byteena_a = 1; + +endmodule + +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +module DiffCheck +( + input [17:0] rgb1, + input [17:0] rgb2, + output result +); + + wire [5:0] r = rgb1[5:1] - rgb2[5:1]; + wire [5:0] g = rgb1[11:7] - rgb2[11:7]; + wire [5:0] b = rgb1[17:13] - rgb2[17:13]; + wire [6:0] t = $signed(r) + $signed(b); + wire [6:0] gx = {g[5], g}; + wire [7:0] y = $signed(t) + $signed(gx); + wire [6:0] u = $signed(r) - $signed(b); + wire [7:0] v = $signed({g, 1'b0}) - $signed(t); + + // if y is inside (-24..24) + wire y_inside = (y < 8'h18 || y >= 8'he8); + + // if u is inside (-4, 4) + wire u_inside = (u < 7'h4 || u >= 7'h7c); + + // if v is inside (-6, 6) + wire v_inside = (v < 8'h6 || v >= 8'hfA); + assign result = !(y_inside && u_inside && v_inside); +endmodule + +module InnerBlend +( + input [8:0] Op, + input [5:0] A, + input [5:0] B, + input [5:0] C, + output [5:0] O +); + + function [8:0] mul6x3; + input [5:0] op1; + input [2:0] op2; + begin + mul6x3 = 9'd0; + if(op2[0]) mul6x3 = mul6x3 + op1; + if(op2[1]) mul6x3 = mul6x3 + {op1, 1'b0}; + if(op2[2]) mul6x3 = mul6x3 + {op1, 2'b00}; + end + endfunction + + wire OpOnes = Op[4]; + wire [8:0] Amul = mul6x3(A, Op[7:5]); + wire [8:0] Bmul = mul6x3(B, {Op[3:2], 1'b0}); + wire [8:0] Cmul = mul6x3(C, {Op[1:0], 1'b0}); + wire [8:0] At = Amul; + wire [8:0] Bt = (OpOnes == 0) ? Bmul : {3'b0, B}; + wire [8:0] Ct = (OpOnes == 0) ? Cmul : {3'b0, C}; + wire [9:0] Res = {At, 1'b0} + Bt + Ct; + assign O = Op[8] ? A : Res[9:4]; +endmodule + +module Blend +( + input [5:0] rule, + input disable_hq2x, + input [17:0] E, + input [17:0] A, + input [17:0] B, + input [17:0] D, + input [17:0] F, + input [17:0] H, + output [17:0] Result +); + + reg [1:0] input_ctrl; + reg [8:0] op; + localparam BLEND0 = 9'b1_xxx_x_xx_xx; // 0: A + localparam BLEND1 = 9'b0_110_0_10_00; // 1: (A * 12 + B * 4) >> 4 + localparam BLEND2 = 9'b0_100_0_10_10; // 2: (A * 8 + B * 4 + C * 4) >> 4 + localparam BLEND3 = 9'b0_101_0_10_01; // 3: (A * 10 + B * 4 + C * 2) >> 4 + localparam BLEND4 = 9'b0_110_0_01_01; // 4: (A * 12 + B * 2 + C * 2) >> 4 + localparam BLEND5 = 9'b0_010_0_11_11; // 5: (A * 4 + (B + C) * 6) >> 4 + localparam BLEND6 = 9'b0_111_1_xx_xx; // 6: (A * 14 + B + C) >> 4 + localparam AB = 2'b00; + localparam AD = 2'b01; + localparam DB = 2'b10; + localparam BD = 2'b11; + wire is_diff; + DiffCheck diff_checker(rule[1] ? B : H, rule[0] ? D : F, is_diff); + + always @* begin + case({!is_diff, rule[5:2]}) + 1,17: {op, input_ctrl} = {BLEND1, AB}; + 2,18: {op, input_ctrl} = {BLEND1, DB}; + 3,19: {op, input_ctrl} = {BLEND1, BD}; + 4,20: {op, input_ctrl} = {BLEND2, DB}; + 5,21: {op, input_ctrl} = {BLEND2, AB}; + 6,22: {op, input_ctrl} = {BLEND2, AD}; + + 8: {op, input_ctrl} = {BLEND0, 2'bxx}; + 9: {op, input_ctrl} = {BLEND0, 2'bxx}; + 10: {op, input_ctrl} = {BLEND0, 2'bxx}; + 11: {op, input_ctrl} = {BLEND1, AB}; + 12: {op, input_ctrl} = {BLEND1, AB}; + 13: {op, input_ctrl} = {BLEND1, AB}; + 14: {op, input_ctrl} = {BLEND1, DB}; + 15: {op, input_ctrl} = {BLEND1, BD}; + + 24: {op, input_ctrl} = {BLEND2, DB}; + 25: {op, input_ctrl} = {BLEND5, DB}; + 26: {op, input_ctrl} = {BLEND6, DB}; + 27: {op, input_ctrl} = {BLEND2, DB}; + 28: {op, input_ctrl} = {BLEND4, DB}; + 29: {op, input_ctrl} = {BLEND5, DB}; + 30: {op, input_ctrl} = {BLEND3, BD}; + 31: {op, input_ctrl} = {BLEND3, DB}; + default: {op, input_ctrl} = 11'bx; + endcase + + // Setting op[8] effectively disables HQ2X because blend will always return E. + if (disable_hq2x) op[8] = 1; + end + + // Generate inputs to the inner blender. Valid combinations. + // 00: E A B + // 01: E A D + // 10: E D B + // 11: E B D + wire [17:0] Input1 = E; + wire [17:0] Input2 = !input_ctrl[1] ? A : + !input_ctrl[0] ? D : B; + + wire [17:0] Input3 = !input_ctrl[0] ? B : D; + InnerBlend inner_blend1(op, Input1[5:0], Input2[5:0], Input3[5:0], Result[5:0]); + InnerBlend inner_blend2(op, Input1[11:6], Input2[11:6], Input3[11:6], Result[11:6]); + InnerBlend inner_blend3(op, Input1[17:12], Input2[17:12], Input3[17:12], Result[17:12]); +endmodule + + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +module Hq2x #(parameter LENGTH, parameter HALF_DEPTH) +( + input clk, + input ce_x4, + input [DWIDTH:0] inputpixel, + input mono, + input disable_hq2x, + input reset_frame, + input reset_line, + input [1:0] read_y, + input [AWIDTH+1:0] read_x, + output [DWIDTH:0] outpixel +); + + +localparam AWIDTH = `BITS_TO_FIT(LENGTH); +localparam DWIDTH = HALF_DEPTH ? 8 : 17; + +wire [5:0] hqTable[256] = '{ + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 47, 35, 23, 15, 55, 39, + 19, 19, 26, 58, 19, 19, 26, 58, 23, 15, 35, 35, 23, 15, 7, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 55, 39, 23, 15, 51, 43, + 19, 19, 26, 58, 19, 19, 26, 58, 23, 15, 51, 35, 23, 15, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 61, 35, 35, 23, 61, 51, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 51, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 61, 7, 35, 23, 61, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 58, 23, 15, 51, 35, 23, 61, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 47, 35, 23, 15, 55, 39, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 51, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 55, 39, 23, 15, 51, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 39, 23, 15, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 51, 39, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 7, 35, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 7, 43, + 19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 7, 35, 23, 15, 7, 43 +}; + +reg [17:0] Prev0, Prev1, Prev2, Curr0, Curr1, Next0, Next1, Next2; +reg [17:0] A, B, D, F, G, H; +reg [7:0] pattern, nextpatt; +reg [1:0] i; +reg [7:0] y; + +wire curbuf = y[0]; +reg prevbuf = 0; +wire iobuf = !curbuf; + +wire diff0, diff1; +DiffCheck diffcheck0(Curr1, (i == 0) ? Prev0 : (i == 1) ? Curr0 : (i == 2) ? Prev2 : Next1, diff0); +DiffCheck diffcheck1(Curr1, (i == 0) ? Prev1 : (i == 1) ? Next0 : (i == 2) ? Curr2 : Next2, diff1); + +wire [7:0] new_pattern = {diff1, diff0, pattern[7:2]}; + +wire [17:0] X = (i == 0) ? A : (i == 1) ? Prev1 : (i == 2) ? Next1 : G; +wire [17:0] blend_result; +Blend blender(hqTable[nextpatt], disable_hq2x, Curr0, X, B, D, F, H, blend_result); + +reg Curr2_addr1; +reg [AWIDTH:0] Curr2_addr2; +wire [17:0] Curr2 = HALF_DEPTH ? h2rgb(Curr2tmp) : Curr2tmp; +wire [DWIDTH:0] Curr2tmp; + +reg [AWIDTH:0] wrin_addr2; +reg [DWIDTH:0] wrpix; +reg wrin_en; + +function [17:0] h2rgb; + input [8:0] v; +begin + h2rgb = mono ? {v[5:3],v[2:0], v[5:3],v[2:0], v[5:3],v[2:0]} : {v[8:6],v[8:6],v[5:3],v[5:3],v[2:0],v[2:0]}; +end +endfunction + +function [8:0] rgb2h; + input [17:0] v; +begin + rgb2h = mono ? {3'b000, v[17:15], v[14:12]} : {v[17:15], v[11:9], v[5:3]}; +end +endfunction + +hq2x_in #(.LENGTH(LENGTH), .DWIDTH(DWIDTH)) hq2x_in +( + .clk(clk), + + .rdaddr(Curr2_addr2), + .rdbuf(Curr2_addr1), + .q(Curr2tmp), + + .wraddr(wrin_addr2), + .wrbuf(iobuf), + .data(wrpix), + .wren(wrin_en) +); + +reg [1:0] wrout_addr1; +reg [AWIDTH+1:0] wrout_addr2; +reg wrout_en; +reg [DWIDTH:0] wrdata; + +hq2x_out #(.LENGTH(LENGTH), .DWIDTH(DWIDTH)) hq2x_out +( + .clk(clk), + + .rdaddr(read_x), + .rdbuf(read_y), + .q(outpixel), + + .wraddr(wrout_addr2), + .wrbuf(wrout_addr1), + .data(wrdata), + .wren(wrout_en) +); + +always @(posedge clk) begin + reg [AWIDTH:0] offs; + reg old_reset_line; + reg old_reset_frame; + + wrout_en <= 0; + wrin_en <= 0; + + if(ce_x4) begin + + pattern <= new_pattern; + + if(~&offs) begin + if (i == 0) begin + Curr2_addr1 <= prevbuf; + Curr2_addr2 <= offs; + end + if (i == 1) begin + Prev2 <= Curr2; + Curr2_addr1 <= curbuf; + Curr2_addr2 <= offs; + end + if (i == 2) begin + Next2 <= HALF_DEPTH ? h2rgb(inputpixel) : inputpixel; + wrpix <= inputpixel; + wrin_addr2 <= offs; + wrin_en <= 1; + end + if (i == 3) begin + offs <= offs + 1'd1; + end + + if(HALF_DEPTH) wrdata <= rgb2h(blend_result); + else wrdata <= blend_result; + + wrout_addr1 <= {curbuf, i[1]}; + wrout_addr2 <= {offs, i[1]^i[0]}; + wrout_en <= 1; + end + + if(i==3) begin + nextpatt <= {new_pattern[7:6], new_pattern[3], new_pattern[5], new_pattern[2], new_pattern[4], new_pattern[1:0]}; + {A, G} <= {Prev0, Next0}; + {B, F, H, D} <= {Prev1, Curr2, Next1, Curr0}; + {Prev0, Prev1} <= {Prev1, Prev2}; + {Curr0, Curr1} <= {Curr1, Curr2}; + {Next0, Next1} <= {Next1, Next2}; + end else begin + nextpatt <= {nextpatt[5], nextpatt[3], nextpatt[0], nextpatt[6], nextpatt[1], nextpatt[7], nextpatt[4], nextpatt[2]}; + {B, F, H, D} <= {F, H, D, B}; + end + + i <= i + 1'b1; + if(old_reset_line && ~reset_line) begin + old_reset_frame <= reset_frame; + offs <= 0; + i <= 0; + y <= y + 1'd1; + prevbuf <= curbuf; + if(old_reset_frame & ~reset_frame) begin + y <= 0; + prevbuf <= 0; + end + end + + old_reset_line <= reset_line; + end +end + +endmodule // Hq2x diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/keyboard.v b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/keyboard.v new file mode 100644 index 00000000..89f7e34e --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/keyboard.v @@ -0,0 +1,82 @@ + + +module keyboard +( + input clk, + input reset, + input ps2_kbd_clk, + input ps2_kbd_data, + + output reg[7:0] joystick +); + +reg [11:0] shift_reg = 12'hFFF; +wire[11:0] kdata = {ps2_kbd_data,shift_reg[11:1]}; +wire [7:0] kcode = kdata[9:2]; +reg release_btn = 0; + +reg [7:0] code; +reg input_strobe = 0; + +always @(negedge clk) begin + reg old_reset = 0; + + old_reset <= reset; + + if(~old_reset & reset)begin + joystick <= 0; + end + + if(input_strobe) begin + case(code) + 'h16: joystick[1] <= ~release_btn; // 1 + 'h1E: joystick[2] <= ~release_btn; // 2 + + 'h75: joystick[4] <= ~release_btn; // arrow up + 'h72: joystick[5] <= ~release_btn; // arrow down + 'h6B: joystick[6] <= ~release_btn; // arrow left + 'h74: joystick[7] <= ~release_btn; // arrow right + + 'h29: joystick[0] <= ~release_btn; // Space + 'h11: joystick[1] <= ~release_btn; // Left Alt + 'h0d: joystick[2] <= ~release_btn; // Tab + 'h76: joystick[3] <= ~release_btn; // Escape + endcase + end +end + +always @(posedge clk) begin + reg [3:0] prev_clk = 0; + reg old_reset = 0; + reg action = 0; + + old_reset <= reset; + input_strobe <= 0; + + if(~old_reset & reset)begin + prev_clk <= 0; + shift_reg <= 12'hFFF; + end else begin + prev_clk <= {ps2_kbd_clk,prev_clk[3:1]}; + if(prev_clk == 1) begin + if (kdata[11] & ^kdata[10:2] & ~kdata[1] & kdata[0]) begin + shift_reg <= 12'hFFF; + if (kcode == 8'he0) ; + // Extended key code follows + else if (kcode == 8'hf0) + // Release code follows + action <= 1; + else begin + // Cancel extended/release flags for next time + action <= 0; + release_btn <= action; + code <= kcode; + input_strobe <= 1; + end + end else begin + shift_reg <= kdata; + end + end + end +end +endmodule diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/mist_io.v b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/mist_io.v new file mode 100644 index 00000000..ad233a3b --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/mist_io.v @@ -0,0 +1,491 @@ +// +// mist_io.v +// +// mist_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 . +// +/////////////////////////////////////////////////////////////////////// + +// +// Use buffer to access SD card. It's time-critical part. +// Made module synchroneous with 2 clock domains: clk_sys and SPI_SCK +// (Sorgelig) +// +// for synchronous projects default value for PS2DIV is fine for any frequency of system clock. +// clk_ps2 = clk_sys/(PS2DIV*2) +// + +module mist_io #(parameter STRLEN=0, parameter PS2DIV=100) +( + + // parameter STRLEN and the actual length of conf_str have to match + input [(8*STRLEN)-1:0] conf_str, + + // Global clock. It should be around 100MHz (higher is better). + input clk_sys, + + // Global SPI clock from ARM. 24MHz + input SPI_SCK, + + input CONF_DATA0, + input SPI_SS2, + output SPI_DO, + input SPI_DI, + + 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 scandoubler_disable, + output ypbpr, + + output reg [31:0] status, + + // SD config + input sd_conf, + input sd_sdhc, + output img_mounted, // signaling that new image has been mounted + output reg [31:0] img_size, // size of image in bytes + + // SD block level access + input [31:0] sd_lba, + input sd_rd, + input sd_wr, + output reg sd_ack, + output reg sd_ack_conf, + + // SD byte level access. Signals for 2-PORT altsyncram. + output reg [8:0] sd_buff_addr, + output reg [7:0] sd_buff_dout, + input [7:0] sd_buff_din, + output reg sd_buff_wr, + + // ps2 keyboard emulation + output ps2_kbd_clk, + output reg ps2_kbd_data, + output ps2_mouse_clk, + output reg ps2_mouse_data, + input ps2_caps_led, + + // ARM -> FPGA download + output reg ioctl_download = 0, // signal indicating an active download + output reg [7:0] ioctl_index, // menu index used to upload the file + output ioctl_wr, + output reg [24:0] ioctl_addr, + output reg [7:0] ioctl_dout +); + +reg [7:0] b_data; +reg [6:0] sbuf; +reg [7:0] cmd; +reg [2:0] bit_cnt; // counts bits 0-7 0-7 ... +reg [9:0] byte_cnt; // counts bytes +reg [7:0] but_sw; +reg [2:0] stick_idx; + +reg mount_strobe = 0; +assign img_mounted = mount_strobe; + +assign buttons = but_sw[1:0]; +assign switches = but_sw[3:2]; +assign scandoubler_disable = but_sw[4]; +assign ypbpr = but_sw[5]; + +wire [7:0] spi_dout = { sbuf, SPI_DI}; + +// 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 }; + +reg spi_do; +assign SPI_DO = CONF_DATA0 ? 1'bZ : spi_do; + +wire [7:0] kbd_led = { 2'b01, 4'b0000, ps2_caps_led, 1'b1}; + +// drive MISO only when transmitting core id +always@(negedge SPI_SCK) begin + if(!CONF_DATA0) begin + // first byte returned is always core type, further bytes are + // command dependent + if(byte_cnt == 0) begin + spi_do <= core_type[~bit_cnt]; + + end else begin + case(cmd) + // reading config string + 8'h14: begin + // returning a byte from string + if(byte_cnt < STRLEN + 1) spi_do <= conf_str[{STRLEN - byte_cnt,~bit_cnt}]; + else spi_do <= 0; + end + + // reading sd card status + 8'h16: begin + if(byte_cnt == 1) spi_do <= sd_cmd[~bit_cnt]; + else if((byte_cnt >= 2) && (byte_cnt < 6)) spi_do <= sd_lba[{5-byte_cnt, ~bit_cnt}]; + else spi_do <= 0; + end + + // reading sd card write data + 8'h18: + spi_do <= b_data[~bit_cnt]; + + // reading keyboard LED status + 8'h1f: + spi_do <= kbd_led[~bit_cnt]; + + default: + spi_do <= 0; + endcase + end + end +end + +reg b_wr2,b_wr3; +always @(negedge clk_sys) begin + b_wr3 <= b_wr2; + sd_buff_wr <= b_wr3; +end + +// SPI receiver +always@(posedge SPI_SCK or posedge CONF_DATA0) begin + + if(CONF_DATA0) begin + b_wr2 <= 0; + bit_cnt <= 0; + byte_cnt <= 0; + sd_ack <= 0; + sd_ack_conf <= 0; + end else begin + b_wr2 <= 0; + + sbuf <= spi_dout[6:0]; + bit_cnt <= bit_cnt + 1'd1; + if(bit_cnt == 5) begin + if (byte_cnt == 0) sd_buff_addr <= 0; + if((byte_cnt != 0) & (sd_buff_addr != 511)) sd_buff_addr <= sd_buff_addr + 1'b1; + if((byte_cnt == 1) & ((cmd == 8'h17) | (cmd == 8'h19))) sd_buff_addr <= 0; + end + + // finished reading command byte + if(bit_cnt == 7) begin + if(~&byte_cnt) byte_cnt <= byte_cnt + 8'd1; + if(byte_cnt == 0) begin + cmd <= spi_dout; + + if(spi_dout == 8'h19) begin + sd_ack_conf <= 1; + sd_buff_addr <= 0; + end + if((spi_dout == 8'h17) || (spi_dout == 8'h18)) begin + sd_ack <= 1; + sd_buff_addr <= 0; + end + if(spi_dout == 8'h18) b_data <= sd_buff_din; + + mount_strobe <= 0; + + end else begin + + case(cmd) + // buttons and switches + 8'h01: but_sw <= spi_dout; + 8'h02: joystick_0 <= spi_dout; + 8'h03: joystick_1 <= spi_dout; + + // store incoming ps2 mouse bytes + 8'h04: begin + ps2_mouse_fifo[ps2_mouse_wptr] <= spi_dout; + ps2_mouse_wptr <= ps2_mouse_wptr + 1'd1; + end + + // store incoming ps2 keyboard bytes + 8'h05: begin + ps2_kbd_fifo[ps2_kbd_wptr] <= spi_dout; + ps2_kbd_wptr <= ps2_kbd_wptr + 1'd1; + end + + 8'h15: status[7:0] <= spi_dout; + + // send SD config IO -> FPGA + // flag that download begins + // sd card knows data is config if sd_dout_strobe is asserted + // with sd_ack still being inactive (low) + 8'h19, + // send sector IO -> FPGA + // flag that download begins + 8'h17: begin + sd_buff_dout <= spi_dout; + b_wr2 <= 1; + end + + 8'h18: b_data <= sd_buff_din; + + // joystick analog + 8'h1a: begin + // first byte is joystick index + if(byte_cnt == 1) stick_idx <= spi_dout[2:0]; + else if(byte_cnt == 2) begin + // second byte is x axis + if(stick_idx == 0) joystick_analog_0[15:8] <= spi_dout; + else if(stick_idx == 1) joystick_analog_1[15:8] <= spi_dout; + end else if(byte_cnt == 3) begin + // third byte is y axis + if(stick_idx == 0) joystick_analog_0[7:0] <= spi_dout; + else if(stick_idx == 1) joystick_analog_1[7:0] <= spi_dout; + end + end + + // notify image selection + 8'h1c: mount_strobe <= 1; + + // send image info + 8'h1d: if(byte_cnt<5) img_size[(byte_cnt-1)<<3 +:8] <= spi_dout; + + // status, 32bit version + 8'h1e: if(byte_cnt<5) status[(byte_cnt-1)<<3 +:8] <= spi_dout; + default: ; + endcase + end + end + end +end + + +/////////////////////////////// PS2 /////////////////////////////// +// 8 byte fifos to store ps2 bytes +localparam PS2_FIFO_BITS = 3; + +reg clk_ps2; +always @(negedge clk_sys) begin + integer cnt; + cnt <= cnt + 1'd1; + if(cnt == PS2DIV) begin + clk_ps2 <= ~clk_ps2; + cnt <= 0; + end +end + +// keyboard +reg [7:0] ps2_kbd_fifo[1<= 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; // stop bit is 1 + + // advance state machine + if(ps2_kbd_tx_state < 11) ps2_kbd_tx_state <= ps2_kbd_tx_state + 1'd1; + else ps2_kbd_tx_state <= 0; + end + end +end + +// mouse +reg [7:0] ps2_mouse_fifo[1<= 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; // stop bit is 1 + + // advance state machine + if(ps2_mouse_tx_state < 11) ps2_mouse_tx_state <= ps2_mouse_tx_state + 1'd1; + else ps2_mouse_tx_state <= 0; + end + end +end + + +/////////////////////////////// DOWNLOADING /////////////////////////////// + +reg [7:0] data_w; +reg [24:0] addr_w; +reg rclk = 0; + +localparam UIO_FILE_TX = 8'h53; +localparam UIO_FILE_TX_DAT = 8'h54; +localparam UIO_FILE_INDEX = 8'h55; + +// data_io has its own SPI interface to the io controller +always@(posedge SPI_SCK, posedge SPI_SS2) begin + reg [6:0] sbuf; + reg [7:0] cmd; + reg [4:0] cnt; + reg [24:0] addr; + + if(SPI_SS2) cnt <= 0; + else begin + rclk <= 0; + + // don't shift in last bit. It is evaluated directly + // when writing to ram + if(cnt != 15) sbuf <= { sbuf[5:0], SPI_DI}; + + // increase target address after write + if(rclk) addr <= addr + 1'd1; + + // count 0-7 8-15 8-15 ... + if(cnt < 15) cnt <= cnt + 1'd1; + else cnt <= 8; + + // finished command byte + if(cnt == 7) cmd <= {sbuf, SPI_DI}; + + // prepare/end transmission + if((cmd == UIO_FILE_TX) && (cnt == 15)) begin + // prepare + if(SPI_DI) begin + addr <= 0; + ioctl_download <= 1; + end else begin + addr_w <= addr; + ioctl_download <= 0; + end + end + + // command 0x54: UIO_FILE_TX + if((cmd == UIO_FILE_TX_DAT) && (cnt == 15)) begin + addr_w <= addr; + data_w <= {sbuf, SPI_DI}; + rclk <= 1; + end + + // expose file (menu) index + if((cmd == UIO_FILE_INDEX) && (cnt == 15)) ioctl_index <= {sbuf, SPI_DI}; + end +end + +assign ioctl_wr = |ioctl_wrd; +reg [1:0] ioctl_wrd; + +always@(negedge clk_sys) begin + reg rclkD, rclkD2; + + rclkD <= rclk; + rclkD2 <= rclkD; + ioctl_wrd<= {ioctl_wrd[0],1'b0}; + + if(rclkD & ~rclkD2) begin + ioctl_dout <= data_w; + ioctl_addr <= addr_w; + ioctl_wrd <= 2'b11; + end +end + +endmodule diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/osd.v b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/osd.v new file mode 100644 index 00000000..c62c10af --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/osd.v @@ -0,0 +1,179 @@ +// A simple OSD implementation. Can be hooked up between a cores +// VGA output and the physical VGA pins + +module osd ( + // OSDs pixel clock, should be synchronous to cores pixel clock to + // avoid jitter. + input clk_sys, + + // SPI interface + input SPI_SCK, + input SPI_SS3, + input SPI_DI, + + // VGA signals coming from core + input [5:0] R_in, + input [5:0] G_in, + input [5:0] B_in, + input HSync, + input VSync, + + // VGA signals going to video connector + output [5:0] R_out, + output [5:0] G_out, + output [5:0] B_out +); + +parameter OSD_X_OFFSET = 10'd0; +parameter OSD_Y_OFFSET = 10'd0; +parameter OSD_COLOR = 3'd0; + +localparam OSD_WIDTH = 10'd256; +localparam OSD_HEIGHT = 10'd128; + +// ********************************************************************************* +// spi client +// ********************************************************************************* + +// this core supports only the display related OSD commands +// of the minimig +reg osd_enable; +(* ramstyle = "no_rw_check" *) reg [7:0] osd_buffer[2047:0]; // the OSD buffer itself + +// the OSD has its own SPI interface to the io controller +always@(posedge SPI_SCK, posedge SPI_SS3) begin + reg [4:0] cnt; + reg [10:0] bcnt; + reg [7:0] sbuf; + reg [7:0] cmd; + + if(SPI_SS3) begin + cnt <= 0; + bcnt <= 0; + end else begin + sbuf <= {sbuf[6:0], SPI_DI}; + + // 0:7 is command, rest payload + if(cnt < 15) cnt <= cnt + 1'd1; + else cnt <= 8; + + if(cnt == 7) begin + cmd <= {sbuf[6:0], SPI_DI}; + + // lower three command bits are line address + bcnt <= {sbuf[1:0], SPI_DI, 8'h00}; + + // command 0x40: OSDCMDENABLE, OSDCMDDISABLE + if(sbuf[6:3] == 4'b0100) osd_enable <= SPI_DI; + end + + // command 0x20: OSDCMDWRITE + if((cmd[7:3] == 5'b00100) && (cnt == 15)) begin + osd_buffer[bcnt] <= {sbuf[6:0], SPI_DI}; + bcnt <= bcnt + 1'd1; + end + end +end + +// ********************************************************************************* +// video timing and sync polarity anaylsis +// ********************************************************************************* + +// horizontal counter +reg [9:0] h_cnt; +reg [9:0] hs_low, hs_high; +wire hs_pol = hs_high < hs_low; +wire [9:0] dsp_width = hs_pol ? hs_low : hs_high; + +// vertical counter +reg [9:0] v_cnt; +reg [9:0] vs_low, vs_high; +wire vs_pol = vs_high < vs_low; +wire [9:0] dsp_height = vs_pol ? vs_low : vs_high; + +wire doublescan = (dsp_height>350); + +reg ce_pix; +always @(negedge clk_sys) begin + integer cnt = 0; + integer pixsz, pixcnt; + reg hs; + + cnt <= cnt + 1; + hs <= HSync; + + pixcnt <= pixcnt + 1; + if(pixcnt == pixsz) pixcnt <= 0; + ce_pix <= !pixcnt; + + if(hs && ~HSync) begin + cnt <= 0; + pixsz <= (cnt >> 9) - 1; + pixcnt <= 0; + ce_pix <= 1; + end +end + +always @(posedge clk_sys) begin + reg hsD, hsD2; + reg vsD, vsD2; + + if(ce_pix) begin + // bring hsync into local clock domain + hsD <= HSync; + hsD2 <= hsD; + + // falling edge of HSync + if(!hsD && hsD2) begin + h_cnt <= 0; + hs_high <= h_cnt; + end + + // rising edge of HSync + else if(hsD && !hsD2) begin + h_cnt <= 0; + hs_low <= h_cnt; + v_cnt <= v_cnt + 1'd1; + end else begin + h_cnt <= h_cnt + 1'd1; + end + + vsD <= VSync; + vsD2 <= vsD; + + // falling edge of VSync + if(!vsD && vsD2) begin + v_cnt <= 0; + vs_high <= v_cnt; + end + + // rising edge of VSync + else if(vsD && !vsD2) begin + v_cnt <= 0; + vs_low <= v_cnt; + end + end +end + +// area in which OSD is being displayed +wire [9:0] h_osd_start = ((dsp_width - OSD_WIDTH)>> 1) + OSD_X_OFFSET; +wire [9:0] h_osd_end = h_osd_start + OSD_WIDTH; +wire [9:0] v_osd_start = ((dsp_height- (OSD_HEIGHT<> 1) + OSD_Y_OFFSET; +wire [9:0] v_osd_end = v_osd_start + (OSD_HEIGHT<= h_osd_start) && (h_cnt < h_osd_end) && + (VSync != vs_pol) && (v_cnt >= v_osd_start) && (v_cnt < v_osd_end); + +reg [7:0] osd_byte; +always @(posedge clk_sys) if(ce_pix) osd_byte <= osd_buffer[{doublescan ? osd_vcnt[7:5] : osd_vcnt[6:4], osd_hcnt[7:0]}]; + +wire osd_pixel = osd_byte[doublescan ? osd_vcnt[4:2] : osd_vcnt[3:1]]; + +assign R_out = !osd_de ? R_in : {osd_pixel, osd_pixel, OSD_COLOR[2], R_in[5:3]}; +assign G_out = !osd_de ? G_in : {osd_pixel, osd_pixel, OSD_COLOR[1], G_in[5:3]}; +assign B_out = !osd_de ? B_in : {osd_pixel, osd_pixel, OSD_COLOR[0], B_in[5:3]}; + +endmodule diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/roms/levels.mif b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/roms/levels.mif new file mode 100644 index 00000000..891bb3d9 --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/roms/levels.mif @@ -0,0 +1,2055 @@ +WIDTH=4; +DEPTH=2048; +ADDRESS_RADIX=UNS; +DATA_RADIX=UNS; + +CONTENT BEGIN +0 : 0; +1 : 0; +2 : 0; +3 : 0; +4 : 0; +5 : 0; +6 : 0; +7 : 0; +8 : 0; +9 : 0; +10 : 0; +11 : 0; +12 : 0; +13 : 0; +14 : 0; +15 : 0; +16 : 7; +17 : 7; +18 : 7; +19 : 7; +20 : 7; +21 : 7; +22 : 7; +23 : 7; +24 : 7; +25 : 7; +26 : 7; +27 : 7; +28 : 7; +29 : 0; +30 : 0; +31 : 5; +32 : 5; +33 : 5; +34 : 5; +35 : 5; +36 : 5; +37 : 5; +38 : 5; +39 : 5; +40 : 5; +41 : 5; +42 : 5; +43 : 5; +44 : 0; +45 : 0; +46 : 2; +47 : 2; +48 : 2; +49 : 2; +50 : 2; +51 : 2; +52 : 2; +53 : 2; +54 : 2; +55 : 2; +56 : 2; +57 : 2; +58 : 2; +59 : 0; +60 : 0; +61 : 9; +62 : 9; +63 : 9; +64 : 9; +65 : 9; +66 : 9; +67 : 9; +68 : 9; +69 : 9; +70 : 9; +71 : 9; +72 : 9; +73 : 9; +74 : 0; +75 : 0; +76 : 1; +77 : 1; +78 : 1; +79 : 1; +80 : 1; +81 : 1; +82 : 1; +83 : 1; +84 : 1; +85 : 1; +86 : 1; +87 : 1; +88 : 1; +89 : 0; +90 : 0; +91 : 0; +92 : 0; +93 : 0; +94 : 0; +95 : 0; +96 : 0; +97 : 0; +98 : 0; +99 : 0; +100 : 0; +101 : 0; +102 : 0; +103 : 0; +104 : 0; +105 : 0; +106 : 0; +107 : 0; +108 : 0; +109 : 0; +110 : 0; +111 : 0; +112 : 0; +113 : 0; +114 : 0; +115 : 0; +116 : 0; +117 : 0; +118 : 0; +119 : 0; +120 : 0; +121 : 0; +122 : 0; +123 : 0; +124 : 0; +125 : 0; +126 : 0; +127 : 0; +128 : 0; +129 : 0; +130 : 0; +131 : 0; +132 : 0; +133 : 0; +134 : 0; +135 : 0; +136 : 0; +137 : 0; +138 : 0; +139 : 0; +140 : 0; +141 : 0; +142 : 0; +143 : 0; +144 : 0; +145 : 0; +146 : 0; +147 : 0; +148 : 0; +149 : 0; +150 : 0; +151 : 0; +152 : 0; +153 : 0; +154 : 0; +155 : 0; +156 : 0; +157 : 0; +158 : 0; +159 : 0; +160 : 0; +161 : 0; +162 : 0; +163 : 0; +164 : 0; +165 : 0; +166 : 0; +167 : 0; +168 : 0; +169 : 0; +170 : 0; +171 : 0; +172 : 0; +173 : 0; +174 : 0; +175 : 0; +176 : 0; +177 : 0; +178 : 0; +179 : 0; +180 : 0; +181 : 0; +182 : 0; +183 : 0; +184 : 0; +185 : 0; +186 : 0; +187 : 0; +188 : 11; +189 : 11; +190 : 11; +191 : 11; +192 : 11; +193 : 11; +194 : 11; +195 : 11; +196 : 11; +197 : 11; +198 : 11; +199 : 11; +200 : 11; +201 : 11; +202 : 11; +203 : 6; +204 : 6; +205 : 3; +206 : 3; +207 : 1; +208 : 1; +209 : 3; +210 : 6; +211 : 3; +212 : 1; +213 : 1; +214 : 3; +215 : 3; +216 : 6; +217 : 6; +218 : 6; +219 : 6; +220 : 3; +221 : 3; +222 : 1; +223 : 1; +224 : 3; +225 : 6; +226 : 3; +227 : 1; +228 : 1; +229 : 3; +230 : 3; +231 : 6; +232 : 6; +233 : 6; +234 : 6; +235 : 3; +236 : 3; +237 : 1; +238 : 1; +239 : 3; +240 : 0; +241 : 3; +242 : 1; +243 : 1; +244 : 3; +245 : 3; +246 : 6; +247 : 6; +248 : 6; +249 : 6; +250 : 3; +251 : 0; +252 : 0; +253 : 0; +254 : 0; +255 : 0; +256 : 0; +257 : 0; +258 : 0; +259 : 0; +260 : 3; +261 : 6; +262 : 6; +263 : 0; +264 : 0; +265 : 0; +266 : 0; +267 : 0; +268 : 0; +269 : 0; +270 : 0; +271 : 0; +272 : 0; +273 : 0; +274 : 0; +275 : 0; +276 : 0; +277 : 0; +278 : 0; +279 : 0; +280 : 0; +281 : 0; +282 : 0; +283 : 0; +284 : 0; +285 : 0; +286 : 0; +287 : 0; +288 : 0; +289 : 0; +290 : 0; +291 : 0; +292 : 0; +293 : 0; +294 : 0; +295 : 0; +296 : 0; +297 : 0; +298 : 0; +299 : 0; +300 : 0; +301 : 0; +302 : 0; +303 : 0; +304 : 0; +305 : 0; +306 : 0; +307 : 0; +308 : 0; +309 : 0; +310 : 0; +311 : 0; +312 : 0; +313 : 0; +314 : 0; +315 : 0; +316 : 0; +317 : 0; +318 : 0; +319 : 0; +320 : 0; +321 : 5; +322 : 5; +323 : 0; +324 : 6; +325 : 6; +326 : 0; +327 : 0; +328 : 0; +329 : 0; +330 : 0; +331 : 0; +332 : 0; +333 : 0; +334 : 0; +335 : 5; +336 : 5; +337 : 5; +338 : 5; +339 : 6; +340 : 6; +341 : 6; +342 : 0; +343 : 0; +344 : 0; +345 : 0; +346 : 0; +347 : 0; +348 : 0; +349 : 0; +350 : 5; +351 : 5; +352 : 5; +353 : 6; +354 : 6; +355 : 6; +356 : 6; +357 : 0; +358 : 0; +359 : 0; +360 : 0; +361 : 0; +362 : 0; +363 : 0; +364 : 0; +365 : 5; +366 : 5; +367 : 5; +368 : 5; +369 : 6; +370 : 6; +371 : 6; +372 : 0; +373 : 0; +374 : 0; +375 : 0; +376 : 0; +377 : 0; +378 : 0; +379 : 0; +380 : 5; +381 : 5; +382 : 5; +383 : 6; +384 : 6; +385 : 6; +386 : 6; +387 : 0; +388 : 0; +389 : 0; +390 : 0; +391 : 0; +392 : 0; +393 : 0; +394 : 0; +395 : 0; +396 : 5; +397 : 5; +398 : 5; +399 : 6; +400 : 6; +401 : 0; +402 : 0; +403 : 0; +404 : 0; +405 : 0; +406 : 0; +407 : 0; +408 : 0; +409 : 0; +410 : 0; +411 : 5; +412 : 5; +413 : 6; +414 : 6; +415 : 6; +416 : 0; +417 : 0; +418 : 0; +419 : 0; +420 : 0; +421 : 0; +422 : 0; +423 : 0; +424 : 0; +425 : 0; +426 : 0; +427 : 5; +428 : 5; +429 : 6; +430 : 0; +431 : 0; +432 : 0; +433 : 0; +434 : 0; +435 : 0; +436 : 0; +437 : 0; +438 : 0; +439 : 0; +440 : 0; +441 : 0; +442 : 0; +443 : 6; +444 : 0; +445 : 0; +446 : 0; +447 : 0; +448 : 0; +449 : 0; +450 : 0; +451 : 0; +452 : 0; +453 : 0; +454 : 0; +455 : 0; +456 : 0; +457 : 0; +458 : 0; +459 : 0; +460 : 0; +461 : 0; +462 : 0; +463 : 0; +464 : 0; +465 : 0; +466 : 0; +467 : 0; +468 : 0; +469 : 0; +470 : 0; +471 : 0; +472 : 0; +473 : 0; +474 : 0; +475 : 0; +476 : 0; +477 : 15; +478 : 0; +479 : 0; +480 : 2; +481 : 2; +482 : 2; +483 : 0; +484 : 0; +485 : 15; +486 : 0; +487 : 0; +488 : 0; +489 : 0; +490 : 0; +491 : 0; +492 : 0; +493 : 0; +494 : 2; +495 : 9; +496 : 9; +497 : 9; +498 : 2; +499 : 0; +500 : 0; +501 : 0; +502 : 0; +503 : 0; +504 : 0; +505 : 0; +506 : 0; +507 : 0; +508 : 2; +509 : 9; +510 : 5; +511 : 9; +512 : 5; +513 : 9; +514 : 2; +515 : 0; +516 : 0; +517 : 0; +518 : 0; +519 : 0; +520 : 15; +521 : 15; +522 : 0; +523 : 2; +524 : 9; +525 : 9; +526 : 9; +527 : 9; +528 : 9; +529 : 2; +530 : 0; +531 : 15; +532 : 15; +533 : 0; +534 : 0; +535 : 0; +536 : 0; +537 : 0; +538 : 2; +539 : 5; +540 : 9; +541 : 9; +542 : 9; +543 : 5; +544 : 2; +545 : 0; +546 : 0; +547 : 0; +548 : 0; +549 : 0; +550 : 0; +551 : 0; +552 : 0; +553 : 2; +554 : 9; +555 : 5; +556 : 5; +557 : 5; +558 : 9; +559 : 2; +560 : 0; +561 : 0; +562 : 0; +563 : 0; +564 : 0; +565 : 0; +566 : 0; +567 : 0; +568 : 0; +569 : 2; +570 : 9; +571 : 9; +572 : 9; +573 : 2; +574 : 0; +575 : 0; +576 : 0; +577 : 0; +578 : 0; +579 : 0; +580 : 0; +581 : 0; +582 : 15; +583 : 0; +584 : 0; +585 : 2; +586 : 2; +587 : 2; +588 : 0; +589 : 0; +590 : 15; +591 : 0; +592 : 0; +593 : 0; +594 : 0; +595 : 0; +596 : 15; +597 : 0; +598 : 0; +599 : 0; +600 : 0; +601 : 0; +602 : 0; +603 : 0; +604 : 0; +605 : 0; +606 : 15; +607 : 0; +608 : 0; +609 : 0; +610 : 0; +611 : 0; +612 : 0; +613 : 0; +614 : 0; +615 : 0; +616 : 0; +617 : 0; +618 : 0; +619 : 0; +620 : 0; +621 : 0; +622 : 0; +623 : 0; +624 : 0; +625 : 0; +626 : 0; +627 : 0; +628 : 0; +629 : 0; +630 : 0; +631 : 0; +632 : 0; +633 : 0; +634 : 0; +635 : 0; +636 : 0; +637 : 15; +638 : 0; +639 : 0; +640 : 0; +641 : 15; +642 : 0; +643 : 0; +644 : 0; +645 : 0; +646 : 0; +647 : 0; +648 : 0; +649 : 0; +650 : 0; +651 : 0; +652 : 0; +653 : 9; +654 : 0; +655 : 9; +656 : 0; +657 : 0; +658 : 0; +659 : 0; +660 : 0; +661 : 0; +662 : 0; +663 : 0; +664 : 0; +665 : 0; +666 : 0; +667 : 11; +668 : 10; +669 : 11; +670 : 10; +671 : 11; +672 : 0; +673 : 0; +674 : 0; +675 : 0; +676 : 0; +677 : 0; +678 : 0; +679 : 0; +680 : 0; +681 : 11; +682 : 10; +683 : 5; +684 : 10; +685 : 5; +686 : 10; +687 : 11; +688 : 0; +689 : 0; +690 : 0; +691 : 0; +692 : 0; +693 : 0; +694 : 0; +695 : 0; +696 : 10; +697 : 10; +698 : 10; +699 : 10; +700 : 10; +701 : 10; +702 : 10; +703 : 0; +704 : 0; +705 : 0; +706 : 0; +707 : 0; +708 : 0; +709 : 0; +710 : 11; +711 : 10; +712 : 10; +713 : 10; +714 : 10; +715 : 10; +716 : 10; +717 : 10; +718 : 11; +719 : 0; +720 : 0; +721 : 0; +722 : 0; +723 : 0; +724 : 0; +725 : 10; +726 : 0; +727 : 10; +728 : 10; +729 : 10; +730 : 10; +731 : 10; +732 : 0; +733 : 10; +734 : 0; +735 : 0; +736 : 0; +737 : 0; +738 : 0; +739 : 0; +740 : 11; +741 : 0; +742 : 10; +743 : 0; +744 : 0; +745 : 0; +746 : 10; +747 : 0; +748 : 11; +749 : 0; +750 : 0; +751 : 0; +752 : 0; +753 : 0; +754 : 0; +755 : 0; +756 : 0; +757 : 0; +758 : 11; +759 : 0; +760 : 11; +761 : 0; +762 : 0; +763 : 0; +764 : 0; +765 : 0; +766 : 0; +767 : 0; +768 : 0; +769 : 0; +770 : 0; +771 : 0; +772 : 0; +773 : 0; +774 : 0; +775 : 0; +776 : 0; +777 : 0; +778 : 0; +779 : 0; +780 : 0; +781 : 0; +782 : 0; +783 : 0; +784 : 0; +785 : 0; +786 : 0; +787 : 0; +788 : 0; +789 : 0; +790 : 0; +791 : 0; +792 : 0; +793 : 0; +794 : 0; +795 : 0; +796 : 0; +797 : 0; +798 : 0; +799 : 0; +800 : 0; +801 : 0; +802 : 0; +803 : 0; +804 : 0; +805 : 0; +806 : 4; +807 : 0; +808 : 1; +809 : 0; +810 : 3; +811 : 0; +812 : 9; +813 : 0; +814 : 6; +815 : 0; +816 : 2; +817 : 0; +818 : 5; +819 : 0; +820 : 0; +821 : 4; +822 : 0; +823 : 1; +824 : 0; +825 : 3; +826 : 0; +827 : 9; +828 : 0; +829 : 6; +830 : 0; +831 : 2; +832 : 0; +833 : 5; +834 : 0; +835 : 0; +836 : 4; +837 : 0; +838 : 1; +839 : 0; +840 : 3; +841 : 0; +842 : 9; +843 : 0; +844 : 6; +845 : 0; +846 : 2; +847 : 0; +848 : 5; +849 : 0; +850 : 0; +851 : 4; +852 : 0; +853 : 1; +854 : 0; +855 : 3; +856 : 0; +857 : 9; +858 : 0; +859 : 6; +860 : 0; +861 : 2; +862 : 0; +863 : 5; +864 : 0; +865 : 0; +866 : 4; +867 : 0; +868 : 1; +869 : 0; +870 : 3; +871 : 0; +872 : 9; +873 : 0; +874 : 6; +875 : 0; +876 : 2; +877 : 0; +878 : 5; +879 : 0; +880 : 0; +881 : 4; +882 : 0; +883 : 1; +884 : 0; +885 : 3; +886 : 0; +887 : 9; +888 : 0; +889 : 6; +890 : 0; +891 : 2; +892 : 0; +893 : 5; +894 : 0; +895 : 0; +896 : 4; +897 : 0; +898 : 1; +899 : 0; +900 : 3; +901 : 0; +902 : 9; +903 : 0; +904 : 6; +905 : 0; +906 : 2; +907 : 0; +908 : 5; +909 : 0; +910 : 0; +911 : 15; +912 : 0; +913 : 15; +914 : 0; +915 : 15; +916 : 0; +917 : 15; +918 : 0; +919 : 15; +920 : 0; +921 : 15; +922 : 0; +923 : 15; +924 : 0; +925 : 0; +926 : 0; +927 : 0; +928 : 0; +929 : 0; +930 : 0; +931 : 0; +932 : 0; +933 : 0; +934 : 0; +935 : 0; +936 : 0; +937 : 0; +938 : 0; +939 : 0; +940 : 0; +941 : 0; +942 : 0; +943 : 0; +944 : 0; +945 : 0; +946 : 0; +947 : 0; +948 : 5; +949 : 5; +950 : 5; +951 : 0; +952 : 0; +953 : 0; +954 : 0; +955 : 6; +956 : 0; +957 : 0; +958 : 0; +959 : 0; +960 : 5; +961 : 5; +962 : 5; +963 : 5; +964 : 5; +965 : 0; +966 : 0; +967 : 0; +968 : 0; +969 : 6; +970 : 6; +971 : 6; +972 : 0; +973 : 0; +974 : 0; +975 : 0; +976 : 5; +977 : 5; +978 : 5; +979 : 0; +980 : 0; +981 : 0; +982 : 0; +983 : 6; +984 : 6; +985 : 3; +986 : 6; +987 : 6; +988 : 0; +989 : 0; +990 : 0; +991 : 0; +992 : 5; +993 : 0; +994 : 0; +995 : 0; +996 : 0; +997 : 6; +998 : 6; +999 : 3; +1000 : 3; +1001 : 3; +1002 : 6; +1003 : 6; +1004 : 0; +1005 : 0; +1006 : 0; +1007 : 0; +1008 : 0; +1009 : 0; +1010 : 0; +1011 : 0; +1012 : 6; +1013 : 6; +1014 : 3; +1015 : 3; +1016 : 3; +1017 : 6; +1018 : 6; +1019 : 0; +1020 : 0; +1021 : 0; +1022 : 0; +1023 : 5; +1024 : 0; +1025 : 0; +1026 : 0; +1027 : 0; +1028 : 6; +1029 : 6; +1030 : 3; +1031 : 6; +1032 : 6; +1033 : 0; +1034 : 0; +1035 : 0; +1036 : 0; +1037 : 5; +1038 : 5; +1039 : 5; +1040 : 0; +1041 : 0; +1042 : 0; +1043 : 0; +1044 : 6; +1045 : 6; +1046 : 6; +1047 : 0; +1048 : 0; +1049 : 0; +1050 : 0; +1051 : 5; +1052 : 5; +1053 : 5; +1054 : 5; +1055 : 5; +1056 : 0; +1057 : 0; +1058 : 0; +1059 : 0; +1060 : 6; +1061 : 0; +1062 : 0; +1063 : 0; +1064 : 0; +1065 : 5; +1066 : 5; +1067 : 5; +1068 : 0; +1069 : 0; +1070 : 0; +1071 : 0; +1072 : 0; +1073 : 0; +1074 : 0; +1075 : 0; +1076 : 0; +1077 : 0; +1078 : 0; +1079 : 0; +1080 : 0; +1081 : 0; +1082 : 0; +1083 : 0; +1084 : 0; +1085 : 0; +1086 : 0; +1087 : 0; +1088 : 0; +1089 : 0; +1090 : 0; +1091 : 0; +1092 : 0; +1093 : 0; +1094 : 0; +1095 : 0; +1096 : 0; +1097 : 0; +1098 : 0; +1099 : 0; +1100 : 0; +1101 : 0; +1102 : 0; +1103 : 0; +1104 : 0; +1105 : 0; +1106 : 0; +1107 : 0; +1108 : 0; +1109 : 0; +1110 : 0; +1111 : 0; +1112 : 0; +1113 : 8; +1114 : 0; +1115 : 0; +1116 : 0; +1117 : 0; +1118 : 0; +1119 : 0; +1120 : 0; +1121 : 0; +1122 : 0; +1123 : 0; +1124 : 4; +1125 : 4; +1126 : 0; +1127 : 8; +1128 : 8; +1129 : 8; +1130 : 0; +1131 : 5; +1132 : 5; +1133 : 0; +1134 : 0; +1135 : 0; +1136 : 0; +1137 : 0; +1138 : 4; +1139 : 4; +1140 : 0; +1141 : 0; +1142 : 0; +1143 : 0; +1144 : 0; +1145 : 0; +1146 : 0; +1147 : 5; +1148 : 5; +1149 : 0; +1150 : 0; +1151 : 0; +1152 : 0; +1153 : 0; +1154 : 0; +1155 : 0; +1156 : 0; +1157 : 0; +1158 : 0; +1159 : 0; +1160 : 0; +1161 : 0; +1162 : 0; +1163 : 0; +1164 : 0; +1165 : 0; +1166 : 0; +1167 : 0; +1168 : 6; +1169 : 0; +1170 : 0; +1171 : 0; +1172 : 0; +1173 : 15; +1174 : 0; +1175 : 0; +1176 : 0; +1177 : 0; +1178 : 2; +1179 : 0; +1180 : 0; +1181 : 0; +1182 : 0; +1183 : 6; +1184 : 6; +1185 : 6; +1186 : 0; +1187 : 0; +1188 : 15; +1189 : 0; +1190 : 0; +1191 : 2; +1192 : 2; +1193 : 2; +1194 : 0; +1195 : 0; +1196 : 0; +1197 : 0; +1198 : 0; +1199 : 0; +1200 : 0; +1201 : 0; +1202 : 0; +1203 : 0; +1204 : 0; +1205 : 0; +1206 : 0; +1207 : 0; +1208 : 0; +1209 : 0; +1210 : 0; +1211 : 0; +1212 : 0; +1213 : 0; +1214 : 0; +1215 : 0; +1216 : 0; +1217 : 0; +1218 : 0; +1219 : 0; +1220 : 0; +1221 : 0; +1222 : 0; +1223 : 0; +1224 : 0; +1225 : 0; +1226 : 0; +1227 : 0; +1228 : 0; +1229 : 0; +1230 : 0; +1231 : 3; +1232 : 3; +1233 : 3; +1234 : 3; +1235 : 3; +1236 : 0; +1237 : 0; +1238 : 0; +1239 : 0; +1240 : 0; +1241 : 0; +1242 : 0; +1243 : 0; +1244 : 0; +1245 : 0; +1246 : 0; +1247 : 0; +1248 : 0; +1249 : 0; +1250 : 0; +1251 : 0; +1252 : 0; +1253 : 0; +1254 : 0; +1255 : 0; +1256 : 0; +1257 : 0; +1258 : 0; +1259 : 0; +1260 : 0; +1261 : 0; +1262 : 0; +1263 : 0; +1264 : 4; +1265 : 4; +1266 : 4; +1267 : 4; +1268 : 4; +1269 : 4; +1270 : 4; +1271 : 4; +1272 : 4; +1273 : 4; +1274 : 4; +1275 : 4; +1276 : 4; +1277 : 0; +1278 : 4; +1279 : 4; +1280 : 4; +1281 : 4; +1282 : 4; +1283 : 4; +1284 : 4; +1285 : 4; +1286 : 4; +1287 : 4; +1288 : 4; +1289 : 4; +1290 : 4; +1291 : 4; +1292 : 0; +1293 : 4; +1294 : 4; +1295 : 5; +1296 : 4; +1297 : 0; +1298 : 4; +1299 : 0; +1300 : 0; +1301 : 0; +1302 : 0; +1303 : 0; +1304 : 0; +1305 : 0; +1306 : 4; +1307 : 0; +1308 : 4; +1309 : 4; +1310 : 5; +1311 : 4; +1312 : 0; +1313 : 4; +1314 : 0; +1315 : 0; +1316 : 0; +1317 : 0; +1318 : 0; +1319 : 0; +1320 : 0; +1321 : 4; +1322 : 0; +1323 : 4; +1324 : 4; +1325 : 0; +1326 : 4; +1327 : 0; +1328 : 0; +1329 : 0; +1330 : 4; +1331 : 4; +1332 : 4; +1333 : 0; +1334 : 4; +1335 : 4; +1336 : 4; +1337 : 0; +1338 : 4; +1339 : 4; +1340 : 0; +1341 : 4; +1342 : 0; +1343 : 0; +1344 : 0; +1345 : 4; +1346 : 4; +1347 : 4; +1348 : 0; +1349 : 4; +1350 : 4; +1351 : 4; +1352 : 0; +1353 : 4; +1354 : 4; +1355 : 0; +1356 : 0; +1357 : 0; +1358 : 4; +1359 : 0; +1360 : 4; +1361 : 0; +1362 : 0; +1363 : 0; +1364 : 0; +1365 : 0; +1366 : 0; +1367 : 0; +1368 : 4; +1369 : 4; +1370 : 0; +1371 : 0; +1372 : 0; +1373 : 4; +1374 : 0; +1375 : 4; +1376 : 0; +1377 : 0; +1378 : 0; +1379 : 0; +1380 : 0; +1381 : 0; +1382 : 0; +1383 : 4; +1384 : 4; +1385 : 4; +1386 : 4; +1387 : 4; +1388 : 4; +1389 : 4; +1390 : 4; +1391 : 4; +1392 : 4; +1393 : 4; +1394 : 4; +1395 : 4; +1396 : 4; +1397 : 4; +1398 : 4; +1399 : 4; +1400 : 4; +1401 : 4; +1402 : 4; +1403 : 4; +1404 : 4; +1405 : 4; +1406 : 4; +1407 : 4; +1408 : 4; +1409 : 4; +1410 : 4; +1411 : 4; +1412 : 4; +1413 : 4; +1414 : 0; +1415 : 0; +1416 : 0; +1417 : 0; +1418 : 0; +1419 : 0; +1420 : 0; +1421 : 0; +1422 : 0; +1423 : 0; +1424 : 0; +1425 : 0; +1426 : 0; +1427 : 0; +1428 : 0; +1429 : 9; +1430 : 0; +1431 : 0; +1432 : 0; +1433 : 0; +1434 : 0; +1435 : 0; +1436 : 0; +1437 : 0; +1438 : 0; +1439 : 0; +1440 : 0; +1441 : 0; +1442 : 0; +1443 : 9; +1444 : 2; +1445 : 9; +1446 : 0; +1447 : 0; +1448 : 0; +1449 : 0; +1450 : 0; +1451 : 0; +1452 : 0; +1453 : 0; +1454 : 0; +1455 : 0; +1456 : 0; +1457 : 9; +1458 : 2; +1459 : 2; +1460 : 2; +1461 : 9; +1462 : 0; +1463 : 0; +1464 : 0; +1465 : 0; +1466 : 0; +1467 : 0; +1468 : 0; +1469 : 0; +1470 : 0; +1471 : 9; +1472 : 2; +1473 : 2; +1474 : 2; +1475 : 2; +1476 : 2; +1477 : 9; +1478 : 0; +1479 : 0; +1480 : 0; +1481 : 0; +1482 : 0; +1483 : 0; +1484 : 0; +1485 : 0; +1486 : 9; +1487 : 9; +1488 : 9; +1489 : 9; +1490 : 9; +1491 : 9; +1492 : 9; +1493 : 0; +1494 : 0; +1495 : 0; +1496 : 0; +1497 : 0; +1498 : 0; +1499 : 0; +1500 : 0; +1501 : 9; +1502 : 2; +1503 : 2; +1504 : 2; +1505 : 2; +1506 : 2; +1507 : 9; +1508 : 0; +1509 : 0; +1510 : 0; +1511 : 0; +1512 : 0; +1513 : 0; +1514 : 0; +1515 : 9; +1516 : 2; +1517 : 9; +1518 : 2; +1519 : 2; +1520 : 2; +1521 : 9; +1522 : 2; +1523 : 9; +1524 : 0; +1525 : 0; +1526 : 0; +1527 : 0; +1528 : 0; +1529 : 9; +1530 : 2; +1531 : 2; +1532 : 2; +1533 : 9; +1534 : 2; +1535 : 9; +1536 : 2; +1537 : 2; +1538 : 2; +1539 : 9; +1540 : 0; +1541 : 0; +1542 : 0; +1543 : 9; +1544 : 2; +1545 : 2; +1546 : 2; +1547 : 2; +1548 : 2; +1549 : 9; +1550 : 2; +1551 : 2; +1552 : 2; +1553 : 2; +1554 : 2; +1555 : 9; +1556 : 0; +1557 : 0; +1558 : 9; +1559 : 9; +1560 : 9; +1561 : 9; +1562 : 9; +1563 : 9; +1564 : 9; +1565 : 9; +1566 : 9; +1567 : 9; +1568 : 9; +1569 : 9; +1570 : 9; +1571 : 0; +1572 : 0; +1573 : 0; +1574 : 0; +1575 : 0; +1576 : 0; +1577 : 0; +1578 : 0; +1579 : 0; +1580 : 0; +1581 : 0; +1582 : 0; +1583 : 0; +1584 : 0; +1585 : 0; +1586 : 0; +1587 : 0; +1588 : 0; +1589 : 0; +1590 : 0; +1591 : 0; +1592 : 0; +1593 : 0; +1594 : 0; +1595 : 0; +1596 : 2; +1597 : 0; +1598 : 2; +1599 : 0; +1600 : 2; +1601 : 0; +1602 : 2; +1603 : 0; +1604 : 2; +1605 : 0; +1606 : 2; +1607 : 0; +1608 : 2; +1609 : 0; +1610 : 0; +1611 : 0; +1612 : 1; +1613 : 0; +1614 : 1; +1615 : 0; +1616 : 1; +1617 : 0; +1618 : 1; +1619 : 0; +1620 : 1; +1621 : 0; +1622 : 1; +1623 : 0; +1624 : 0; +1625 : 0; +1626 : 7; +1627 : 0; +1628 : 7; +1629 : 0; +1630 : 7; +1631 : 0; +1632 : 7; +1633 : 0; +1634 : 7; +1635 : 0; +1636 : 7; +1637 : 0; +1638 : 7; +1639 : 0; +1640 : 0; +1641 : 0; +1642 : 1; +1643 : 0; +1644 : 1; +1645 : 0; +1646 : 1; +1647 : 0; +1648 : 1; +1649 : 0; +1650 : 1; +1651 : 0; +1652 : 1; +1653 : 0; +1654 : 0; +1655 : 0; +1656 : 8; +1657 : 0; +1658 : 8; +1659 : 0; +1660 : 8; +1661 : 0; +1662 : 8; +1663 : 0; +1664 : 8; +1665 : 0; +1666 : 8; +1667 : 0; +1668 : 8; +1669 : 0; +1670 : 0; +1671 : 0; +1672 : 1; +1673 : 0; +1674 : 1; +1675 : 0; +1676 : 1; +1677 : 0; +1678 : 1; +1679 : 0; +1680 : 1; +1681 : 0; +1682 : 1; +1683 : 0; +1684 : 0; +1685 : 0; +1686 : 5; +1687 : 0; +1688 : 5; +1689 : 0; +1690 : 5; +1691 : 0; +1692 : 5; +1693 : 0; +1694 : 5; +1695 : 0; +1696 : 5; +1697 : 0; +1698 : 5; +1699 : 0; +1700 : 0; +1701 : 0; +1702 : 0; +1703 : 0; +1704 : 0; +1705 : 0; +1706 : 0; +1707 : 0; +1708 : 0; +1709 : 0; +1710 : 0; +1711 : 0; +1712 : 0; +1713 : 0; +1714 : 0; +1715 : 0; +1716 : 0; +1717 : 0; +1718 : 0; +1719 : 0; +1720 : 0; +1721 : 0; +1722 : 0; +1723 : 0; +1724 : 0; +1725 : 0; +1726 : 0; +1727 : 0; +1728 : 0; +1729 : 0; +1730 : 0; +1731 : 0; +1732 : 0; +1733 : 0; +1734 : 0; +1735 : 0; +1736 : 0; +1737 : 0; +1738 : 15; +1739 : 0; +1740 : 15; +1741 : 0; +1742 : 15; +1743 : 0; +1744 : 15; +1745 : 0; +1746 : 15; +1747 : 0; +1748 : 15; +1749 : 0; +1750 : 15; +1751 : 0; +1752 : 15; +1753 : 14; +1754 : 15; +1755 : 14; +1756 : 15; +1757 : 14; +1758 : 15; +1759 : 14; +1760 : 15; +1761 : 14; +1762 : 15; +1763 : 14; +1764 : 15; +1765 : 14; +1766 : 15; +1767 : 14; +1768 : 13; +1769 : 14; +1770 : 13; +1771 : 14; +1772 : 13; +1773 : 14; +1774 : 13; +1775 : 14; +1776 : 13; +1777 : 14; +1778 : 13; +1779 : 14; +1780 : 13; +1781 : 14; +1782 : 13; +1783 : 12; +1784 : 13; +1785 : 12; +1786 : 13; +1787 : 12; +1788 : 13; +1789 : 12; +1790 : 13; +1791 : 12; +1792 : 13; +1793 : 12; +1794 : 13; +1795 : 12; +1796 : 13; +1797 : 12; +1798 : 11; +1799 : 12; +1800 : 11; +1801 : 12; +1802 : 11; +1803 : 12; +1804 : 11; +1805 : 12; +1806 : 11; +1807 : 12; +1808 : 11; +1809 : 12; +1810 : 11; +1811 : 12; +1812 : 11; +1813 : 10; +1814 : 11; +1815 : 10; +1816 : 11; +1817 : 10; +1818 : 11; +1819 : 10; +1820 : 11; +1821 : 10; +1822 : 11; +1823 : 10; +1824 : 11; +1825 : 10; +1826 : 11; +1827 : 10; +1828 : 1; +1829 : 10; +1830 : 1; +1831 : 10; +1832 : 1; +1833 : 10; +1834 : 1; +1835 : 10; +1836 : 1; +1837 : 10; +1838 : 1; +1839 : 10; +1840 : 1; +1841 : 10; +1842 : 1; +1843 : 0; +1844 : 1; +1845 : 0; +1846 : 1; +1847 : 0; +1848 : 1; +1849 : 0; +1850 : 1; +1851 : 0; +1852 : 1; +1853 : 0; +1854 : 1; +1855 : 0; +1856 : 1; +1857 : 0; +1858 : 0; +1859 : 0; +1860 : 0; +1861 : 0; +1862 : 0; +1863 : 0; +1864 : 0; +1865 : 0; +1866 : 0; +1867 : 0; +1868 : 0; +1869 : 0; +1870 : 0; +1871 : 0; +1872 : 0; +1873 : 0; +1874 : 0; +1875 : 0; +1876 : 0; +1877 : 0; +1878 : 0; +1879 : 0; +1880 : 0; +1881 : 0; +1882 : 0; +1883 : 0; +1884 : 0; +1885 : 0; +1886 : 0; +1887 : 0; +1888 : 0; +1889 : 0; +1890 : 0; +1891 : 0; +1892 : 0; +1893 : 0; +1894 : 0; +1895 : 0; +1896 : 0; +1897 : 0; +1898 : 0; +1899 : 0; +1900 : 0; +1901 : 0; +1902 : 0; +1903 : 0; +1904 : 0; +1905 : 0; +1906 : 0; +1907 : 0; +1908 : 0; +1909 : 0; +1910 : 0; +1911 : 0; +1912 : 0; +1913 : 15; +1914 : 15; +1915 : 0; +1916 : 0; +1917 : 0; +1918 : 0; +1919 : 0; +1920 : 0; +1921 : 15; +1922 : 15; +1923 : 15; +1924 : 0; +1925 : 0; +1926 : 0; +1927 : 0; +1928 : 15; +1929 : 0; +1930 : 15; +1931 : 0; +1932 : 0; +1933 : 9; +1934 : 0; +1935 : 0; +1936 : 15; +1937 : 15; +1938 : 15; +1939 : 0; +1940 : 0; +1941 : 0; +1942 : 0; +1943 : 15; +1944 : 0; +1945 : 15; +1946 : 0; +1947 : 9; +1948 : 0; +1949 : 9; +1950 : 0; +1951 : 0; +1952 : 15; +1953 : 0; +1954 : 0; +1955 : 0; +1956 : 0; +1957 : 0; +1958 : 15; +1959 : 15; +1960 : 0; +1961 : 0; +1962 : 9; +1963 : 0; +1964 : 0; +1965 : 0; +1966 : 0; +1967 : 15; +1968 : 0; +1969 : 0; +1970 : 0; +1971 : 0; +1972 : 0; +1973 : 15; +1974 : 0; +1975 : 15; +1976 : 0; +1977 : 0; +1978 : 9; +1979 : 0; +1980 : 0; +1981 : 0; +1982 : 15; +1983 : 0; +1984 : 0; +1985 : 0; +1986 : 0; +1987 : 0; +1988 : 15; +1989 : 0; +1990 : 15; +1991 : 0; +1992 : 9; +1993 : 0; +1994 : 0; +1995 : 0; +1996 : 0; +1997 : 15; +1998 : 0; +1999 : 0; +2000 : 0; +2001 : 0; +2002 : 0; +2003 : 15; +2004 : 15; +2005 : 0; +2006 : 0; +2007 : 9; +2008 : 0; +2009 : 9; +2010 : 0; +2011 : 0; +2012 : 15; +2013 : 0; +2014 : 0; +2015 : 0; +2016 : 0; +2017 : 0; +2018 : 0; +2019 : 0; +2020 : 0; +2021 : 0; +2022 : 0; +2023 : 9; +2024 : 0; +2025 : 0; +2026 : 0; +2027 : 0; +2028 : 0; +2029 : 0; +2030 : 0; +2031 : 0; +2032 : 0; +2033 : 0; +2034 : 0; +2035 : 0; +2036 : 0; +2037 : 0; +2038 : 0; +2039 : 0; +2040 : 0; +2041 : 0; +2042 : 0; +2043 : 0; +2044 : 0; +2045 : 0; +2046 : 0; +2047 : 0; +END; \ No newline at end of file diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/scandoubler.v b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/scandoubler.v new file mode 100644 index 00000000..36e71ed2 --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/scandoubler.v @@ -0,0 +1,194 @@ +// +// scandoubler.v +// +// Copyright (c) 2015 Till Harbaum +// Copyright (c) 2017 Sorgelig +// +// 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 . + +// TODO: Delay vsync one line + +module scandoubler #(parameter LENGTH, parameter HALF_DEPTH) +( + // system interface + input clk_sys, + input ce_pix, + input ce_pix_actual, + + input hq2x, + + // shifter video interface + input hs_in, + input vs_in, + input line_start, + + input [DWIDTH:0] r_in, + input [DWIDTH:0] g_in, + input [DWIDTH:0] b_in, + input mono, + + // output interface + output reg hs_out, + output vs_out, + output [DWIDTH:0] r_out, + output [DWIDTH:0] g_out, + output [DWIDTH:0] b_out +); + +`define BITS_TO_FIT(N) ( \ + N <= 2 ? 0 : \ + N <= 4 ? 1 : \ + N <= 8 ? 2 : \ + N <= 16 ? 3 : \ + N <= 32 ? 4 : \ + N <= 64 ? 5 : \ + N <= 128 ? 6 : \ + N <= 256 ? 7 : \ + N <= 512 ? 8 : \ + N <=1024 ? 9 : 10 ) + +localparam DWIDTH = HALF_DEPTH ? 2 : 5; + +assign vs_out = vs_in; + +reg [2:0] phase; +reg [2:0] ce_div; +reg [7:0] pix_len = 0; +wire [7:0] pl = pix_len + 1'b1; + +reg ce_x1, ce_x4; +reg req_line_reset; +wire ls_in = hs_in | line_start; +always @(negedge clk_sys) begin + reg old_ce; + reg [2:0] ce_cnt; + + reg [7:0] pixsz2, pixsz4 = 0; + + old_ce <= ce_pix; + if(~&pix_len) pix_len <= pix_len + 1'd1; + + ce_x4 <= 0; + ce_x1 <= 0; + + // use such odd comparison to place c_x4 evenly if master clock isn't multiple 4. + if((pl == pixsz4) || (pl == pixsz2) || (pl == (pixsz2+pixsz4))) begin + phase <= phase + 1'd1; + ce_x4 <= 1; + end + + if(~old_ce & ce_pix) begin + pixsz2 <= {1'b0, pl[7:1]}; + pixsz4 <= {2'b00, pl[7:2]}; + ce_x1 <= 1; + ce_x4 <= 1; + pix_len <= 0; + phase <= phase + 1'd1; + + ce_cnt <= ce_cnt + 1'd1; + if(ce_pix_actual) begin + phase <= 0; + ce_div <= ce_cnt + 1'd1; + ce_cnt <= 0; + req_line_reset <= 0; + end + + if(ls_in) req_line_reset <= 1; + end +end + +reg ce_sd; +always @(*) begin + case(ce_div) + 2: ce_sd = !phase[0]; + 4: ce_sd = !phase[1:0]; + default: ce_sd <= 1; + endcase +end + +localparam AWIDTH = `BITS_TO_FIT(LENGTH); +Hq2x #(.LENGTH(LENGTH), .HALF_DEPTH(HALF_DEPTH)) Hq2x +( + .clk(clk_sys), + .ce_x4(ce_x4 & ce_sd), + .inputpixel({b_in,g_in,r_in}), + .mono(mono), + .disable_hq2x(~hq2x), + .reset_frame(vs_in), + .reset_line(req_line_reset), + .read_y(sd_line), + .read_x(sd_h_actual), + .outpixel({b_out,g_out,r_out}) +); + +reg [10:0] sd_h_actual; +always @(*) begin + case(ce_div) + 2: sd_h_actual = sd_h[10:1]; + 4: sd_h_actual = sd_h[10:2]; + default: sd_h_actual = sd_h; + endcase +end + +reg [10:0] sd_h; +reg [1:0] sd_line; +always @(posedge clk_sys) begin + + reg [11:0] hs_max,hs_rise,hs_ls; + reg [10:0] hcnt; + reg [11:0] sd_hcnt; + + reg hs, hs2, vs, ls; + + if(ce_x1) begin + hs <= hs_in; + ls <= ls_in; + + if(ls && !ls_in) hs_ls <= {hcnt,1'b1}; + + // falling edge of hsync indicates start of line + if(hs && !hs_in) begin + hs_max <= {hcnt,1'b1}; + hcnt <= 0; + if(ls && !ls_in) hs_ls <= {10'd0,1'b1}; + end else begin + hcnt <= hcnt + 1'd1; + end + + // save position of rising edge + if(!hs && hs_in) hs_rise <= {hcnt,1'b1}; + + vs <= vs_in; + if(vs && ~vs_in) sd_line <= 0; + end + + if(ce_x4) begin + hs2 <= hs_in; + + // output counter synchronous to input and at twice the rate + sd_hcnt <= sd_hcnt + 1'd1; + sd_h <= sd_h + 1'd1; + if(hs2 && !hs_in) sd_hcnt <= hs_max; + if(sd_hcnt == hs_max) sd_hcnt <= 0; + + // replicate horizontal sync at twice the speed + if(sd_hcnt == hs_max) hs_out <= 0; + if(sd_hcnt == hs_rise) hs_out <= 1; + + if(sd_hcnt == hs_ls) sd_h <= 0; + if(sd_hcnt == hs_ls) sd_line <= sd_line + 1'd1; + end +end + +endmodule diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/sqrt.vhd b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/sqrt.vhd new file mode 100644 index 00000000..0209f0fa --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/sqrt.vhd @@ -0,0 +1,56 @@ +--Authors: Pietro Bassi, Marco Torsello + +library ieee; +use ieee.numeric_std.all; +use ieee.std_logic_1164.all; +use IEEE.STD_LOGIC_unsigned.ALL; + +entity sqrt is +port + ( + CLOCK : in std_logic; + CLEAR : in std_logic; + DATA_IN : in std_logic_vector (15 downto 0); + DATA_OUT : out std_logic_vector (7 downto 0) + ); +end entity; + +architecture RTL of sqrt is + signal partDone : std_logic := '0'; + signal partCount : integer := 7; + signal result : std_logic_vector(9 downto 0) := "0000000000"; + signal partialQ : std_logic_vector(11 downto 0) := "000000000000"; + +begin + partDone_1: process(CLOCK,CLEAR,DATA_IN,partDone) + begin + if(rising_edge(CLOCK) and CLEAR='0')then + --square root abacus algorithm (C. Woo) + if(partDone='0')then + if(partCount>=0)then + partialQ(1 downto 0) <= DATA_IN((partCount*2)+ 1 downto partCount*2); + partDone <= '1'; + else + DATA_OUT <= result(7 downto 0); + end if; + partCount <= partCount - 1; + elsif(partDone='1')then + if((result(7 downto 0) & "01") <= partialQ)then + result <= result(8 downto 0) & '1'; + partialQ(9 downto 2) <= partialQ(7 downto 0) - (result(1 downto 0)&"01"); + else + result <= result(8 downto 0) & '0'; + partialQ(9 downto 2) <= partialQ(7 downto 0); + end if; + partDone <= '0'; + end if; + end if; + + if(rising_edge(CLOCK) and CLEAR='1')then + partCount <= 7; + partDone <= '0'; + result <= "0000000000"; + partialQ <= "000000000000"; + end if; +end process; +end architecture; diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/vga_package.vhd b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/vga_package.vhd new file mode 100644 index 00000000..69570f5a --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/vga_package.vhd @@ -0,0 +1,105 @@ +--Authors: Pietro Bassi, Marco Torsello + +library ieee; +use ieee.numeric_std.all; +use ieee.std_logic_1164.all; +use work.arkanoid_package.all; + +package vga_package is + + --types definition + subtype powerup_color_type is std_logic_vector(0 to 23); + subtype color_type is std_logic_vector(0 to 11); + + --CONSTANTS + --screen + constant VISIBLE_WIDTH : natural := 640; + constant VISIBLE_HEIGHT : natural := 480; + + --vertical sync + constant VERTICAL_FRONT_PORCH : natural := 10; + constant VERTICAL_SYNC_PULSE : natural := 2; + constant VERTICAL_BACK_PORCH : natural := 33; + + --horizontal sync + constant HORIZONTAL_FRONT_PORCH : natural := 16; + constant HORIZONTAL_SYNC_PULSE : natural := 96; + constant HORIZONTAL_BACK_PORCH : natural := 48; + + --VGA screen + constant TOTAL_H: integer := VERTICAL_FRONT_PORCH + VERTICAL_SYNC_PULSE +VERTICAL_BACK_PORCH + VISIBLE_HEIGHT; --525 + constant TOTAL_W: integer := HORIZONTAL_FRONT_PORCH + HORIZONTAL_SYNC_PULSE +HORIZONTAL_BACK_PORCH + VISIBLE_WIDTH; --800 + constant WINDOW_HORIZONTAL_START: integer := HORIZONTAL_FRONT_PORCH + HORIZONTAL_SYNC_PULSE; --112 + constant WINDOW_HORIZONTAL_END: integer := HORIZONTAL_FRONT_PORCH + HORIZONTAL_SYNC_PULSE + VISIBLE_WIDTH; --752 + constant WINDOW_VERTICAL_START: integer := VERTICAL_FRONT_PORCH + VERTICAL_SYNC_PULSE; --12 + constant WINDOW_VERTICAL_END: integer := VERTICAL_FRONT_PORCH + VERTICAL_SYNC_PULSE + VISIBLE_HEIGHT;--492 + + --colors + constant COLOR_BKGBLUE : color_type := X"003"; + constant COLOR_BKGDARKBLUE : color_type := X"002"; + constant COLOR_BKGRED : color_type := X"500"; + constant COLOR_BKGDARKRED : color_type := X"400"; + constant COLOR_BKGGREEN : color_type := X"050"; + constant COLOR_BKGDARKGREEN : color_type := X"040"; + constant COLOR_BALLFILL : color_type := X"EEE"; + constant COLOR_BALLBORDER : color_type := X"111"; + + constant COLOR_LIGHTDARKER : color_type := X"02A"; + constant COLOR_LIGHTDARK : color_type := X"06D"; + constant COLOR_LIGHTLIGHT : color_type := X"3CE"; + + constant COLOR_HEARTDARK : color_type := X"C10"; + constant COLOR_HEARTLIGHT : color_type := X"E10"; + + --other constants + constant ANIMATION_RATE : integer := 10000000; + constant BKG_RECT_WIDTH : positive := 20; + constant BKG_RECT_HEIGHT : positive := 20; + constant LIVES_X : natural := BOUND_LAT_THICKNESS/UNIT; + constant LIVES_Y : natural := 20; + + --FUNCTIONS + function get_brick_color ( brick : brick_type ) return color_type; + function get_powerup_color ( powerup : powerup_type ) return powerup_color_type; + +end package; + +package body vga_package is + + function get_brick_color ( brick : brick_type ) return color_type is + begin + case brick is + when B_EMPTY => return X"000"; + when B_WHITE => return X"FFF"; + when B_ORANGE => return X"FA0"; + when B_CYAN => return X"0FF"; + when B_GREEN => return X"0F0"; + when B_RED => return X"F00"; + when B_BLUE => return X"00F"; + when B_PINK => return X"F9F"; + when B_PURPLE => return X"D0D"; + when B_YELLOW => return X"FF0"; + when B_GREY1 => return X"DDD"; + when B_GREY2 => return X"BBB"; + when B_GREY3 => return X"999"; + when B_GREY4 => return X"777"; + when B_GREY5 => return X"555"; + when B_GOLD => return X"CC0"; + end case; + end get_brick_color; + + function get_powerup_color ( powerup : powerup_type ) return powerup_color_type is + begin + case powerup is + when P_SLOW => return X"0F00D0"; + when P_FAST => return X"F00D00"; + when P_LIFE => return X"00F00D"; + when P_ENLARGE => return X"FF0DD0"; + when P_DEATH => return X"555333"; + when P_NULL => return X"000000"; + end case; + end get_powerup_color; + +end vga_package; + + diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/video_mixer.sv b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/video_mixer.sv new file mode 100644 index 00000000..7b2b9717 --- /dev/null +++ b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/video_mixer.sv @@ -0,0 +1,246 @@ +// +// +// Copyright (c) 2017 Sorgelig +// +// This program is GPL Licensed. See COPYING for the full license. +// +// +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +`timescale 1ns / 1ps + +// +// LINE_LENGTH: Length of display line in pixels +// Usually it's length from HSync to HSync. +// May be less if line_start is used. +// +// HALF_DEPTH: If =1 then color dept is 3 bits per component +// For half depth 6 bits monochrome is available with +// mono signal enabled and color = {G, R} + +module video_mixer +#( + parameter LINE_LENGTH = 768, + parameter HALF_DEPTH = 0, + + parameter OSD_COLOR = 3'd4, + parameter OSD_X_OFFSET = 10'd0, + parameter OSD_Y_OFFSET = 10'd0 +) +( + // master clock + // it should be multiple by (ce_pix*4). + input clk_sys, + + // Pixel clock or clock_enable (both are accepted). + input ce_pix, + + // Some systems have multiple resolutions. + // ce_pix_actual should match ce_pix where every second or fourth pulse is enabled, + // thus half or qurter resolutions can be used without brake video sync while switching resolutions. + // For fixed single resolution (or when video sync stability isn't required) ce_pix_actual = ce_pix. + input ce_pix_actual, + + // OSD SPI interface + input SPI_SCK, + input SPI_SS3, + input SPI_DI, + + // scanlines (00-none 01-25% 10-50% 11-75%) + input [1:0] scanlines, + + // 0 = HVSync 31KHz, 1 = CSync 15KHz + input scandoubler_disable, + + // High quality 2x scaling + input hq2x, + + // YPbPr always uses composite sync + input ypbpr, + + // 0 = 16-240 range. 1 = 0-255 range. (only for YPbPr color space) + input ypbpr_full, + + // color + input [DWIDTH:0] R, + input [DWIDTH:0] G, + input [DWIDTH:0] B, + + // Monochrome mode (for HALF_DEPTH only) + input mono, + + // interlace sync. Positive pulses. + input HSync, + input VSync, + + // Falling of this signal means start of informative part of line. + // It can be horizontal blank signal. + // This signal can be used to reduce amount of required FPGA RAM for HQ2x scan doubler + // If FPGA RAM is not an issue, then simply set it to 0 for whole line processing. + // Keep in mind: due to algo first and last pixels of line should be black to avoid side artefacts. + // Thus, if blank signal is used to reduce the line, make sure to feed at least one black (or paper) pixel + // before first informative pixel. + input line_start, + + // MiST video output signals + output [5:0] VGA_R, + output [5:0] VGA_G, + output [5:0] VGA_B, + output VGA_VS, + output VGA_HS +); + +localparam DWIDTH = HALF_DEPTH ? 2 : 5; + +wire [DWIDTH:0] R_sd; +wire [DWIDTH:0] G_sd; +wire [DWIDTH:0] B_sd; +wire hs_sd, vs_sd; +// Scanline FIX +reg [DWIDTH:0] Rd,Gd,Bd; +always @(posedge clk_sys) {Rd,Gd,Bd} <= {R,G,B}; +// Scanline FIX + +scandoubler #(.LENGTH(LINE_LENGTH), .HALF_DEPTH(HALF_DEPTH)) scandoubler +( + .*, + .hs_in(HSync), + .vs_in(VSync), + .r_in(Rd), + .g_in(Gd), + .b_in(Bd), + + .hs_out(hs_sd), + .vs_out(vs_sd), + .r_out(R_sd), + .g_out(G_sd), + .b_out(B_sd) +); + +wire [DWIDTH:0] rt = (scandoubler_disable ? R : R_sd); +wire [DWIDTH:0] gt = (scandoubler_disable ? G : G_sd); +wire [DWIDTH:0] bt = (scandoubler_disable ? B : B_sd); + +generate + if(HALF_DEPTH) begin + wire [5:0] r = mono ? {gt,rt} : {rt,rt}; + wire [5:0] g = mono ? {gt,rt} : {gt,gt}; + wire [5:0] b = mono ? {gt,rt} : {bt,bt}; + end else begin + wire [5:0] r = rt; + wire [5:0] g = gt; + wire [5:0] b = bt; + end +endgenerate + +wire hs = (scandoubler_disable ? HSync : hs_sd); +wire vs = (scandoubler_disable ? VSync : vs_sd); + +reg scanline = 0; +always @(posedge clk_sys) begin + reg old_hs, old_vs; + + old_hs <= hs; + old_vs <= vs; + + if(old_hs && ~hs) scanline <= ~scanline; + if(old_vs && ~vs) scanline <= 0; +end + +wire [5:0] r_out, g_out, b_out; +always @(*) begin + case(scanlines & {scanline, scanline}) + 1: begin // reduce 25% = 1/2 + 1/4 + r_out = {1'b0, r[5:1]} + {2'b00, r[5:2]}; + g_out = {1'b0, g[5:1]} + {2'b00, g[5:2]}; + b_out = {1'b0, b[5:1]} + {2'b00, b[5:2]}; + end + + 2: begin // reduce 50% = 1/2 + r_out = {1'b0, r[5:1]}; + g_out = {1'b0, g[5:1]}; + b_out = {1'b0, b[5:1]}; + end + + 3: begin // reduce 75% = 1/4 + r_out = {2'b00, r[5:2]}; + g_out = {2'b00, g[5:2]}; + b_out = {2'b00, b[5:2]}; + end + + default: begin + r_out = r; + g_out = g; + b_out = b; + end + endcase +end + +wire [5:0] red, green, blue; +osd #(OSD_X_OFFSET, OSD_Y_OFFSET, OSD_COLOR) osd +( + .*, + + .R_in(r_out), + .G_in(g_out), + .B_in(b_out), + .HSync(hs), + .VSync(vs), + + .R_out(red), + .G_out(green), + .B_out(blue) +); + +wire [5:0] yuv_full[225] = '{ + 6'd0, 6'd0, 6'd0, 6'd0, 6'd1, 6'd1, 6'd1, 6'd1, + 6'd2, 6'd2, 6'd2, 6'd3, 6'd3, 6'd3, 6'd3, 6'd4, + 6'd4, 6'd4, 6'd5, 6'd5, 6'd5, 6'd5, 6'd6, 6'd6, + 6'd6, 6'd7, 6'd7, 6'd7, 6'd7, 6'd8, 6'd8, 6'd8, + 6'd9, 6'd9, 6'd9, 6'd9, 6'd10, 6'd10, 6'd10, 6'd11, + 6'd11, 6'd11, 6'd11, 6'd12, 6'd12, 6'd12, 6'd13, 6'd13, + 6'd13, 6'd13, 6'd14, 6'd14, 6'd14, 6'd15, 6'd15, 6'd15, + 6'd15, 6'd16, 6'd16, 6'd16, 6'd17, 6'd17, 6'd17, 6'd17, + 6'd18, 6'd18, 6'd18, 6'd19, 6'd19, 6'd19, 6'd19, 6'd20, + 6'd20, 6'd20, 6'd21, 6'd21, 6'd21, 6'd21, 6'd22, 6'd22, + 6'd22, 6'd23, 6'd23, 6'd23, 6'd23, 6'd24, 6'd24, 6'd24, + 6'd25, 6'd25, 6'd25, 6'd25, 6'd26, 6'd26, 6'd26, 6'd27, + 6'd27, 6'd27, 6'd27, 6'd28, 6'd28, 6'd28, 6'd29, 6'd29, + 6'd29, 6'd29, 6'd30, 6'd30, 6'd30, 6'd31, 6'd31, 6'd31, + 6'd31, 6'd32, 6'd32, 6'd32, 6'd33, 6'd33, 6'd33, 6'd33, + 6'd34, 6'd34, 6'd34, 6'd35, 6'd35, 6'd35, 6'd35, 6'd36, + 6'd36, 6'd36, 6'd36, 6'd37, 6'd37, 6'd37, 6'd38, 6'd38, + 6'd38, 6'd38, 6'd39, 6'd39, 6'd39, 6'd40, 6'd40, 6'd40, + 6'd40, 6'd41, 6'd41, 6'd41, 6'd42, 6'd42, 6'd42, 6'd42, + 6'd43, 6'd43, 6'd43, 6'd44, 6'd44, 6'd44, 6'd44, 6'd45, + 6'd45, 6'd45, 6'd46, 6'd46, 6'd46, 6'd46, 6'd47, 6'd47, + 6'd47, 6'd48, 6'd48, 6'd48, 6'd48, 6'd49, 6'd49, 6'd49, + 6'd50, 6'd50, 6'd50, 6'd50, 6'd51, 6'd51, 6'd51, 6'd52, + 6'd52, 6'd52, 6'd52, 6'd53, 6'd53, 6'd53, 6'd54, 6'd54, + 6'd54, 6'd54, 6'd55, 6'd55, 6'd55, 6'd56, 6'd56, 6'd56, + 6'd56, 6'd57, 6'd57, 6'd57, 6'd58, 6'd58, 6'd58, 6'd58, + 6'd59, 6'd59, 6'd59, 6'd60, 6'd60, 6'd60, 6'd60, 6'd61, + 6'd61, 6'd61, 6'd62, 6'd62, 6'd62, 6'd62, 6'd63, 6'd63, + 6'd63 +}; + +// http://marsee101.blog19.fc2.com/blog-entry-2311.html +// Y = 16 + 0.257*R + 0.504*G + 0.098*B (Y = 0.299*R + 0.587*G + 0.114*B) +// Pb = 128 - 0.148*R - 0.291*G + 0.439*B (Pb = -0.169*R - 0.331*G + 0.500*B) +// Pr = 128 + 0.439*R - 0.368*G - 0.071*B (Pr = 0.500*R - 0.419*G - 0.081*B) + +wire [18:0] y_8 = 19'd04096 + ({red, 8'd0} + {red, 3'd0}) + ({green, 9'd0} + {green, 2'd0}) + ({blue, 6'd0} + {blue, 5'd0} + {blue, 2'd0}); +wire [18:0] pb_8 = 19'd32768 - ({red, 7'd0} + {red, 4'd0} + {red, 3'd0}) - ({green, 8'd0} + {green, 5'd0} + {green, 3'd0}) + ({blue, 8'd0} + {blue, 7'd0} + {blue, 6'd0}); +wire [18:0] pr_8 = 19'd32768 + ({red, 8'd0} + {red, 7'd0} + {red, 6'd0}) - ({green, 8'd0} + {green, 6'd0} + {green, 5'd0} + {green, 4'd0} + {green, 3'd0}) - ({blue, 6'd0} + {blue , 3'd0}); + +wire [7:0] y = ( y_8[17:8] < 16) ? 8'd16 : ( y_8[17:8] > 235) ? 8'd235 : y_8[15:8]; +wire [7:0] pb = (pb_8[17:8] < 16) ? 8'd16 : (pb_8[17:8] > 240) ? 8'd240 : pb_8[15:8]; +wire [7:0] pr = (pr_8[17:8] < 16) ? 8'd16 : (pr_8[17:8] > 240) ? 8'd240 : pr_8[15:8]; + +assign VGA_R = ypbpr ? (ypbpr_full ? yuv_full[pr-8'd16] : pr[7:2]) : red; +assign VGA_G = ypbpr ? (ypbpr_full ? yuv_full[y -8'd16] : y[7:2]) : green; +assign VGA_B = ypbpr ? (ypbpr_full ? yuv_full[pb-8'd16] : pb[7:2]) : blue; +assign VGA_VS = (scandoubler_disable | ypbpr) ? 1'b1 : ~vs_sd; +assign VGA_HS = scandoubler_disable ? ~(HSync ^ VSync) : ypbpr ? ~(hs_sd ^ vs_sd) : ~hs_sd; + +endmodule diff --git a/Arcade_MiST/README.txt b/Arcade_MiST/README.txt index d8fcdc38..3abbcab0 100644 --- a/Arcade_MiST/README.txt +++ b/Arcade_MiST/README.txt @@ -11,7 +11,7 @@ Arcade Cores #Atari Centipede Hardware Centipede -#Atari Discrete Logic Hardware +#Atari Discrete Logic Computer Space #Custom Hardware @@ -67,6 +67,7 @@ Arcade Cores #Non Arcade 2048 + Arkanoid FlappyBird River Raid(Clone) diff --git a/Computer_MiST/Galaksija_MiST/rtl/galaksija_top.sv b/Computer_MiST/Galaksija_MiST/rtl/galaksija_top.sv index 50bfec54..a7510744 100644 --- a/Computer_MiST/Galaksija_MiST/rtl/galaksija_top.sv +++ b/Computer_MiST/Galaksija_MiST/rtl/galaksija_top.sv @@ -249,7 +249,7 @@ galaksija_video( {3'b010,16'b10xxxxxxxxxxxxxx}: begin idata = mram3_out; rd_mram3 = 1'b1; end {3'b100,16'b10xxxxxxxxxxxxxx}: wr_mram3= 1'b1; //$E000...$FFFF — ROM "3" + "4" IC13: 8 KB – Graphic primitives in BASIC language, Full Screen Source Editor and soft scrolling - {3'b010,16'b1110000000000000}: begin idata = rom3_out; rd_rom3 = 1'b1; end + {3'b010,16'b111xxxxxxxxxxxxx}: begin idata = rom3_out; rd_rom3 = 1'b1; end default : begin end endcase end