+ assert run_head_sig = '0' and run_tail_sig = '0' and run_apples_sig = '0' and run_reset_sig = '1' and run_init_sig = '0' report "Reset not in Reset State" severity error;
+
+ wait for CLK_PERIOD;
+ reset_done_sig <= '1';
+ wait for CLK_PERIOD;
+ reset_done_sig <= '0';
+ wait for CLK_PERIOD;
+
+ assert run_head_sig = '0' and run_tail_sig = '0' and run_apples_sig = '0' and run_reset_sig = '0' and run_init_sig = '1' report "Not in init state after reset done" severity error;
+
+ wait for CLK_PERIOD;
+ init_done_sig <= '1';
+ wait for CLK_PERIOD;
+ init_done_sig <= '0';
+ wait for CLK_PERIOD;
+
+ assert run_head_sig = '0' and run_tail_sig = '0' and run_apples_sig = '0' and run_reset_sig = '0' and run_init_sig = '0' report "Not in empty state after init done" severity error;
+
+ wait for CLK_PERIOD * 10;
+
+ button_pressed_sig <= '1';
+
+ wait for CLK_PERIOD * 1;
+
+ assert run_head_sig = '0' and run_tail_sig = '0' and run_apples_sig = '0' and run_reset_sig = '0' and run_init_sig = '0' report "Not in empty state after button pressed - should wait for tick" severity error;
+
+ wait for CLK_PERIOD;
+
+ tick_sig <= '1';
+
+ wait for CLK_PERIOD * 2; -- Two clock cycles for synchroniser
+
+ assert run_head_sig = '1' and run_tail_sig = '0' and run_apples_sig = '0' and run_reset_sig = '0' and run_init_sig = '0' report "Not in head state after idle tick" severity error;
+
+ wait for CLK_PERIOD;
+ head_done_sig <= '1';
+ wait for CLK_PERIOD;
+ head_done_sig <= '0';
+ wait for CLK_PERIOD;
+
+ assert run_head_sig = '0' and run_tail_sig = '1' and run_apples_sig = '0' and run_reset_sig = '0' and run_init_sig = '0' report "Not in tail state after head done" severity error;
+
+ wait for CLK_PERIOD;
+ tail_done_sig <= '1';
+ wait for CLK_PERIOD;
+ tail_done_sig <= '0';
+ wait for CLK_PERIOD;
+
+ assert run_head_sig = '0' and run_tail_sig = '0' and run_apples_sig = '1' and run_reset_sig = '0' and run_init_sig = '0' report "Not in apples state after tail done" severity error;
+
+ wait for CLK_PERIOD;
+ apples_done_sig <= '1';
+ wait for CLK_PERIOD;
+ apples_done_sig <= '0';
+ wait for CLK_PERIOD;
+
+ assert run_head_sig = '0' and run_tail_sig = '0' and run_apples_sig = '0' and run_reset_sig = '0' and run_init_sig = '0' report "Not in idle state after apples done" severity error;
+
+ wait for CLK_PERIOD * 10;
+
+ tick_sig <= '0';
+ assert run_head_sig = '0' and run_tail_sig = '0' and run_apples_sig = '0' and run_reset_sig = '0' and run_init_sig = '0' report "Not in empty state after button pressed - should wait for tick" severity error;
+
+ wait for CLK_PERIOD * 20;
+
+ assert run_head_sig = '0' and run_tail_sig = '0' and run_apples_sig = '0' and run_reset_sig = '0' and run_init_sig = '0' report "Not in empty state after button pressed - should wait for tick" severity error;
+
+ wait for CLK_PERIOD;
+
+ tick_sig <= '1';
+
+ wait for CLK_PERIOD * 2; -- Two clock cycles for synchroniser
+
+ assert run_head_sig = '1' and run_tail_sig = '0' and run_apples_sig = '0' and run_reset_sig = '0' and run_init_sig = '0' report "Not in head state after idle tick" severity error;
+ wait for CLK_PERIOD * 50;
+
+ wait for CLK_PERIOD;
+ head_death_sig <= '1';
+ wait for CLK_PERIOD;
+ head_death_sig <= '0';
+ wait for CLK_PERIOD;
+
+ assert run_head_sig = '0' and run_tail_sig = '0' and run_apples_sig = '0' and run_reset_sig = '0' and run_init_sig = '0' report "Not in Death state after Head Death" severity error;
+
+ -- CHECK RESET ONCE MORE
+
+ wait for CLK_PERIOD * 10;
+ wait for 0 ns;
+ logic_reset_sig <= '1';
+ wait for CLK_PERIOD;
+ wait for 0 ns;
+ logic_reset_sig <= '0';
+ -- Test Phase
+ wait for CLK_PERIOD;
+ assert run_head_sig = '0' and run_tail_sig = '0' and run_apples_sig = '0' and run_reset_sig = '1' and run_init_sig = '0' report "Reset not in Reset State" severity error;
+
+ wait for CLK_PERIOD;
+ reset_done_sig <= '1';
+ wait for CLK_PERIOD;
+ reset_done_sig <= '0';
+ wait for CLK_PERIOD;
+
+ assert run_head_sig = '0' and run_tail_sig = '0' and run_apples_sig = '0' and run_reset_sig = '0' and run_init_sig = '1' report "Not in init state after reset done" severity error;
+
+ wait for CLK_PERIOD;
+ init_done_sig <= '1';
+ wait for CLK_PERIOD;
+ init_done_sig <= '0';
+ wait for CLK_PERIOD;
+
+ assert run_head_sig = '0' and run_tail_sig = '0' and run_apples_sig = '0' and run_reset_sig = '0' and run_init_sig = '0' report "Not in empty state after init done" severity error;
+ -- Simulation beenden
+ wait for CLK_PERIOD * 10;
+ std.env.stop;
+ end process;
+
+ monitor : process (clk_sig)
+ begin
+ if rising_edge(clk_sig) then
+ if run_head_sig = '1' then
+ assert run_tail_sig = '0' report "More than one run signal high! (head/tail)" severity error;
+ assert run_apples_sig = '0' report "More than one run signal high! (head/apples)" severity error;
+ assert run_reset_sig = '0' report "More than one run signal high! (head/reset)" severity error;
+ assert run_init_sig = '0' report "More than one run signal high! (head/init)" severity error;
+ elsif run_tail_sig = '1' then
+ assert run_apples_sig = '0' report "More than one run signal high! (tail/apples)" severity error;
+ assert run_reset_sig = '0' report "More than one run signal high! (tail/reset)" severity error;
+ assert run_init_sig = '0' report "More than one run signal high! (tail/init)" severity error;
+ elsif run_apples_sig = '1' then
+ assert run_reset_sig = '0' report "More than one run signal high! (apples/reset)" severity error;
+ assert run_init_sig = '0' report "More than one run signal high! (apples/init)" severity error;
+ elsif run_reset_sig = '1' then
+ assert run_init_sig = '0' report "More than one run signal high! (reset/init)" severity error;
+ tile_coord => tile_coord_head_sig, --: out coordinate;
+ tile_from_GA => tile_from_GA_sig, --: in game_tile;
+ tile_to_GA => tile_to_GA_sig, --: out game_tile;
+ --get_tile => get_tile_sig, --: out std_ulogic;
+ set_tile => set_tile_sig, --: out std_ulogic;
+ --gamesstate information
+ head_pos => head_pos_out_sig, --: in coordinate;
+ --button direction
+ direction => direction_sig--, --: in buttondir--;
+ -- debug_last_dir => debug_last_dir_sig
+ );
+
+ clk_gen : process
+ begin
+ clk_sig <= '1';
+ wait for CLK_PERIOD / 2;
+ clk_sig <= '0';
+ wait for CLK_PERIOD / 2;
+ end process;
+
+ -- 0. In a the beninging >> IDLE
+ -- 1. Calculate next head postition >> CALC_NEXT_HEAD_POS
+ -- 2. Check next head position (wall) | request tile next head position >> CHECK_NEXT_HEAD_POS
+ -- 3. wait >> CYCLE_WASTE
+ -- 4. wait >> WASTE_CYCLE
+ -- 5. Check death at next head position >> CHECK_DEATH
+ -- 6. Write Next Head Position >> SET_NEXT_HEAD
+ -- 7. Write Last Head Position as body >> SET_BODY
+ -- 8. Set Done sig >> DONE
+ -- Ferner liefen: >> DEATH
+
+ kickoff_head : process (head_done_sig, head_death_sig, trigger_head)
+ begin
+ if run_head_sig = '0' and trigger_head = '1' then
+ run_head_sig <= '1';
+ elsif run_head_sig = '1' and head_death_sig = '1' then
+ run_head_sig <= '0';
+ elsif run_head_sig = '1' and head_done_sig = '1' then
+ run_head_sig <= '0';
+ else
+ run_head_sig <= run_head_sig;
+ end if;
+ end process;
+
+ -- -- Stimulus Prozess
+ stimulus : process
+ begin
+ -- Reset Phase
+ wait for 0 ns;
+ logic_reset_sig <= '1';
+ tile_from_GA_sig <= empty_tile;
+ wait for CLK_PERIOD * 5;
+ logic_reset_sig <= '0';
+ -- Should still be in reset state
+ assert tile_coord_head_sig.x = "000000" and tile_coord_head_sig.y = "000000" and set_tile_sig = '0' and tile_to_GA_sig = empty_tile and head_done_sig = '0' and head_death_sig = '0' report "Reset not in Reset State" severity error;
+ wait for CLK_PERIOD * 5;
+ -- should be in IDLE state
+ assert tile_coord_head_sig.x = "000000" and tile_coord_head_sig.y = "000000" and set_tile_sig = '0' and tile_to_GA_sig = empty_tile and head_done_sig = '0' and head_death_sig = '0' report "Not in IDLE state" severity error;
+ wait for CLK_PERIOD * 5;
+
+ -- Test valid RIGHT
+ report "Test: Valid RIGHT";
+ body_tile.parent.x <= "001101";
+ body_tile.parent.y <= "010101";
+ wait for 0 ns;
+ trigger_head <= '1';
+ tile_from_GA_sig <= body_tile;
+ direction_sig <= RIGHT;
+ head_pos_out_sig.x <= "001100";
+ head_pos_out_sig.y <= "010101";
+ wait until tile_coord_head_sig.x /= "000000" and tile_coord_head_sig.y /= "000000";
+ trigger_head <= '0';
+ assert tile_coord_head_sig.x = "001101" and tile_coord_head_sig.y = "010101" report "Wrong coordinate for next head position" severity error;
+ assert head_death_sig = '0' report "Death and done are not possible at the same time" severity error;
+
+ wait for CLK_PERIOD * 10;
+
+ -- Test valid DOWN
+ report "Test: Valid DOWN";
+ body_tile.parent.x <= "001100";
+ body_tile.parent.y <= "010110";
+ wait for 0 ns;
+ trigger_head <= '1';
+ tile_from_GA_sig <= body_tile;
+ direction_sig <= DOWN;
+ head_pos_out_sig.x <= "001100";
+ head_pos_out_sig.y <= "010101";
+
+ wait until tile_coord_head_sig.x /= "000000" and tile_coord_head_sig.y /= "000000";
+ trigger_head <= '0';
+ assert tile_coord_head_sig.x = body_tile.parent.x and tile_coord_head_sig.y = body_tile.parent.y report "Wrong coordinate for next head position" severity error;
+ assert head_death_sig = '0' report "Death and done are not possible at the same time" severity error;
+
+ wait for CLK_PERIOD * 10;
+
+ -- Test invalid UP after DOWN
+ report "Test: invalid UP after DOWN";
+ body_tile.parent.x <= "001100";
+ body_tile.parent.y <= "010110";
+ wait for 0 ns;
+ trigger_head <= '1';
+ tile_from_GA_sig <= body_tile;
+ direction_sig <= UP;
+ head_pos_out_sig.x <= "001100";
+ head_pos_out_sig.y <= "010101";
+
+ wait until tile_coord_head_sig.x /= "000000" and tile_coord_head_sig.y /= "000000";
+ trigger_head <= '0';
+ assert tile_coord_head_sig.x = body_tile.parent.x and tile_coord_head_sig.y = body_tile.parent.y report "Wrong coordinate for next head position" severity error;
+ assert head_death_sig = '0' report "Death and done are not possible at the same time" severity error;
+
+ wait for CLK_PERIOD * 10;
+
+ -- Test valid LEFT
+ report "Test: Valid LEFT";
+ body_tile.parent.x <= "001011";
+ body_tile.parent.y <= "010101";
+ wait for 0 ns;
+ trigger_head <= '1';
+ tile_from_GA_sig <= body_tile;
+ direction_sig <= LEFT;
+ head_pos_out_sig.x <= "001100";
+ head_pos_out_sig.y <= "010101";
+
+ wait until tile_coord_head_sig.x /= "000000" and tile_coord_head_sig.y /= "000000";
+ trigger_head <= '0';
+ assert tile_coord_head_sig.x = body_tile.parent.x and tile_coord_head_sig.y = body_tile.parent.y report "Wrong coordinate for next head position" severity error;
+ assert head_death_sig = '0' report "Death and done are not possible at the same time" severity error;
+
+ wait for CLK_PERIOD * 10;
+
+ -- Test invalid RIGHT after LEFT
+ report "Test: invalid RIGHT after LEFT";
+ body_tile.parent.x <= "001011";
+ body_tile.parent.y <= "010101";
+ wait for 0 ns;
+ trigger_head <= '1';
+ tile_from_GA_sig <= empty_tile;
+ direction_sig <= RIGHT;
+ head_pos_out_sig.x <= "001100";
+ head_pos_out_sig.y <= "010101";
+
+ wait until tile_coord_head_sig.x /= "000000" and tile_coord_head_sig.y /= "000000";
+ trigger_head <= '0';
+ assert tile_coord_head_sig.x = body_tile.parent.x and tile_coord_head_sig.y = body_tile.parent.y report "Wrong coordinate for next head position" severity error;
+ assert head_death_sig = '0' report "Death and done are not possible at the same time" severity error;
+
+ wait for CLK_PERIOD * 10;
+
+ -- Test valid UP
+ report "Test: Valid UP";
+ body_tile.parent.x <= "001100";
+ body_tile.parent.y <= "010100";
+ wait for 0 ns;
+ trigger_head <= '1';
+ tile_from_GA_sig <= empty_tile;
+ direction_sig <= UP;
+ head_pos_out_sig.x <= "001100";
+ head_pos_out_sig.y <= "010101";
+
+ wait until tile_coord_head_sig.x /= "000000" and tile_coord_head_sig.y /= "000000";
+ trigger_head <= '0';
+ assert tile_coord_head_sig.x = body_tile.parent.x and tile_coord_head_sig.y = body_tile.parent.y report "Wrong coordinate for next head position" severity error;
+ assert head_death_sig = '0' report "Death and done are not possible at the same time" severity error;
+
+ wait for CLK_PERIOD * 10;
+
+ -- Test invalid DOWN (after UP)
+ report "Test: invalid DOWN after UP";
+ body_tile.parent.x <= "001100";
+ body_tile.parent.y <= "010100";
+ wait for 0 ns;
+ trigger_head <= '1';
+ tile_from_GA_sig <= empty_tile;
+ direction_sig <= DOWN;
+ head_pos_out_sig.x <= "001100";
+ head_pos_out_sig.y <= "010101";
+
+ wait until tile_coord_head_sig.x /= "000000" and tile_coord_head_sig.y /= "000000";
+ trigger_head <= '0';
+ assert tile_coord_head_sig.x = body_tile.parent.x and tile_coord_head_sig.y = body_tile.parent.y report "Wrong coordinate for next head position" severity error;
+ assert head_death_sig = '0' report "Death and done are not possible at the same time" severity error;
+
+ wait for CLK_PERIOD * 10;
+
+ -- Test DEATH by BODY
+ report "Test: DEATH by BODY";
+ body_tile.parent.x <= "001100";
+ body_tile.parent.y <= "010100";
+ wait for 0 ns;
+ trigger_head <= '1';
+ tile_from_GA_sig <= empty_tile;
+ direction_sig <= UP;
+ head_pos_out_sig.x <= "001100";
+ head_pos_out_sig.y <= "010101";
+
+ wait until tile_coord_head_sig.x /= "000000" and tile_coord_head_sig.y /= "000000";
+ trigger_head <= '0';
+ assert tile_coord_head_sig.x = body_tile.parent.x and tile_coord_head_sig.y = body_tile.parent.y report "Wrong coordinate for next head position" severity error;
+ assert head_done_sig = '0' report "Death and done are not possible at the same time" severity error;
+ else
+ report "Testbench Timeout - never setting tile" severity failure;
+ end if;
+
+ wait for CLK_PERIOD * 10;
+ -- Test DEATH by TAIL
+ report "Test: DEATH by TAIL";
+ body_tile.parent.x <= "001100";
+ body_tile.parent.y <= "010100";
+ wait for 0 ns;
+ trigger_head <= '1';
+ tile_from_GA_sig <= empty_tile;
+ direction_sig <= UP;
+ head_pos_out_sig.x <= "001100";
+ head_pos_out_sig.y <= "010101";
+
+ wait until tile_coord_head_sig.x /= "000000" and tile_coord_head_sig.y /= "000000";
+ trigger_head <= '0';
+ assert tile_coord_head_sig.x = body_tile.parent.x and tile_coord_head_sig.y = body_tile.parent.y report "Wrong coordinate for next head position" severity error;
+ assert VGA_R = last_pix_col_sig.red and VGA_G = last_pix_col_sig.green and VGA_B = last_pix_col_sig.blue report "Wrong color to output" severity error;
+architecture zqxwvuts of Tail is type asdfghjk is (fghjuiop,poiuytre,zxcvbnma,rtghyujk,ghjkdfgh,cvbnerty,mnbvcxzq,sdfghjkl,tyuioplk,wertyuio,qwertyui,lkjhgfds);signal plmoknij,bhuygvcf:asdfghjk;signal vfrcdexs,zaqwsxed,qazwsxed:coordinate_t;signal wsxedcrf:game_tile;constant edcrfvtg:coordinate_t:=(x=>(others=>'0'),y=>(others=>'0'));constant rfvtgbyh:game_tile:=(is_tail=>'0',is_head=>'0',is_apple=>'0',is_body=>'0',parent=>edcrfvtg);begin wsxedcrf.is_tail<='1';wsxedcrf.is_head<='0';wsxedcrf.is_apple<='0';wsxedcrf.is_body<='0';tgbyhnuj:process(clk)begin if reset='1'then plmoknij<=mnbvcxzq;elsif rising_edge(clk)then plmoknij<=bhuygvcf;if plmoknij=qwertyui then vfrcdexs<=tile_from_GA.parent;qazwsxed<=tile_from_GA.parent;elsif plmoknij=lkjhgfds then zaqwsxed<=tail_pos;elsif plmoknij=zxcvbnma then wsxedcrf.parent<=tile_from_GA.parent;end if;end if;end process;yhnujmik:process(plmoknij,start_tail)begin case plmoknij is when mnbvcxzq=>bhuygvcf<=poiuytre;when poiuytre=>if start_tail='1'then bhuygvcf<=lkjhgfds;else bhuygvcf<=poiuytre;end if;when lkjhgfds=>if apple_placed='0'then bhuygvcf<=wertyuio;else bhuygvcf<=rtghyujk;end if;when rtghyujk=>bhuygvcf<=cvbnerty;when cvbnerty=>bhuygvcf<=qwertyui;when qwertyui=>bhuygvcf<=fghjuiop;when fghjuiop=>bhuygvcf<=tyuioplk;when tyuioplk=>bhuygvcf<=ghjkdfgh;when ghjkdfgh=>bhuygvcf<=zxcvbnma;when zxcvbnma=>bhuygvcf<=sdfghjkl;when sdfghjkl=>bhuygvcf<=wertyuio;when wertyuio=>bhuygvcf<=poiuytre;end case;end process;ujmiklol:process(plmoknij)begin case plmoknij is when mnbvcxzq=>tile_coord<=edcrfvtg;set_tile<='0';tile_to_GA<=rfvtgbyh;tail_done<='0';when poiuytre=>tile_coord<=edcrfvtg;set_tile<='0';tile_to_GA<=rfvtgbyh;tail_done<='0';when lkjhgfds=>tile_coord<=tail_pos;set_tile<='0';tile_to_GA<=rfvtgbyh;tail_done<='0';when rtghyujk=>tile_coord<=tail_pos;set_tile<='0';tile_to_GA<=rfvtgbyh;tail_done<='0';when cvbnerty=>tile_coord<=tail_pos;set_tile<='0';tile_to_GA<=rfvtgbyh;tail_done<='0';when qwertyui=>tile_coord<=edcrfvtg;set_tile<='0';tile_to_GA<=rfvtgbyh;tail_done<='0';when fghjuiop=>tile_coord<=qazwsxed;set_tile<='0';tile_to_GA<=rfvtgbyh;tail_done<='0';when tyuioplk=>tile_coord<=qazwsxed;set_tile<='0';tile_to_GA<=rfvtgbyh;tail_done<='0';when ghjkdfgh=>tile_coord<=qazwsxed;set_tile<='0';tile_to_GA<=rfvtgbyh;tail_done<='0';when zxcvbnma=>tile_coord<=zaqwsxed;set_tile<='1';tile_to_GA<=rfvtgbyh;tail_done<='0';when sdfghjkl=>tile_coord<=vfrcdexs;set_tile<='1';tile_to_GA<=wsxedcrf;tail_done<='0';when wertyuio=>tile_coord<=edcrfvtg;set_tile<='0';tile_to_GA<=rfvtgbyh;tail_done<='1';end case;end process;end zqxwvuts;
\ No newline at end of file
diff --git a/source/init.vhd b/source/init.vhd
new file mode 100644
index 0000000..c777a1a
--- /dev/null
+++ b/source/init.vhd
@@ -0,0 +1 @@
+library IEEE;use IEEE.STD_LOGIC_1164.all;use IEEE.NUMERIC_STD.all;use work.local_types.all;entity init is port(clk:in std_ulogic;start_init:in std_ulogic;init_done:out std_ulogic;reset:in std_ulogic;tile_coord:out coordinate_t;tile_from_GA:in game_tile;tile_to_GA:out game_tile;set_tile:out std_ulogic);end init;architecture qxmblywz of init is type cktwlrpq is(zkprqtmf,vhwlnjcd,btfxqgry,jmsdwcpl,nvykxbaj);signal plokijuh,mnbvcxza:cktwlrpq;constant qazwsxed:coordinate_t:=(x=>(others=>'0'),y=>(others=>'0'));constant plmoknji:game_tile:=(is_tail=>'0',is_head=>'0',is_apple=>'0',is_body=>'0',parent=>qazwsxed);constant okmijnuy:coordinate_t:=(x=>"000100",y=>"000100");constant qawsedrf:coordinate_t:=(x=>"000010",y=>"000010");constant tgbfvcde:coordinate_t:=(x=>"000010",y=>"000011");constant xdcftvgy:game_tile:=(is_tail=>'0',is_head=>'0',is_apple=>'1',is_body=>'0',parent=>qazwsxed);constant rfvtgbyh:game_tile:=(is_tail=>'0',is_head=>'1',is_apple=>'0',is_body=>'0',parent=>qazwsxed);constant edcrfvtg:game_tile:=(is_tail=>'1',is_head=>'0',is_apple=>'0',is_body=>'0',parent=>qawsedrf);begin qazxswed:process(clk)begin if rising_edge(clk)then if reset='1'then plokijuh<=zkprqtmf;else plokijuh<=mnbvcxza;end if;end if;end process qazxswed;wqscedrf:process(plokijuh,start_init)begin case plokijuh is when zkprqtmf=>if start_init='1'then mnbvcxza<=btfxqgry;else mnbvcxza<=zkprqtmf;end if;when btfxqgry=>mnbvcxza<=vhwlnjcd;when vhwlnjcd=>mnbvcxza<=jmsdwcpl;when jmsdwcpl=>mnbvcxza<=nvykxbaj;when nvykxbaj=>mnbvcxza<=zkprqtmf;end case;end process wqscedrf;vfredcws:process(plokijuh)begin case plokijuh is when zkprqtmf=>tile_coord<=qazwsxed;set_tile<='0';tile_to_GA<=plmoknji;init_done<='0';when btfxqgry=>tile_coord<=qawsedrf;set_tile<='1';tile_to_GA<=rfvtgbyh;init_done<='0';when vhwlnjcd=>tile_coord<=tgbfvcde;set_tile<='1';tile_to_GA<=edcrfvtg;init_done<='0';when jmsdwcpl=>tile_coord<=okmijnuy;set_tile<='1';tile_to_GA<=xdcftvgy;init_done<='0';when nvykxbaj=>tile_coord<=qazwsxed;set_tile<='0';tile_to_GA<=plmoknji;init_done<='1';end case;end process vfredcws;end qxmblywz;
\ No newline at end of file
diff --git a/source/reset.vhd b/source/reset.vhd
new file mode 100644
index 0000000..f324179
--- /dev/null
+++ b/source/reset.vhd
@@ -0,0 +1 @@
+library IEEE;use IEEE.STD_LOGIC_1164.all;use IEEE.NUMERIC_STD.all;use work.local_types.all;entity reset is port(clk:in std_ulogic;start_reset:in std_ulogic;reset_done:out std_ulogic;reset:in std_ulogic;tile_coord:out coordinate_t;tile_from_GA:in game_tile;tile_to_GA:out game_tile;set_tile:out std_ulogic);end reset;architecture xqplmnjb of reset is type ztrqwfld is (mnbvcxzq,xcvbnmqw,wertyuio,sdfghjkl);signal asdfghjk,qwertyui:ztrqwfld;signal zxcvbnml:std_ulogic_vector(11 downto 0):=(others=>'0');constant poiuytre:coordinate_t:=(x=>(others=>'0'),y=>(others=>'0'));constant lkjhgfds:game_tile:=(is_tail=>'0',is_head=>'0',is_apple=>'0',is_body=>'0',parent=>poiuytre);begin plokijuh:process(clk) begin if rising_edge(clk) then if reset='1' then asdfghjk<=mnbvcxzq;else if qwertyui=xcvbnmqw then zxcvbnml<=(others=>'0');elsif qwertyui=wertyuio then zxcvbnml<=std_ulogic_vector(to_unsigned(to_integer(unsigned(zxcvbnml))+1,12));end if;asdfghjk<=qwertyui;end if;end if;end process plokijuh;mkoijnub:process(asdfghjk,start_reset) begin case asdfghjk is when mnbvcxzq=>if start_reset='1' then qwertyui<=xcvbnmqw;else qwertyui<=mnbvcxzq;end if;when xcvbnmqw=>qwertyui<=wertyuio;when wertyuio=>if zxcvbnml="111111111111" then qwertyui<=sdfghjkl;else qwertyui<=wertyuio;end if;when sdfghjkl=>qwertyui<=mnbvcxzq;end case;end process mkoijnub;qaszxdew:process(asdfghjk) begin case asdfghjk is when mnbvcxzq=>tile_coord<=poiuytre;set_tile<='0';tile_to_GA<=lkjhgfds;reset_done<='0';when xcvbnmqw=>tile_coord.x<=zxcvbnml(11 downto 6);tile_coord.y<=zxcvbnml(5 downto 0);set_tile<='1';tile_to_GA<=lkjhgfds;reset_done<='0';when wertyuio=>tile_coord.x<=zxcvbnml(11 downto 6);tile_coord.y<=zxcvbnml(5 downto 0);set_tile<='1';tile_to_GA<=lkjhgfds;reset_done<='0';when sdfghjkl=>tile_coord<=poiuytre;set_tile<='0';tile_to_GA<=lkjhgfds;reset_done<='1';end case;end process qaszxdew;end xqplmnjb;