152 lines
4.7 KiB
VHDL
152 lines
4.7 KiB
VHDL
----------------------------------------------------------------------------------
|
|
-- Company:
|
|
-- Engineer:
|
|
--
|
|
-- Create Date: 30.11.2021 10:35:30
|
|
-- Design Name:
|
|
-- Module Name: Gene_Snake - Behavioral
|
|
-- Project Name:
|
|
-- Target Devices:
|
|
-- Tool Versions:
|
|
-- Description:
|
|
--
|
|
-- Dependencies:
|
|
--
|
|
-- Revision:
|
|
-- Revision 0.01 - File Created
|
|
-- Additional Comments:
|
|
--
|
|
----------------------------------------------------------------------------------
|
|
-- a faire:
|
|
-- - faire bouger le snake
|
|
-- - ajouter une clk
|
|
|
|
library IEEE;
|
|
use IEEE.STD_LOGIC_1164.ALL;
|
|
|
|
-- Uncomment the following library declaration if using
|
|
-- arithmetic functions with Signed or Unsigned values
|
|
use IEEE.NUMERIC_STD.ALL;
|
|
|
|
-- Uncomment the following library declaration if instantiating
|
|
-- any Xilinx leaf cells in this code.
|
|
--library UNISIM;
|
|
--use UNISIM.VComponents.all;
|
|
|
|
entity Gene_Snake is
|
|
Port ( X : in unsigned (9 downto 0);
|
|
Y : in unsigned (8 downto 0);
|
|
up : in std_logic;
|
|
down : in std_logic;
|
|
left : in std_logic;
|
|
right : in std_logic;
|
|
clk_rapide: in std_logic;
|
|
clk_lente : in std_logic;
|
|
reset: in std_logic;
|
|
snakePresent : out std_logic);
|
|
end Gene_Snake;
|
|
|
|
architecture Behavioral of Gene_Snake is
|
|
-- Déclaration des types de données
|
|
type coord is array(0 to 39, 0 to 29) of unsigned(10 downto 0);
|
|
type direction is (haut, bas, gauche, droite);
|
|
type pos is record
|
|
X: unsigned(9 downto 0);
|
|
Y: unsigned(8 downto 0);
|
|
dir: direction;
|
|
isDefined: std_logic;
|
|
end record;
|
|
type listSnake is array(0 to 1200) of pos;
|
|
|
|
-- Déclaration des signaux
|
|
signal mat: coord;
|
|
signal snake: listSnake;
|
|
signal snakeHere: std_logic;
|
|
signal update: std_logic;
|
|
signal current_index: unsigned(10 downto 0);
|
|
signal lastSnake: pos;
|
|
begin
|
|
|
|
process(X,Y,mat,reset, snake)
|
|
variable ref : unsigned(10 downto 0);
|
|
variable position : pos;
|
|
begin
|
|
if(reset='0')
|
|
then
|
|
-- snake <= (others=>(to_unsigned(1023,10),to_unsigned(511,10)));
|
|
for i in 0 to snake'length-1 loop
|
|
if(i>100 and i<103)
|
|
then
|
|
snake(i).X <= to_unsigned((22+i-101)*16 - 8,10);
|
|
snake(i).Y <= to_unsigned(32-8,9);
|
|
snake(i).dir <= gauche;
|
|
snake(i).isDefined <= '1';
|
|
else
|
|
snake(i).X <= to_unsigned(1023,10);
|
|
snake(i).Y <= to_unsigned(511,9);
|
|
snake(i).dir <= gauche;
|
|
snake(i).isDefined <= '0';
|
|
end if;
|
|
end loop;
|
|
for x in 0 to 39 loop
|
|
for y in 0 to 29 loop
|
|
mat(x,y) <= to_unsigned(y*40+x,11);
|
|
end loop;
|
|
end loop;
|
|
end if;
|
|
|
|
snakeHere <= '0';
|
|
for dx in -1 to 0 loop
|
|
for dy in -1 to 0 loop
|
|
ref := mat(to_integer(X/16)+dx,to_integer(Y/16)+dy);
|
|
position := snake(to_integer(ref));
|
|
if(position.isDefined= '1') then
|
|
if(X>=position.X-8 and X<=position.X+8 and Y>=position.Y-8 and Y<=position.Y+8) then
|
|
snakeHere <= snakeHere or '1';
|
|
end if;
|
|
end if;
|
|
end loop;
|
|
end loop;
|
|
end process;
|
|
|
|
-- On change la position (X et Y) d'une case du snake à chaque coup
|
|
-- d'horloge de clk_rapide.
|
|
--process(snake, clk_lente, clk_rapide, update, current_index)
|
|
--variable current_dir : direction;
|
|
--begin
|
|
--current_dir := snake(to_integer(current_index)).dir;
|
|
--if (clk_lente'event and clk_lente = '1') then
|
|
-- update <= '1';
|
|
--end if;
|
|
|
|
--if (update ='1' and clk_rapide'event and clk_rapide = '1') then
|
|
-- lastSnake <= snake(to_integer(current_index));
|
|
-- if (current_dir = haut) then
|
|
-- snake(to_integer(current_index)).Y <= snake(to_integer(current_index)).Y - 1;
|
|
-- end if;
|
|
-- if (current_dir = bas) then
|
|
-- snake(to_integer(current_index)).Y <= snake(to_integer(current_index)).Y + 1;
|
|
-- end if;
|
|
-- if (current_dir = droite) then
|
|
-- snake(to_integer(current_index)).X <= snake(to_integer(current_index)).X + 1;
|
|
-- end if;
|
|
-- if (current_dir = gauche) then
|
|
-- snake(to_integer(current_index)).X <= snake(to_integer(current_index)).X - 1;
|
|
-- end if;
|
|
|
|
-- if ((snake(to_integer(current_index)).X/16 /= lastSnake.X/16) or (snake(to_integer(current_index)).Y/16 /= lastSnake.Y/16)) then
|
|
-- mat(to_integer(lastSnake.X/16),to_integer(lastSnake.Y/16)) <= to_unsigned(1200,11);
|
|
-- mat(to_integer(snake(to_integer(current_index)).X/16),to_integer(snake(to_integer(current_index)).Y/16))<=current_index;
|
|
-- end if;
|
|
-- current_index <= current_index + 1;
|
|
--end if;
|
|
|
|
--if (to_integer(current_index) = snake'length) then
|
|
-- current_index <= (others => '0');
|
|
-- update <= '0';
|
|
--end if;
|
|
--end process;
|
|
|
|
snakePresent <= snakeHere;
|
|
end Behavioral;
|