SFL例題/第10回
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[SFL例題]]
*ステートマシンの設計 [#a033e493]
LEDを制御するステートマシンの設計。
----
#contents
**ダウンロード [#bac31622]
&ref(sample10.tar.gz);
**覚えること [#db949268]
-stateの使い方
-gotoの使い方
***stateの使い方 [#e70c1c08]
SFLではステートマシンを作成する際に、各ステートの機能をそれぞれ定義することで作成することが可能である。~
stateという構文を使用することによって、ステート毎の機能を簡単に明示することが出来る。~
~
使用するためには、まずステージ定義内部で、state_nameを宣言する。名前は任意。~
また、ステージが起動されたときに、最初に遷移する初期状態をfirst_stateで宣言する必要がある。~
この例題では、
state_name first, start, one, two, three;
first_state first;
のようになっている。~
~
そして各ステートに対しての機能を
state one par {
...
}
のように定義していけばよい。
***gotoの使い方 [#s4358f64]
状態遷移の際には、SFLではgotoという機能が用意されている。~
例えば、
goto start;
といった様に、次に遷移させたい状態を指定することで、次のクロックにはその状態に処理を移すことが出来る。~
~
例題のサンプルソースを参考にされたい。
**サンプルソース[#s3abe640]
/* slot で使うカウンタの宣言 */
declare cnt10 {
output out<4>;
instrin clear;
instrin do;
instrout up;
}
/* ステートマシンを用いたスロットの回路 */
module slot {
instrin start; /* スタート用制御信号 */
instrin action; /* 回転開始やストップを制御する信号 */
output one_out<4>;
output two_out<4>;
output three_out<4>;
/* 3つのカウンタを宣言 */
cnt10 one, two, three;
/* ステージの名前と起動時の引数定義 */
stage_name main { task do(); }
par {
one_out = one.out;
two_out = two.out;
three_out = three.out;
}
/* start がアサートされたとき、main ステージを起動する */
instruct start generate main.do();
/* main ステージの定義 */
stage main {
state_name first, start, one, two, three; /* ステートの名前の定義 */
first_state first; /* 初期ステートの定義 */
/* first ステージ(値をクリアした状態)の定義 */
state first par {
one.clear();
two.clear();
three.clear();
any {
action : goto start; /* action がアサートされたとき次の状態へ */
else : goto first; /* 何も動作がないときは状態保持 */
}
}
/* start ステージ(全てが回っている状態)の定義 */
state start par {
one.do();
two.do();
three.do();
any {
action : goto one; /* action がアサートされたとき次の状態へ */
else : goto start; /* 何も動作がないときは状態保持 */
}
}
/* one ステージ(1つ目が止まっている状態)の定義 */
state one par {
two.do();
three.do();
any {
action : goto two; /* action がアサートされたとき次の状態へ */
else : goto one; /* 何も動作がないときは状態保持 */
}
}
/* two ステージ(2つ目までが止まっている状態)の定義 */
state two par {
three.do();
any {
action : goto three; /* action がアサートされたとき次の状態へ */
else : goto two; /* 何も動作がないときは状態保持 */
}
}
/* three ステージ(全てが止まっている状態)の定義 */
state three par {
any {
action : goto first; /* action がアサートされたとき初期状態へ */
else : goto three; /* 何も動作がないときは状態保持 */
}
}
}
}
**シミュレーション [#a69960b3]
+[[ダウンロード>#bac31622]]にあるsample10.tar.gzをダウンロードする。
--解凍方法は
% tar zxvf sample10.tar.gz
+sample10ディレクトリに移って、以下のファイルがあることを確認し、
--Makefile
--state.sfl
--state.sim
% make sim
+結果は以下のようになる。ログファイル参照。&ref(sim.txt);
終了行:
[[SFL例題]]
*ステートマシンの設計 [#a033e493]
LEDを制御するステートマシンの設計。
----
#contents
**ダウンロード [#bac31622]
&ref(sample10.tar.gz);
**覚えること [#db949268]
-stateの使い方
-gotoの使い方
***stateの使い方 [#e70c1c08]
SFLではステートマシンを作成する際に、各ステートの機能をそれぞれ定義することで作成することが可能である。~
stateという構文を使用することによって、ステート毎の機能を簡単に明示することが出来る。~
~
使用するためには、まずステージ定義内部で、state_nameを宣言する。名前は任意。~
また、ステージが起動されたときに、最初に遷移する初期状態をfirst_stateで宣言する必要がある。~
この例題では、
state_name first, start, one, two, three;
first_state first;
のようになっている。~
~
そして各ステートに対しての機能を
state one par {
...
}
のように定義していけばよい。
***gotoの使い方 [#s4358f64]
状態遷移の際には、SFLではgotoという機能が用意されている。~
例えば、
goto start;
といった様に、次に遷移させたい状態を指定することで、次のクロックにはその状態に処理を移すことが出来る。~
~
例題のサンプルソースを参考にされたい。
**サンプルソース[#s3abe640]
/* slot で使うカウンタの宣言 */
declare cnt10 {
output out<4>;
instrin clear;
instrin do;
instrout up;
}
/* ステートマシンを用いたスロットの回路 */
module slot {
instrin start; /* スタート用制御信号 */
instrin action; /* 回転開始やストップを制御する信号 */
output one_out<4>;
output two_out<4>;
output three_out<4>;
/* 3つのカウンタを宣言 */
cnt10 one, two, three;
/* ステージの名前と起動時の引数定義 */
stage_name main { task do(); }
par {
one_out = one.out;
two_out = two.out;
three_out = three.out;
}
/* start がアサートされたとき、main ステージを起動する */
instruct start generate main.do();
/* main ステージの定義 */
stage main {
state_name first, start, one, two, three; /* ステートの名前の定義 */
first_state first; /* 初期ステートの定義 */
/* first ステージ(値をクリアした状態)の定義 */
state first par {
one.clear();
two.clear();
three.clear();
any {
action : goto start; /* action がアサートされたとき次の状態へ */
else : goto first; /* 何も動作がないときは状態保持 */
}
}
/* start ステージ(全てが回っている状態)の定義 */
state start par {
one.do();
two.do();
three.do();
any {
action : goto one; /* action がアサートされたとき次の状態へ */
else : goto start; /* 何も動作がないときは状態保持 */
}
}
/* one ステージ(1つ目が止まっている状態)の定義 */
state one par {
two.do();
three.do();
any {
action : goto two; /* action がアサートされたとき次の状態へ */
else : goto one; /* 何も動作がないときは状態保持 */
}
}
/* two ステージ(2つ目までが止まっている状態)の定義 */
state two par {
three.do();
any {
action : goto three; /* action がアサートされたとき次の状態へ */
else : goto two; /* 何も動作がないときは状態保持 */
}
}
/* three ステージ(全てが止まっている状態)の定義 */
state three par {
any {
action : goto first; /* action がアサートされたとき初期状態へ */
else : goto three; /* 何も動作がないときは状態保持 */
}
}
}
}
**シミュレーション [#a69960b3]
+[[ダウンロード>#bac31622]]にあるsample10.tar.gzをダウンロードする。
--解凍方法は
% tar zxvf sample10.tar.gz
+sample10ディレクトリに移って、以下のファイルがあることを確認し、
--Makefile
--state.sfl
--state.sim
% make sim
+結果は以下のようになる。ログファイル参照。&ref(sim.txt);
ページ名: