diff --git a/game_of_life_v2/game_of_life_v2.srcs/constrs_1/new/constraints.xdc b/game_of_life_v2/game_of_life_v2.srcs/constrs_1/new/constraints.xdc index bdc8595b4106d6eaec691c8827a68b49c946bc3e..261a2df429283d0777b05a19ee3afc74c04ee2c0 100644 --- a/game_of_life_v2/game_of_life_v2.srcs/constrs_1/new/constraints.xdc +++ b/game_of_life_v2/game_of_life_v2.srcs/constrs_1/new/constraints.xdc @@ -15,11 +15,11 @@ set_property PACKAGE_PIN V19 [get_ports {frame[10]}]; # "VGA-R3" set_property PACKAGE_PIN V18 [get_ports {frame[11]}]; # "VGA-R4" set_property PACKAGE_PIN Y19 [get_ports {Vsync}]; # "VGA-VS" -#set_property PACKAGE_PIN P16 [get_ports {BTNC}]; # "BTNC" -#set_property PACKAGE_PIN R16 [get_ports {BTND}]; # "BTND" -#set_property PACKAGE_PIN N15 [get_ports {BTNL}]; # "BTNL" -#set_property PACKAGE_PIN R18 [get_ports {BTNR}]; # "BTNR" -#set_property PACKAGE_PIN T18 [get_ports {BTNU}]; # "BTNU" +set_property PACKAGE_PIN P16 [get_ports {set_cell}]; # "BTNC" +set_property PACKAGE_PIN R16 [get_ports {move_down}]; # "BTND" +set_property PACKAGE_PIN N15 [get_ports {move_left}]; # "BTNL" +set_property PACKAGE_PIN R18 [get_ports {move_right}]; # "BTNR" +set_property PACKAGE_PIN T18 [get_ports {move_up}]; # "BTNU" set_property PACKAGE_PIN F22 [get_ports {switch_mode}]; # "SW0" diff --git a/game_of_life_v2/game_of_life_v2.srcs/sources_1/new/game_of_life.vhd b/game_of_life_v2/game_of_life_v2.srcs/sources_1/new/game_of_life.vhd index c3739fbdbf501dd5083f0de20fe6777216fa06ff..86c528b4bbf843795f16a9f33788623339a2fbd7 100644 --- a/game_of_life_v2/game_of_life_v2.srcs/sources_1/new/game_of_life.vhd +++ b/game_of_life_v2/game_of_life_v2.srcs/sources_1/new/game_of_life.vhd @@ -82,8 +82,8 @@ signal Hsync_sig, Vsync_sig : std_logic; signal frame_sig : std_logic_vector(11 downto 0); -- simulation processers -signal shift_register_top : std_logic_vector(0 to cell_number-1); -signal shift_register_middle : std_logic_vector(0 to cell_number-1); +signal shift_register_top : std_logic_vector(0 to cell_number+1); +signal shift_register_middle : std_logic_vector(0 to cell_number+1); signal actual_register : std_logic_vector(0 to 0); --signal copy_shift_register_top : std_logic_vector(0 to cell_number-1); @@ -131,6 +131,8 @@ begin neighbours_count <= (others => '0'); frame_counter <= (others => '0'); + --cursor_pos_x <= to_unsigned(8,10); + --cursor_pos_y <= to_unsigned(8,10); cursor_pos_x <= (others => '0'); cursor_pos_y <= (others => '0'); prev_move_left <= move_left; @@ -163,50 +165,51 @@ begin end if; -- handle shift registers - --if switch_mode = '1' and frame_counter = 0 and horizontal_counter(2 downto 0) = 0 and horizontal_counter(9 downto 3) < cell_number+2 and vertical_counter(2 downto 0) = 0 and vertical_counter(9 downto 3) < cell_number+2 then - if switch_mode = '1' and frame_counter = 0 and horizontal_counter(2 downto 0) = 0 and horizontal_counter(9 downto 3) < cell_number and vertical_counter(2 downto 0) = 0 and vertical_counter(9 downto 3) < cell_number then - shift_register_top <= shift_register_top(1 to cell_number-1) & shift_register_middle(0); + if switch_mode = '1' and frame_counter = 0 and horizontal_counter(2 downto 0) = 0 and horizontal_counter(9 downto 3) < cell_number+2 and vertical_counter(2 downto 0) = 0 and vertical_counter(9 downto 3) < cell_number+2 then + --if switch_mode = '1' and frame_counter = 0 and horizontal_counter(2 downto 0) = 0 and horizontal_counter(9 downto 3) < cell_number and vertical_counter(2 downto 0) = 0 and vertical_counter(9 downto 3) < cell_number then + shift_register_top <= shift_register_top(1 to cell_number+1) & shift_register_middle(0); - if horizontal_counter(9 downto 3) /= 0 and horizontal_counter(9 downto 3) < cell_number-1 and vertical_counter(9 downto 3) /= 0 and vertical_counter(9 downto 3) < cell_number-1 then + if horizontal_counter(9 downto 3) /= 0 and horizontal_counter(9 downto 3) < cell_number+1 and vertical_counter(9 downto 3) /= 0 and vertical_counter(9 downto 3) < cell_number+1 then --if horizontal_counter(9 downto 3) < cell_number and vertical_counter(9 downto 3) < cell_number then --copy_shift_register_top <= shift_register_top(1 to cell_number-1) & shift_register_middle(0); - shift_register_middle <= shift_register_middle(1 to cell_number-1) & actual_register; + shift_register_middle <= shift_register_middle(1 to cell_number+1) & actual_register; --copy_shift_register_middle <= shift_register_middle(1 to cell_number-1) & actual_register; neighbours <= neighbours(3 to 8) & shift_register_top(0) & shift_register_middle(0) & actual_register; neighbours_count <= neighbours_count - unsigned(neighbours(0 to 0)) - unsigned(neighbours(1 to 1)) - unsigned(neighbours(2 to 2)) + unsigned(shift_register_top(0 to 0)) + unsigned(shift_register_middle(0 to 0)) + unsigned(actual_register); - actual_register(0) <= cells(to_integer((vertical_counter(9 downto 3))* to_unsigned(cell_number,8) + horizontal_counter(9 downto 3))); + actual_register(0) <= cells(to_integer((vertical_counter(9 downto 3)-1)* to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-1)); --copy_actual_register(0) <= cells(to_integer((vertical_counter(9 downto 3))* to_unsigned(cell_number,8) + horizontal_counter(9 downto 3))); else - shift_register_middle <= shift_register_middle(1 to cell_number-1) & actual_register; + shift_register_middle <= shift_register_middle(1 to cell_number+1) & actual_register; neighbours <= neighbours(3 to 8) & shift_register_top(0) & shift_register_middle(0) & actual_register; -- left top corner - if horizontal_counter(9 downto 3) = 0 and vertical_counter(9 downto 3) = 0 then - neighbours_count <= neighbours_count + unsigned(neighbours(8 to 8)) + unsigned(shift_register_middle(0 to 0)) + unsigned(actual_register); + --if horizontal_counter(9 downto 3) = 0 and vertical_counter(9 downto 3) = 0 then + -- neighbours_count <= neighbours_count + unsigned(neighbours(8 to 8)) + unsigned(shift_register_middle(0 to 0)) + unsigned(actual_register); -- right top corner - elsif horizontal_counter(9 downto 3) = cell_number-1 and vertical_counter(9 downto 3) = 0 then - neighbours_count <= neighbours_count - unsigned(neighbours(1 to 1)) - unsigned(neighbours(2 to 2)); + --elsif horizontal_counter(9 downto 3) = cell_number-1 and vertical_counter(9 downto 3) = 0 then + -- neighbours_count <= neighbours_count - unsigned(neighbours(1 to 1)) - unsigned(neighbours(2 to 2)); -- left bottom corner - elsif horizontal_counter(9 downto 3) = 0 and vertical_counter(9 downto 3) = cell_number-1 then - neighbours_count <= neighbours_count - unsigned(neighbours(0 to 0)) - unsigned(neighbours(1 to 1)) - unsigned(neighbours(2 to 2)) - unsigned(neighbours(3 to 3)) - unsigned(neighbours(4 to 4)) - unsigned(neighbours(5 to 5)) + unsigned(neighbours(6 to 6)) + unsigned(neighbours(7 to 7)) + unsigned(neighbours(8 to 8)) + unsigned(shift_register_top(0 to 0)) + unsigned(shift_register_middle(0 to 0)); + --elsif horizontal_counter(9 downto 3) = 0 and vertical_counter(9 downto 3) = cell_number-1 then + -- neighbours_count <= neighbours_count - unsigned(neighbours(0 to 0)) - unsigned(neighbours(1 to 1)) - unsigned(neighbours(2 to 2)) - unsigned(neighbours(3 to 3)) - unsigned(neighbours(4 to 4)) - unsigned(neighbours(5 to 5)) + unsigned(neighbours(6 to 6)) + unsigned(neighbours(7 to 7)) + unsigned(neighbours(8 to 8)) + unsigned(shift_register_top(0 to 0)) + unsigned(shift_register_middle(0 to 0)); -- right bottom corner - elsif horizontal_counter(9 downto 3) = cell_number-1 and vertical_counter(9 downto 3) = cell_number-1 then - neighbours_count <= neighbours_count - unsigned(neighbours(0 to 0)) - unsigned(neighbours(1 to 1)); + --elsif horizontal_counter(9 downto 3) = cell_number-1 and vertical_counter(9 downto 3) = cell_number-1 then + -- neighbours_count <= neighbours_count - unsigned(neighbours(0 to 0)) - unsigned(neighbours(1 to 1)); -- top edge - elsif vertical_counter(9 downto 3) = 0 then - neighbours_count <= neighbours_count - unsigned(neighbours(1 to 1)) - unsigned(neighbours(2 to 2)) + unsigned(shift_register_middle(0 to 0)) + unsigned(actual_register); + --elsif vertical_counter(9 downto 3) = 0 then + -- neighbours_count <= neighbours_count - unsigned(neighbours(1 to 1)) - unsigned(neighbours(2 to 2)) + unsigned(shift_register_middle(0 to 0)) + unsigned(actual_register); -- left edge - elsif horizontal_counter(9 downto 3) = 0 then - neighbours_count <= neighbours_count - unsigned(neighbours(0 to 0)) - unsigned(neighbours(1 to 1)) - unsigned(neighbours(2 to 2)) - unsigned(neighbours(3 to 3)) - unsigned(neighbours(4 to 4)) - unsigned(neighbours(5 to 5)) + unsigned(neighbours(6 to 6)) + unsigned(neighbours(7 to 7)) + unsigned(neighbours(8 to 8)) + unsigned(shift_register_top(0 to 0)) + unsigned(shift_register_middle(0 to 0)) + unsigned(actual_register); + --elsif horizontal_counter(9 downto 3) = 0 then + -- neighbours_count <= neighbours_count - unsigned(neighbours(0 to 0)) - unsigned(neighbours(1 to 1)) - unsigned(neighbours(2 to 2)) - unsigned(neighbours(3 to 3)) - unsigned(neighbours(4 to 4)) - unsigned(neighbours(5 to 5)) + unsigned(neighbours(6 to 6)) + unsigned(neighbours(7 to 7)) + unsigned(neighbours(8 to 8)) + unsigned(shift_register_top(0 to 0)) + unsigned(shift_register_middle(0 to 0)) + unsigned(actual_register); -- right edge - elsif horizontal_counter(9 downto 3) = cell_number-1 then - neighbours_count <= neighbours_count - unsigned(neighbours(0 to 0)) - unsigned(neighbours(1 to 1)) - unsigned(neighbours(2 to 2)); + --elsif horizontal_counter(9 downto 3) = cell_number-1 then + -- neighbours_count <= neighbours_count - unsigned(neighbours(0 to 0)) - unsigned(neighbours(1 to 1)) - unsigned(neighbours(2 to 2)); -- bottom edge - elsif vertical_counter(9 downto 3) = cell_number-1 then - neighbours_count <= neighbours_count - unsigned(neighbours(0 to 0)) - unsigned(neighbours(1 to 1)) + unsigned(shift_register_top(0 to 0)) + unsigned(shift_register_middle(0 to 0)); - end if; + --elsif vertical_counter(9 downto 3) = cell_number-1 then + -- neighbours_count <= neighbours_count - unsigned(neighbours(0 to 0)) - unsigned(neighbours(1 to 1)) + unsigned(shift_register_top(0 to 0)) + unsigned(shift_register_middle(0 to 0)); + --end if; - actual_register(0) <= cells(to_integer((vertical_counter(9 downto 3))* to_unsigned(cell_number,8) + horizontal_counter(9 downto 3))); + neighbours_count <= neighbours_count - unsigned(neighbours(0 to 0)) - unsigned(neighbours(1 to 1)) - unsigned(neighbours(2 to 2)) + unsigned(shift_register_top(0 to 0)) + unsigned(shift_register_middle(0 to 0)) + unsigned(actual_register); + actual_register(0) <= '0';--cells(to_integer((vertical_counter(9 downto 3))* to_unsigned(cell_number,8) + horizontal_counter(9 downto 3))); end if; if vertical_counter(9 downto 3) >= 2 and horizontal_counter(9 downto 3) >= 2 then @@ -217,21 +220,26 @@ begin -- end if; --end loop; - if neighbours(4)='1' then - if neighbours_count = 3 or neighbours_count = 4 then - cells(to_integer((vertical_counter(9 downto 3)-1) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-3)) <= '1'; - cells_to_draw(to_integer((vertical_counter(9 downto 3)-1) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-3)) <= '1'; - else - cells(to_integer((vertical_counter(9 downto 3)-1) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-3)) <= '0'; - cells_to_draw(to_integer((vertical_counter(9 downto 3)-1) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-3)) <= '0'; - end if; + if horizontal_counter(9 downto 3) = 0 or horizontal_counter(9 downto 3) = cell_number+1 or vertical_counter(9 downto 3) = 0 or vertical_counter(9 downto 3) = cell_number+1 then + cells(to_integer((vertical_counter(9 downto 3)-2) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-4)) <= '0'; + cells_to_draw(to_integer((vertical_counter(9 downto 3)-2) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-4)) <= '0'; else - if neighbours_count = 3 then - cells(to_integer((vertical_counter(9 downto 3)-1) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-3)) <= '1'; - cells_to_draw(to_integer((vertical_counter(9 downto 3)-1) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-3)) <= '1'; + if neighbours(4)='1' then + if neighbours_count = 3 or neighbours_count = 4 then + cells(to_integer((vertical_counter(9 downto 3)-2) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-4)) <= '1'; + cells_to_draw(to_integer((vertical_counter(9 downto 3)-2) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-4)) <= '1'; + else + cells(to_integer((vertical_counter(9 downto 3)-2) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-4)) <= '0'; + cells_to_draw(to_integer((vertical_counter(9 downto 3)-2) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-4)) <= '0'; + end if; else - cells(to_integer((vertical_counter(9 downto 3)-1) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-3)) <= '0'; - cells_to_draw(to_integer((vertical_counter(9 downto 3)-1) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-3)) <= '0'; + if neighbours_count = 3 then + cells(to_integer((vertical_counter(9 downto 3)-2) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-4)) <= '1'; + cells_to_draw(to_integer((vertical_counter(9 downto 3)-2) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-4)) <= '1'; + else + cells(to_integer((vertical_counter(9 downto 3)-2) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-4)) <= '0'; + cells_to_draw(to_integer((vertical_counter(9 downto 3)-2) * to_unsigned(cell_number,8) + horizontal_counter(9 downto 3)-4)) <= '0'; + end if; end if; end if; @@ -242,15 +250,19 @@ begin -- moving with cursor if switch_mode = '0' then if prev_move_left = '0' and move_left = '1' and cursor_pos_x /= 0 then + --if prev_move_left = '0' and move_left = '1' and cursor_pos_x /= 8 then cursor_pos_x <= cursor_pos_x - 8; end if; if prev_move_right = '0' and move_right = '1' and cursor_pos_x /= (cell_number-1)*8 then + --if prev_move_right = '0' and move_right = '1' and cursor_pos_x /= (cell_number-2)*8 then cursor_pos_x <= cursor_pos_x + 8; end if; if prev_move_up = '0' and move_up = '1' and cursor_pos_y /= 0 then + --if prev_move_up = '0' and move_up = '1' and cursor_pos_y /= 8 then cursor_pos_y <= cursor_pos_y - 8; end if; if prev_move_down = '0' and move_down = '1' and cursor_pos_y /= (cell_number-1)*8 then + --if prev_move_down = '0' and move_down = '1' and cursor_pos_y /= (cell_number-2)*8 then cursor_pos_y <= cursor_pos_y + 8; end if;