2016-12-30 12 views
-1

私はVHDLの初心者です。私は現在FSMに取り組んでおり、自分の入力が変化したときにのみ状態マシンの状態を変更したい。次のコードでどのような変更を行う必要がありますか? >状態遷移は入力イベントに依存VHDL

  1. clk
  2. X_inの値はまた

を変更、私はよ高いです - が

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の変化状態を作りたいと仮定すると、あなたのnext_state変数は、あなたが言及していないstateのいくつかの組み合わせ関数であるとします。変更を1回だけすれば十分ですが、X_inをプロセス感度リストに追加してください。

これはあなたが記述何だろう、 x_in入力は clkに同期していると仮定すると
----------------------------------------------------- 
    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

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信号を定義する必要があります。

関連する問題