FSM con contador

2

Tengo un diagrama de estado que consta de 3 estados y en el reinicio llega al estado s0, luego, si ocurre un evento en la señal de inicio, pasa al estado 2 y está allí durante 15 ciclos de reloj, y luego pasa al estado 3 y luego de vuelta al estado s0. Mi pregunta es que al codificar VHDL, ¿cómo podría hacer el retraso de 15 horas del estado 2? Sé que es necesario contar con un contador, pero no me queda claro cómo hacer la codificación VHDL. ¿Alguien por favor me puede ayudar? Gracias

    
pregunta user83736

2 respuestas

2

Suponiendo que no estás haciendo el método "teóricamente puro" de programar un FSM en VHDL, haz algo simple como esto:

fsmCount: process(clk, reset)
    begin
        if reset = '1' then
            --Reset code here

        elsif(clk'event and clk = '1') then    --on the rising edge of the clock

            case state is
                when s0 =>
                    --VHDL for s0 

                when s1 =>  
                    --VHDL for s0 

                when s2 =>
                    s_counter <= s_counter + 1;    --increment a counting signal
                    if s_counter = CLOCK_DELAY_15_CONSTANT then
                         --do what you want here when you hit your delay
                         s_counter <= '0';
                    else
                         state <= s2;        --if your delay isn't reached, stay in this state
                    end if;
            end case;
    end if;
end process fsmCount;

Solo estoy respondiendo al estado: parte de s2, te dejaré manejar el resto de la lógica que necesitas en el resto del FSM.

También deberá declarar algunas señales y constantes en la sección de arquitectura:

La variable "estado" es una enumeración de los diferentes estados que necesita (es decir, s0, s1, s2).

Entonces "s_counter" es una señal de algunos bits de ancho que declara.

"CLOCK_DELAY_15_CONSTANT" es un valor constante que usted decide que es necesario para su retraso deseado. Lo que parece que son solo 15 ciclos de reloj, por lo que solo son 15 en ese caso.

    
respondido por el Nick Williams
2

Este es un ejemplo, sobre cómo un FSM puede controlar un contador. Si se ingresa el segundo estado, el contador cuenta hasta 15, luego el FSM pasa al siguiente estado. El contador se restablece en todos los demás estados.

Declaraciones:

type T_STATE is (ST_IDLE, ST_SECOND, ST_FINISHED);

signal State        : T_STATE    := ST_IDLE;
signal NextState    : T_STATE;

signal Counter_en   : STD_LOGIC;
signal Counter_us   : UNSIGNED(3 downto 0)    := (others => '0');

Lógica:

process(Clock)
begin
  if rising_edge(Clock) then
    State  <= NextState;

    if (Counter_en = '0') then
      Counter_us <= (others => '0');
    else
      Counter_us <= Counter_us + 1;
    end if;
  end if;
end process;

process(State, Input1, Counter_us)
begin
  -- default assignments
  NextState     <= State;
  Counter_en    <= '0';

  case State is
    when ST_IDLE =>
      -- do something

    when ST_SECOND =>
      Counter_en    <= '1';

      if (Counter_us = 15) then
        NextState   <= ST_FINISHED;
      end if;

    when ST_FINISHED =>
      -- do something

  end case;
end process;

Es solo un ejemplo posible de cómo pueden interactuar las FSM / contadores.

    
respondido por el Paebbels

Lea otras preguntas en las etiquetas