library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.numeric_std.all; entity image_generator is generic ( input_clk: integer ); port ( clk: in std_logic; x, y: in std_logic_vector(9 downto 0); ctrl_up: in std_logic; ctrl_down: in std_logic; rgb: out std_logic_vector(23 downto 0) ); end image_generator; architecture logic of image_generator is type glyph is array(0 to 7) of std_logic_vector(7 downto 0); constant emoji_grin: glyph := ( "00111100", "01000010", "10101001", "10101001", "10000101", "10111001", "01000010", "00111100" ); signal glyph_x: integer range 0 to 7; signal glyph_y: integer range 0 to 7; signal color: std_logic_vector(23 downto 0); signal color_index: integer range 0 to 2; begin glyph_x <= to_integer(unsigned(x(4 downto 1))); glyph_y <= to_integer(unsigned(y(4 downto 1))); process(clk) is variable last_up: std_logic; variable last_down: std_logic; constant debounce_max: integer := input_clk / 50; -- 20ms variable debounce: integer range 0 to debounce_max := 0; begin if rising_edge(clk) then if debounce = 0 then if ctrl_up = '1' and last_up = '0' then if color_index /= 2 then color_index <= color_index + 1; end if; debounce := debounce_max; end if; last_up := ctrl_up; if ctrl_down = '1' and last_down = '0' then if color_index /= 0 then color_index <= color_index - 1; end if; debounce := debounce_max; end if; last_down := ctrl_down; else debounce := debounce - 1; end if; end if; end process; with color_index select color <= "111111111111111111111111" when 0, "000000000000000011111111" when 1, "000101001111111110110100" when 2; -- actually currently BRG rgb <= color when x(4) = y(4) and emoji_grin(glyph_y)(glyph_x) = '1' else "000000000000000000000000"; end logic;