---------------------------------------------------------------------------------- -- 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; library ourTypes; use ourTypes.types.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 generic( addressSize : integer:=10); Port ( X : in unsigned (9 downto 0); Y : in unsigned (8 downto 0); clk: in std_logic; reset: in std_logic; currentSnake : in pos; updateOrder : in std_logic; listRef : in unsigned(addressSize-1 downto 0); snakePresent : out std_logic; currentAddress : out unsigned(addressSize-1 downto 0); matAddress : out unsigned(addressSize-1 downto 0) ); end Gene_Snake; architecture Behavioral of Gene_Snake is -- D???claration des signaux signal snakeHere: std_logic; --1 si on doit afficher le pixel 0 sinon signal dx : signed(2 downto 0); signal dy : signed(2 downto 0); signal running : std_logic; begin ---- Process d'initialisation --process(mat,snake,reset,current_index) --variable current_dir : direction; --begin -- if(reset='0') -- then -- update <= '0'; -- current_index <= to_unsigned(0,11); -- for x in 0 to 39 loop -- for y in 0 to 29 loop -- mat(x,y) <= to_unsigned(snake'length-1,11); -- end loop; -- end loop; -- mat(0,0) <= to_unsigned(0,11); -- mat(1,0) <= to_unsigned(1,11); -- snake(0).X <= to_unsigned(8,10); -- snake(0).Y <= to_unsigned(8,9); -- snake(0).dir <= droite; -- snake(0).isDefined <= '1'; -- snake(1).X <= to_unsigned(24,10); -- snake(1).Y <= to_unsigned(8,9); -- snake(1).dir <= droite; -- snake(1).isDefined <= '1'; -- for i in 2 to snake'length-1 loop -- snake(i).X <= to_unsigned(0,10); -- snake(i).Y <= to_unsigned(0,9); -- snake(i).dir <= gauche; -- snake(i).isDefined <= '0'; -- end loop; -- elsif(clk_rapide'event and clk_rapide = '1') -- then -- snake(to_integer(current_index)) <= updatedSnake; -- current_index <= updatedIndex; -- end if; -- if (to_integer(current_index) = snake'length) then -- update <= '0'; -- current_index <= to_unsigned(0,11); -- end if; -- if(clk_lente'event and clk_lente = '1') -- then -- update <= '1'; -- end if; --end process; -- Process de calcul d'affichage process(X,Y,clk,reset,running,dx,dy,updateOrder,currentSnake,snakeHere) begin if(updateOrder'event and updateOrder = '1') then running <= '1'; snakeHere <= '0'; dx <= to_signed(-1,3); dy <= to_signed(-1,3); end if; if(reset = '0') then dx <= to_signed(-1,3); dy <= to_signed(-1,3); running <= '0'; snakeHere <= '0'; elsif(clk'event and clk = '1') then if(running = '1') then dx <= dx + 1; if(dx = 2) then dx <= to_signed(-1,3); dy <= dy + 1; end if; end if; end if; if(currentSnake.isDefined = '1') then --if(X>=currentSnake.X-8 and X<=currentSnake.X+8 and Y>=currentSnake.Y-8 and Y<=currentSnake.Y+8) then snakeHere <= '1'; --end if; end if; if(dy = 2) then dy <= to_signed(-1,3); running <= '0'; end if; end process; matAddress <= resize(shift_right(to_unsigned(to_integer(Y)+to_integer(dy),9),4)*40+shift_right(to_unsigned(to_integer(X)+to_integer(dx),10),4),SNAKE_ADDRESS_SIZE); --on resize parce qu'il as décidé que le resultat faisait 18bits au lieu des 11 attendus currentAddress <= listRef; snakePresent <= snakeHere; end Behavioral;