Мне нужно закодировать в vhdl кодировщик клавиатуры. Я думал сделать это с 4 состояниями. когда в столбце n1 сканируйте строку 1, строку 2, строку 2, строку 4. По моему мнению, 4 таких состояний должно быть достаточно, но пример, который я нашел в Интернете, делает это с 8 состояниями:
key_scanner_sm : process (clk)
begin -- process key_scanner
if clk'event and clk = '1' then
if state_inc = '1' then
-- reset scan_complete
scan_complete <= '0';
case key_state is
when pulse_row_1 =>
key_read <= (others => '0');
key_row <= "0001";
key_state <= read_row_1;
when read_row_1 =>
case key_col is
when "0001" => key_read <= X"31"; -- 1
when "0010" => key_read <= X"32"; -- 2
when "0100" => key_read <= X"33"; -- 3
when "1000" => key_read <= X"41"; -- A
when others => null;
end case;
key_state <= pulse_row_2;
when pulse_row_2 =>
key_row <= "0010";
key_state <= read_row_2;
when read_row_2 =>
case key_col is
when "0001" => key_read <= X"34"; -- 4
when "0010" => key_read <= X"35"; -- 5
when "0100" => key_read <= X"36"; -- 6
when "1000" => key_read <= X"42"; -- B
when others => null;
end case;
key_state <= pulse_row_3;
when pulse_row_3 =>
key_row <= "0100";
key_state <= read_row_3;
when read_row_3 =>
case key_col is
when "0001" => key_read <= X"37"; -- 7
when "0010" => key_read <= X"38"; -- 8
when "0100" => key_read <= X"39"; -- 9
when "1000" => key_read <= X"43"; -- C
when others => null;
end case;
key_state <= pulse_row_4;
when pulse_row_4 =>
key_row <= "1000";
key_state <= read_row_4;
when read_row_4 =>
case key_col is
when "0001" => key_read <= X"2A"; -- *
when "0010" => key_read <= X"30"; -- 0
when "0100" => key_read <= X"23"; -- #
when "1000" => key_read <= X"44"; -- D
when others => null;
end case;
key_state <= pulse_row_1;
scan_complete <= '1';
when others => null;
end case;
end if;
end if;
end process key_scanner_sm;
Есть ли веская причина для этого, кто-нибудь знает?