2016-12-30 6 views
-1

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

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; 
+0

Я отредактировал ваш вопрос, но не смог понять смысл средней части. Возможно, вы захотите переформатировать его. –

ответ

0

Предполагая, что вы хотите сделать изменения состояния 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; 
+2

Это не будет синтезироваться; он не рассматривает ни clk, ни x_in как правильный тактовый сигнал. –

+0

Будет ли это работать, если я удалю чувствительность к clk? – martianwars

+0

Это своего рода ошибка, которую может предотвратить функция rising_edge(). –

0

Предполагая, что 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 сигнал в вашей архитектуре это скомпилировать.