Tengo un divisor de reloj y una máquina de estados como esta:
signal clk_200Hz : std_logic := '0';
signal counter : unsigned(19 downto 0) := x"00000";
begin
clkdiv : process (clk_100Mhz)
begin
if rising_edge(clk_100Mhz) then
if counter = x"00000" then
counter <= X"3D090"
clk_200Hz <= not clk_200Hz;
else
counter <= counter - 1;
end if;
end if;
end process clkdiv;
Estados:
type SM_STATES is (state_column_1, scan_col_1, state_column_2, scan_col_2,
state_column_3, scan_col_3);
signal my_state : SM_STATES := state_column_1;
-- By next state I mean something like this :
-- signal my_state, my_next_state : SM_STATES := state_column_1;
A continuación se muestra la máquina de estado:
scanner_sm : process (clk)
begin -- process key_scanner
if clk'event and clk = '1' then
if clk_200Hz = '1' then -- clock divider finished counting down
-- reset scan_complete
scan_complete <= '0';
case my_state is
when state_column_1 =>
scanned_val <= (others => '0');
original_col <= "110";
my_state <= scan_col_1;
when scan_col_1 =>
case bcd_val is
when "1110" =>
out_flag <= '1';
scanned_val <= "1100100"; -- 1 wrong
when "1101" =>
out_flag <= '1';
scanned_val <= "1100010"; -- 2 wrong
when others =>
out_flag <= '0';
scanned_val <= "0010000";
end case;
my_state <= state_column_2;
when state_column_2 =>
original_col <= "011";
my_state <= scan_col_2;
when scan_col_2 =>
case bcd_val is
when "1110" =>
out_flag <= '1';
scanned_val <= "1011011"; -- 5 wrong
when "1101" =>
out_flag <= '1';
scanned_val <= "1011111"; -- 6 wrong
when others =>
out_flag <= '0';
scanned_val <= "0000000";
end case;
my_state <= state_column_3;
when state_column_3 =>
original_col <= "101";
my_state <= scan_col_3;
when scan_col_3 => -- Reading S1 // The only working state
case bcd_val is
when "1110" =>
out_flag <= '1';
scanned_val <= "1100000"; -- 9/ 1
when "1101" =>
out_flag <= '1';
scanned_val <= "0111110"; -- X/ 2
when others =>
out_flag <= '0';
scanned_val <= "0000000";
end case;
my_state <= state_column_1; --
scan_complete <= '1'; --
when others => scanned_val <= "0000000";
end case;
end if;
end if;
end process scanner_sm;
Pregunta 1:
No tengo el siguiente estado y todo funciona bien, ¿lo necesito? ¿Para que sirve? Si todo funciona sin él, ¿por qué la gente lo necesita? Por siguiente estado me refiero a un segundo tipo de estado que contiene los mismos estados, comienza con my_state, final de cada estado, el estado cambia a my_next_state y después de cada reloj ascendente my_state <= my_next_state
. ¿Es esto mealy o moore? Según mi opinión ¿Cuántos procesos están involucrados en esto y cuáles son?
Pregunta 2:
La máquina de estado se activa solo si clk_200Hz
es "1" Tengo 6 estados, ¿un escaneo completo toma 1200 Hz o 200 Hz? Mi pregunta es: ¿voy a cada estado cada 200 Hz o en 200Hz se están escaneando los 6 estados? Si alguien puede elaborar estos eventos de reloj para la máquina de estado, ¡me alegraría!
Pregunta 3:
¿Cómo puedo controlar la duración de out_flag
? Me gustaría hacer que digamos 70 ms. Me gustaría aumentar su duración o tal vez disminuir. ¿Cómo puedo hacer esto? El valor predeterminado de out_flag
es cero.
¡Muchas gracias por leer!