2016-11-15 12 views
0

caseステートメントを使用してVHDLを使用したUMLステートダイアグラムを実装しています。 do/およびexitの状態アクティビティは実装が簡単です。しかし、誰も効率的な方法でentry州の活動を実装する方法を知っていますか?/VHDLを使用したUMLステートダイアグラムのエントリ

私はname州の前にname_entryと呼ばれる余分な状態を追加するか、1回だけ実行するフラグを追加することを考えました。しかし、私はこれらのオプションを嫌います...

+0

あなたの言ったことから何をしたいのか分かりません。 UMLはステートマシンの表現に過ぎないため、開発しようとしているもの(機能的に言​​えば)に何のヒントも与えません。 –

+0

@ A.Kieffer/Entryは、状態に遷移した(アクションに似ている)ときに一度だけ実行されます。/Doは実装が簡単です。ステートマシンがプロセス内にあり、遷移が発生するまでコードが実行されるため、/ exitを実装することができます。しかし、一度実行するコードを実装する方法はまだ分かりません...効率的に – ferdepe

答えて

0

私がうまくいけば、VHDLでFSMを記述したいだけですか? はそうあなたが最初に必要TYPE

TYPE my_state_type IS (s0, s1, s2); 

にすべてのあなたの可能な状態を宣言しないためにはその後、型としてmy_state_typeをとる信号を作成する必要があります。

SIGNAL my_state : my_state_type := s0; -- for initialisation 

次に、あなたのプロセスでは、あなたは確かにあなたの状態のそれぞれについてCASEを必要としています。

fsm : PROCESS (clk, rst) 
BEGIN 
    IF (rst = '1') THEN 
     my_state <= s0 ; -- reset value 
    ELSIF (rising_edge(clk)) THEN 
     CASE my_state IS 

      WHEN s0 => output <= '1'; -- do 
         IF (input = '1') THEN -- condition to enter s1 
         my_state <= s1; 
         ELSE     -- condition to stay in s0 
         my_state <= s0; 
         END IF; 

      WHEN s1 => my_state <= s2; -- stay in s1 for only one clk cycle 

      WHEN s2 => my_state <= s0; -- stay in s2 for only one clk cycle 

      WHEN OTHERS => my_state <= s0; 

     END CASE; 
    END IF; 
END PROCESS; 

私はそれがあなたの質問に答えた、または少なくとも助けてくれることを願っています。

+0

あなたの状態変数が列挙型の場合、 'when others'節は必要ありません。 –

+0

確かに、ちょうどその場合に「その他」のケースを指定するのがルーチンになった –

+0

Ok! 'output <= '1'を使ってUMLステートチャートに_do/_を書くときだけ置くと、' s0'のif文で_exit/_を実装することができます。しかし、_/entry_はどこですか? 私は[that](http://www.barrgroup.com/images/articles/IntroHierarchicalStateMachines02UmlStateDiagram.gif)を探していて、一般的なFSMをVHDLに実装する方法は探していません。ありがとう! – ferdepe

関連する問題