1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-04-28 13:07:51 +00:00
Files
Gehstock.Mist_FPGA/2048_Mist/rtl/Game_VIEW.vhd
2018-02-05 20:02:00 +01:00

594 lines
9.6 KiB
VHDL
Raw Blame History

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.NUMERIC_STD.ALL;
USE WORK.GAME_TYPES.ALL;
ENTITY GAME_VIEW IS
PORT
(
-- INPUTs
clk : IN STD_LOGIC;
-- MODEL STATUS
box_values : IN GAME_GRID;
score : IN INTEGER RANGE 0 to 9999;
bootstrap,
won,
lost : IN STD_LOGIC;
-- OUTPUTs
hsync,
vsync : OUT STD_LOGIC;
red,
green,
blue : OUT STD_LOGIC_VECTOR(3 downto 0)
);
end GAME_VIEW;
ARCHITECTURE behavior of GAME_VIEW IS
-- Sync Counters
shared variable h_cnt : integer range 0 to 1000;
shared variable v_cnt : integer range 0 to 500;
-- Segnali per il disegno della griglia e del colore dei box
signal drawGrid : STD_LOGIC;
signal colorGrid : STD_LOGIC_VECTOR(11 downto 0);
-- Segnali per il disegno dei caratteri su schermo : autori
signal drawCharC : STD_LOGIC;
signal drawCharO : STD_LOGIC;
signal drawCharL : STD_LOGIC;
signal drawCharA : STD_LOGIC;
signal drawCharC1 : STD_LOGIC;
signal drawCharE : STD_LOGIC;
signal drawCharSep : STD_LOGIC;
signal drawCharG : STD_LOGIC;
signal drawCharE1 : STD_LOGIC;
signal drawCharZ : STD_LOGIC;
signal drawCharZ1 : STD_LOGIC;
signal drawCharI : STD_LOGIC;
-- game over
signal drawGoG : STD_LOGIC;
signal drawGoA : STD_LOGIC;
signal drawGoM : STD_LOGIC;
signal drawGoE : STD_LOGIC;
signal drawGoO : STD_LOGIC;
signal drawGoV : STD_LOGIC;
signal drawGoE1: STD_LOGIC;
signal drawGoR : STD_LOGIC;
-- you win
signal drawYwY : STD_LOGIC;
signal drawYwO : STD_LOGIC;
signal drawYwU : STD_LOGIC;
signal drawYwW : STD_LOGIC;
signal drawYwI : STD_LOGIC;
signal drawYwN : STD_LOGIC;
BEGIN
--Disegno caratteri : autori
CHC: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 16,
YPOS => 12
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'C',
drawChar => drawCharC
);
CHO: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 26,
YPOS => 12
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'o',
drawChar => drawCharO
);
CHL: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 36,
YPOS => 12
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'l',
drawChar => drawCharL
);
CHA: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 46,
YPOS => 12
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'a',
drawChar => drawCharA
);
CHC1: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 56,
YPOS => 12
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'c',
drawChar => drawCharC1
);
CHE: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 66,
YPOS => 12
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'e',
drawChar => drawCharE
);
CHSEP: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 76,
YPOS => 12
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => '-',
drawChar => drawCharSep
);
CHG: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 86,
YPOS => 12
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'G',
drawChar => drawCharG
);
CHE1: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 96,
YPOS => 12
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'e',
drawChar => drawCharE1
);
CHZ: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 106,
YPOS => 12
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'z',
drawChar => drawCharZ
);
CHZ1: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 116,
YPOS => 12
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'z',
drawChar => drawCharZ1
);
CHI: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 126,
YPOS => 12
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'i',
drawChar => drawCharI
);
-- disegno caratteri : game over
CHGOG: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 280,
YPOS => 232
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'G',
drawChar => drawGoG
);
CHGOA: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 290,
YPOS => 232
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'A',
drawChar => drawGoA
);
CHGOM: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 300,
YPOS => 232
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'M',
drawChar => drawGoM
);
CHGOE: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 310,
YPOS => 232
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'E',
drawChar => drawGoE
);
--over
CHGOO: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 330,
YPOS => 232
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'O',
drawChar => drawGoO
);
CHGOV: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 340,
YPOS => 232
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'V',
drawChar => drawGoV
);
CHGOE1: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 350,
YPOS => 232
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'E',
drawChar => drawGoE1
);
CHGOR: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 360,
YPOS => 232
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'R',
drawChar => drawGoR
);
CHYWY: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 280,
YPOS => 232
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'Y',
drawChar => drawYwY
);
CHYWO: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 290,
YPOS => 232
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'O',
drawChar => drawYwO
);
CHYWU: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 300,
YPOS => 232
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'U',
drawChar => drawYwU
);
CHYWW: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 320,
YPOS => 232
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'W',
drawChar => drawYwW
);
CHYWI: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 330,
YPOS => 232
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'I',
drawChar => drawYwI
);
CHYWN: entity work.GAME_CHDISPLAY
generic map
(
XPOS => 340,
YPOS => 232
)
port map
(
pixel_x => h_cnt,
pixel_y => v_cnt,
char_code => 'N',
drawChar => drawYwN
);
GRID: entity work.GAME_GRID_VIEW
port map
(
clk => clk,
pixel_x => h_cnt,
pixel_y => v_cnt,
box_values => box_values,
drawGrid => drawGrid,
color => colorGrid
);
PROCESS
-- HSYNC e VSYNC
variable h_sync : STD_LOGIC;
variable v_sync : STD_LOGIC;
-- Enable del video
variable horizontal_en : STD_LOGIC;
variable vertical_en : STD_LOGIC;
variable video_en : STD_LOGIC;
-- Segnale colore RGB a 12 bit
variable colorRGB : STD_LOGIC_VECTOR(11 downto 0);
-- Bordi Schermo
constant leftBorder : INTEGER RANGE 0 to 1000 := 15;
constant rightBorder : INTEGER RANGE 0 to 1000 := 625;
constant upBorder : INTEGER RANGE 0 to 500 := 30;
constant downBorder : INTEGER RANGE 0 to 500 := 460;
BEGIN
WAIT UNTIL(clk'EVENT) AND (clk = '1');
-- Reset Horizontal Counter
-- (al valore 799, anzich<63> 640, per rispettare i tempi di Front Porch)
IF (h_cnt = 799)
THEN
h_cnt := 0;
ELSE
h_cnt := h_cnt + 1;
END IF;
-- Disegno Bordi
IF
(
h_cnt <= leftBorder OR -- BORDO LEFT
h_cnt >= rightBorder OR -- BORDO RIGHT
v_cnt <= upBorder OR -- BORDO UP
v_cnt >= downBorder -- BORDO DOWN
)
THEN
colorRGB := COLOR_BORDER;
-- SE NON <20> BORDO, <20> SFONDO
ELSE
colorRGB := COLOR_BG;
END IF;
-- Disegno griglia di gioco
IF (drawGrid = '1')
THEN
colorRGB := colorGrid;
END IF;
-- Disegno "Colace-Gezzi"
IF
(
drawCharC='1' OR drawCharO='1' OR drawCharL='1' OR
drawCharA='1' OR drawCharC1='1' OR drawCharE='1' OR
drawCharSep='1' OR drawCharG='1' OR drawCharE1='1' OR
drawCharZ='1' OR drawCharZ1='1' OR drawCharI='1'
)
THEN
colorRGB := COLOR_TEAL;
END IF;
-- Disegno "GAME OVER"
IF
(
(drawGoG='1' OR drawGoA='1' OR drawGoM='1' OR drawGoE='1' OR
drawGoO='1' OR drawGoV='1' OR drawGoE1='1' OR drawGoR='1') AND
lost = '1'
)
THEN
colorRGB := COLOR_TEAL;
END IF;
-- Disegno "YOU WIN"
IF
(
(drawYwY='1' OR drawYwO='1' OR drawYwU='1' OR
drawYwW='1' OR drawYwI='1' OR drawYwN='1' ) AND
won = '1'
)
THEN
colorRGB := COLOR_VICTORY;
END IF;
-- H_SYNC
IF (h_cnt <= 755 AND h_cnt >= 659)
THEN
h_sync := '0';
ELSE
h_sync := '1';
END IF;
-- V_SYNC
IF (v_cnt >= 524 AND h_cnt >= 699)
THEN
v_cnt := 0;
ELSIF (h_cnt = 699)
THEN
v_cnt := v_cnt + 1;
END IF;
IF (v_cnt = 490 OR v_cnt = 491)
THEN
v_sync := '0';
ELSE
v_sync := '1';
END IF;
-- Horizontal Data Enable
-- (dati di riga validi, ossia nel range orizzontale 0-639)
IF (h_cnt <= 639)
THEN
horizontal_en := '1';
ELSE
horizontal_en := '0';
END IF;
-- Vertical Data Enable
-- (dati di riga validi, ossia nel range verticale 0-479)
IF (v_cnt <= 479)
THEN
vertical_en := '1';
ELSE
vertical_en := '0';
END IF;
-- Video Enable <20> AND tra i due data enable
video_en := horizontal_en AND vertical_en;
-- Assegnamento segnali fisici a VGA
red(3) <= colorRGB(11) AND video_en;
red(2) <= colorRGB(10) AND video_en;
red(1) <= colorRGB(9) AND video_en;
red(0) <= colorRGB(8) AND video_en;
green(3) <= colorRGB(7) AND video_en;
green(2) <= colorRGB(6) AND video_en;
green(1) <= colorRGB(5) AND video_en;
green(0) <= colorRGB(4) AND video_en;
blue(3) <= colorRGB(3) AND video_en;
blue(2) <= colorRGB(2) AND video_en;
blue(1) <= colorRGB(1) AND video_en;
blue(0) <= colorRGB(0) AND video_en;
hsync <= h_sync;
vsync <= v_sync;
END PROCESS;
END behavior;