Tengo un tablero simple con 6 botones, que consta de 3 columnas y 2 filas. Me gustaría detectar el botón presionado. Mi código de abajo funciona con este fsm:
scan_fsm : process (reset, clk)
begin -- process key_scanner
if reset = '1' then
Send <= '0';
fsm_state <= start;
scannel_val <= "0000";
elsif clk'event and clk = '1' then
if state_inc = '1' then
scan_complete <= '0';
case fsm_state is
when start =>
Send <= '0';
scannel_val <= "0000";
my_switch <= "001";
fsm_state <= state1;
when state1 =>
case bcd_val is
when "01" =>
Send <= '1';
scannel_val <= "0001";
when "10" =>
Send <= '1';
scannel_val <= "0010"; -- Value 2
when others =>
scannel_val <= "0000";
Send <= '0';
end case;
my_switch <= "010";
fsm_state <= state2;
when state2 =>
case bcd_val is
when "01" =>
Send <= '1';
scannel_val <= "0011";
when "10" =>
Send <= '1';
scannel_val <= x"0100"; -- Value 4
when others =>
scannel_val <= "0000";
Send <= '0';
end case;
my_switch <= "100";
fsm_state <= state3;
when state3 =>
case bcd_val is
when "01" =>
Send <= '1';
scannel_val <= "0101";
when "10" =>
Send <= '1';
scannel_val <= "0110";
when others =>
scannel_val <= "0000";
Send <= '0';
end case;
my_switch <= "001";
fsm_state <= state1;
scan_complete <= '1';
when others => scannel_val <= "0000";
end case;
end if;
end if;
end process scan_fsm;
Tengo 4 estados, inicio y un estado para cada columna. Me gustaría mejorar mi tabla y evitar fallos. Me gustaría agregar valores como si al presionar 2 botones al mismo tiempo, debería obtener el primer valor que alcanzó pocos milisegundos o nanosegundos antes que el otro. También me gustaría evitar que se lea un segundo valor o un tercero cuando ya se está presionando un botón.
Entonces, no importa cuántos botones se presionen, solo se debe leer un valor. Pensé en agregar un quinto estado, inactivo, cuando esto ocurre, pero entonces, ¿cómo puedo salir del inactivo?
En lugar de inactivo, también puedo cambiar al estado "inicio", pero esto haría que la señal send
"0" sea falsa si ya se presiona un botón. Además, ¿cuántos procesos hay en este FSM? ¿Qué es un proceso en VHDL? ¿Es 3? resetear, clk y state_inc? statce_inc se convierte en "1" cada 200Hz con la ayuda de un contador. Agregué un código de rebote que encontré en Internet, pero no ayuda :( ¿Alguien tiene una sugerencia de rebote?
Otro problema, me gustaría deshacerme del estado start
en realidad, la única razón por la que lo tengo es porque debo asignar my_switch
a "001"
antes de state1
. En mi primera implementación, estaba asignando my_switch
a "001"
en state1
y "010"
en state2
y "100"
en state3
. En esta implementación ya que mi teclado es
______
|1|2|3|
|4|5|6|
Cuando presioné 2, se mostró 1 cuando presioné 3, se mostró 2. Estaba pensando en Cpp / Java pero estaba equivocado ... luego agregué un estado ficticio start
solo para configurar my_switch
antes de ingresar al escaneo real ... ¡Así que si puedo resolver esto también puedo guardar un estado! Las sugerencias son bienvenidas! Resolví esto al ingresar el primer escaneo sin un valor establecido. ¿Tienes mejores ideas?