¿Cómo puede retrasar su fsm para permanecer en uno de los estados durante aproximadamente un ciclo de 5?

0

Si quiero demorar mi FSM para permanecer en un estado durante 5 ciclos, ¿cómo podría hacerlo? Supongo que debería usar un contador, pero ¿cuál es el código VHDL? ¿Cómo podría usar un contador dentro de la declaración del proceso?

Lo siento si la pregunta es simple, estoy aprendiendo codificación VHDL.

Estoy usando esta codificación, pero no está compilando:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;

entity state3_fsm is
  port (
    clk_H  : in std_logic;
    res_H  : in std_logic;
    start  : in std_logic;
    done_H : in std_logic);

end entity state3_fsm;


architecture arc of state3_fsm is

  type statetype is (s0, s1, s2);
  signal pr_state, nx_state : statetype;
  signal count              : std_logic_vector(3 downto 0);

begin
  ff_pro : process (clk_H, res_H)

  begin
    if (res_H = '1') then
      pr_state <= s0;
    elsif (clk_H'event and clk_H = '1') then
      pr_state <= nx_state;
    end if;
  end process ff_pro;

  com_pro : process (start, count, pr_state, done_H)
  begin
    case pr_state is

      when s0 =>
        if (start = '1') then
          nx_state <= s1;
        else nx_state <= s0;
        end if;


      when s1 =>
        count <= count + 1;
        if (count = 5) then
          nx_state <= s2;
          count    <= "000";
        else
          nx_state <= s2;

        end if;

      when s2 =>
        if done_H = '1' then
          nx_state <= s0;
        else nx_state <= s2;
        end if;

      when others =>
        nx_state <= s0;

    end case;
  end process com_pro;

end architecture arc;
    
pregunta user5345763

2 respuestas

1

Lo que tienes está a la izquierda, y lo que quieres está a la derecha, suponiendo que quieres un retraso entre State 2 y State 3 . Simplemente puede agregar un nuevo estado que maneje el retraso.

Algunos pseudo códigos para el estado de retraso se implementarían de la siguiente manera:

if(clk)
delay_counter <= delay_counter + 1'b1;
if(delay_counter ==5)
begin
mode <= state3
delay_counter <= 0;
end

Si clk ocurre cada 50 ns, acaba de crear un retraso de 250 ns. Estás atrapado en este estado hasta que te encuentras con la demora, luego saltas al siguiente estado que deseas.

EDITAR: Solo vuelve a leer tu pregunta y tal vez entendí mal, pero el concepto es el mismo de todos modos. Si quiere que Estado 3 ocurra 5 veces, pondría un bloque en Estado 3 que apunta a Estado 4 en función de una variable que cuenta hasta 5, y State 4 simplemente te envía de vuelta a State 3 o State X en función de esa variable.

    
respondido por el ACD
0

Un FSM puro no puede "contar" nada en los estados. Un contador es un FSM por sí mismo. Para retrasar los ciclos de N en un estado específico, deberá expandirlo a los subestados de N+1 , lo que "contará" las transiciones de retardo. Por supuesto, puede comprometer la "pureza" del FSM y agregar un contador como usted lo menciona. Puedes encontrar un montón de ejemplos del código en línea. Aquí hay un ejemplo .

    
respondido por el Eugene Sh.

Lea otras preguntas en las etiquetas