case
ステートメントを使用してVHDLを使用したUMLステートダイアグラムを実装しています。 do/
およびexit
の状態アクティビティは実装が簡単です。しかし、誰も効率的な方法でentry
州の活動を実装する方法を知っていますか?/VHDLを使用したUMLステートダイアグラムのエントリ
私はname
州の前にname_entry
と呼ばれる余分な状態を追加するか、1回だけ実行するフラグを追加することを考えました。しかし、私はこれらのオプションを嫌います...
case
ステートメントを使用してVHDLを使用したUMLステートダイアグラムを実装しています。 do/
およびexit
の状態アクティビティは実装が簡単です。しかし、誰も効率的な方法でentry
州の活動を実装する方法を知っていますか?/VHDLを使用したUMLステートダイアグラムのエントリ
私はname
州の前にname_entry
と呼ばれる余分な状態を追加するか、1回だけ実行するフラグを追加することを考えました。しかし、私はこれらのオプションを嫌います...
私がうまくいけば、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;
私はそれがあなたの質問に答えた、または少なくとも助けてくれることを願っています。
あなたの状態変数が列挙型の場合、 'when others'節は必要ありません。 –
確かに、ちょうどその場合に「その他」のケースを指定するのがルーチンになった –
Ok! 'output <= '1'を使ってUMLステートチャートに_do/_を書くときだけ置くと、' s0'のif文で_exit/_を実装することができます。しかし、_/entry_はどこですか? 私は[that](http://www.barrgroup.com/images/articles/IntroHierarchicalStateMachines02UmlStateDiagram.gif)を探していて、一般的なFSMをVHDLに実装する方法は探していません。ありがとう! – ferdepe
あなたの言ったことから何をしたいのか分かりません。 UMLはステートマシンの表現に過ぎないため、開発しようとしているもの(機能的に言えば)に何のヒントも与えません。 –
@ A.Kieffer/Entryは、状態に遷移した(アクションに似ている)ときに一度だけ実行されます。/Doは実装が簡単です。ステートマシンがプロセス内にあり、遷移が発生するまでコードが実行されるため、/ exitを実装することができます。しかし、一度実行するコードを実装する方法はまだ分かりません...効率的に – ferdepe