переходы между состояниями в зависимости от входного события VHDL

Я новичок в VHDL. В настоящее время я работаю над FSM и хочу, чтобы мой конечный автомат менял состояния только при изменении моего ввода. Какие изменения я должен внести в следующий код?

entity fsm is
    Port ( clk : in STD_LOGIC;
           reset : in STD_LOGIC;
           x_in : in STD_LOGIC;                         -- input Bitstream  
           y_out : out STD_LOGIC_VECTOR (1 downto 0));  -- Encoded output
end fsm;

-----------------------------------------------------
architecture Behavioral of fsm is

  -- Building an Enumerated type for the state machine
  type state_type is (s_idle,s1,s2,s3,s4);  -- constraint length = 3, Hence number of Regs = 2 therefore Number of states = 4
  signal state, next_state: state_type ;    -- Registers to hold the Present and next states

begin
-----------------------------------------------------
  process1: process (reset, clk)             --  Sequential Logic Selection process:
     begin

          if (reset ='1') then  
              state <=s_idle;         
          elsif (clk='1' and x_in'Event) then     
              state <= next_state;  
          end if;  
-----------------------------------------------------         
  end process process1;

person Engr Ali    schedule 30.12.2016    source источник
comment
Я отредактировал ваш вопрос, но не смог понять его среднюю часть. Возможно, вы захотите переформатировать его.   -  person PM 77-1    schedule 30.12.2016


Ответы (2)


Предполагая, что вы хотите изменить состояние FSM, когда -->

  1. clk высокий
  2. Значение X_in изменяется

Кроме того, я предполагаю, что ваша переменная next_state является некоторой комбинационной функцией state, которую вы не упомянули. Достаточно одного изменения: добавьте X_in в список чувствительности вашего процесса.

-----------------------------------------------------
  process1: process (X_in, reset, clk)             --  Sequential Logic Selection process:
     begin

          if (reset ='1') then  
              state <=s_idle;         
          elsif (clk='1' and x_in'Event) then     
              state <= next_state;  
          end if;  
-----------------------------------------------------         
  end process process1;
person martianwars    schedule 30.12.2016
comment
Это не будет синтезом; он не рассматривает ни clk, ни x_in как правильный тактовый сигнал. - person user_1818839; 31.12.2016
comment
Это своего рода ошибка, которую может предотвратить функцияrising_edge(). - person user_1818839; 31.12.2016
comment
Кажется, он не хочет rising_edge зависимости - person martianwars; 31.12.2016
comment
В яблочко. Это ошибка. - person user_1818839; 31.12.2016

Предполагая, что вход x_in синхронизирован с clk, это будет делать то, что вы описываете:

 process1: process (reset, clk)
 begin

      if (reset ='1') then  
          state <=s_idle;         
      elsif (clk='1' and clk'Event) then
          x_in_prev <= x_in;
          if x_in_prev /= x_in then
              state <= next_state;
          end if;
      end if;
 end process process1;

Вам нужно определить сигнал x_in_prev в вашей архитектуре, чтобы это скомпилировалось.

person pc3e    schedule 02.01.2017