¿La codificación VHDL para FSM no se está compilando?

1

Soy nuevo aquí. Estoy tratando de escribir códigos VHDL para mi FSM que tiene 3 estados: s0, s1, s2 En el reinicio, llega a S0 y luego, si inicio es, uno va a s2 y permanece allí durante 12 ciclos de reloj y luego pasa a s2 y luego en s2 si se hace = 1 vuelve a s0 nuevamente. Aquí está mi código VHDL para él, pero no está compilando.

¿Podría alguien ayudarme aquí?

Gracias

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.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 ;
  constant clock_delay_12 : integer :=12;
  signal s_counter : 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,s_counter,pr_state,done_H)
  begin
    case pr_state is
      when s0 => 
        if (start_H = '1') then 
          nx_state <= s1 ;
          else nx_state <= s0;
            end if;
      when s1 => 
        s_counter <= s_counter + 1 ;
        if s_counter = clock_delay_12  then 
          nx_state <= s2;
          s_counter <= '0';
          else nx_state <= s1;
        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

1 respuesta

3

Primero, en la línea 9 y 34, usa start , pero en el resto del código se usa como start_H .

En segundo lugar, consulte enlace para obtener soluciones para su operador + error no encontrado en la línea 43.

Tercero, debe asegurarse de que tanto s_counter como clock_delay_12 sean del mismo tipo para poder compararlos en la línea 44. Exactamente de qué tipo dependerá de su solución, el operador + no se encuentra.

Cuarto, línea 46, ' '0' es del tipo std_logic , s_counter es del tipo std_logic_vector(3 downto 0) , por lo que debería usar "0000" en su lugar. También puedes usar algo como (others => '0')

También puede haber otros errores, pero esto es lo que tengo.

También tengo algunos comentarios de estilo.

En la línea 29, usaría rising_edge(clk_H) en lugar de clk_H'event and clk_H = '1' .

Sus declaraciones if no necesitan paréntesis adicionales.

Como dijo Brian Drummond en un comentario, evitaría usar la máquina de estados de 2 procesos, prefiero el formulario de 1 proceso.

    
respondido por el mjcopple

Lea otras preguntas en las etiquetas