SFLで作るPICO-16プロセッサ/第6回
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[SFLで作るPICO-16プロセッサ]]
*ステートマシンを用いた制御ユニットの設計 [#kb50239f]
[[第5回>SFLで作るPICO-16プロセッサ/第5回]]で設計したデータパスを、ステートマシンを用いて制御します。~
この制御ユニットを付加することで、今までは手動で行っていた(テストベンチ内に記述していた)命令フェッチと実行の制御を自動で行うことができます。
**コンテンツ [#h29b4f83]
#contents
*制御ユニット [#ca6bd767]
今回設計する制御ユニットはステートマシンを用いて、命令フェッチと実行の2つの動作を制御します。
*仕様 [#sa070019]
ステートマシンを用いてデータパスの制御を行います。
**入出力 [#m6404368]
制御入力のみになります。
**サブモジュール [#cc1bfb5d]
-fpico16
--[[第5回>SFLで作るPICO-16プロセッサ/第5回]]で設計した全体の回路。
**ステートマシン [#q6ab600e]
ステートマシンは内部に状態を持ち、ある条件によって次のステートに遷移します。~
今回は遷移条件がないので、クロックが進む度に、2つのステートを交互に遷移します。この状態遷移図は以下のように書くことができます。
CENTER:&ref(fpico16_state.png);
2つのステートを実装します。それぞれのステート名と動作は以下のようになります。
+inst_fetch(命令フェッチ)
--初期ステート。
--データパスのinst_fetchを実行する。
--実行ステートに遷移する。
+execute(実行)
--データパスのexecuteを実行する。
--命令フェッチステートに遷移する。
このステートを持つステージ名はcontrolとしてください。
**機能 [#t9e64206]
-ステージの起動
--ステートマシンでデータパスを制御する機能を持つステージを起動(generate)する。
*実装 [#x420603a]
ファイル名はfpico16_top.sfl及び、fpico16_top.hとします。
**ヘッダ [#t77658bf]
declare fpico16_top {
instrin start;
}
**モジュール [#p8a70c9e]
以下の手順に従って記述してください。
/* 1. サブモジュールとして使用するモジュールのヘッダをインクルード */
module fpico16_top {
/* 2. 入出力信号、制御入出力信号を記述 */
/* 3. サブモジュール宣言 */
/* 4. ステージ名(control)とタスクを記述 */
/* 5. 制御入力に対する動作を記述 */
/* 6. ステージ(control)の動作を記述 */
}
今回はステージに関する記述が必要になってきます。[[ステートマシン記述のサンプル>#x298add2]]を参考に設計してください。
*論理シミュレーション [#u7960edc]
回路が正しく動作しているかどうかを確認します。
+&ref(ex06.tar.gz);をダウンロードする。~
~
解凍方法)
% tar zxvf ex06.tar.gz
+fpico16_top.h、fpico16_top.sflを作成し、ex06ディレクトリに入れる。
--fpico16_top.hは、[[ここ>#t77658bf]]から内容をコピーする。
--fpico16_top.sflは、[[ここ>#p8a70c9e]]から内容をコピーして、記述を完成させる。
+[[第5回>SFLで作るPICO-16プロセッサ/第5回]]で作成したSFLファイル及びヘッダファイルを全てex06にコピーする。
+シミュレーションを行う。
--シミュレーションには次のコマンドを使います。
% make
もしくは、
% make sim
--シミュレーションの結果はsim.logに出力されます。正しく動作していると&ref(sim.log.txt);のようになります。
--余裕があればテストベンチを自由に改変してみましょう。
+波形を観察する。
--波形ビューワの起動には次のコマンドを使います。
% make wave
--
+ファイルをクリーンする。
--ファイルのクリーンには次のコマンドを使います。
% make clean
--シミュレーションや波形ビューワで生成されたファイルのサイズが大きいときもあるので、全て終わったら余計なファイルを削除しておきましょう。
*ステートマシン記述のサンプル [#gcacf168]
ステートマシンの記述方法はサンプル回路を参考にしてください。
+&ref(ex06_sample.tar.gz);をダウンロードする。~
~
解凍方法)
% tar zxvf ex06_sample.tar.gz
+シミュレーションを行う。
--シミュレーションには次のコマンドを使います。
% make
もしくは、
% make sim
--シミュレーションの結果はsim.logに出力されます。次のような結果が出ます。
out:0
out:1
out:2
out:3
out:0
out:1
...
この出力はステートマシンによって制御されています。~
state_sample.sflの内容を見て、ステートマシンの記述方法を理解しましょう。
**サンプル回路の記述 [#x298add2]
ステートによって出力が変化する回路です。~
制御入力のstartはステートマシンを使うために必要なステージ(ここではmain)の起動を行っています。
ステージ名とタスク宣言で記述しているtaskには引数を持たせることもできますが、今回の設計では必要ありません。
module state_sample {
/* 入出力、制御入出力 */
instrin start;
output out<2>;
/* ステージ名とタスクの宣言 */
stage_name main { task do(); }
/* startはmainステージをgenerateする */
instruct start generate main.do();
/* mainステージ */
stage main {
state_name first, second, third, fourth; /* ステートの宣言 */
first_state first; /* 初期ステート */
/* firstステートの動作 */
state first par {
out = 0b00;
goto second; /* 次のステート */
}
/* secondステートの動作 */
state second par {
out = 0b01;
goto third; /* 次のステート */
}
/* thirdステートの動作 */
state third par {
out = 0b10;
goto fourth; /* 次のステート */
}
/* fourthステートの動作 */
state fourth par {
out = 0b11;
goto first; /* 次のステート */
}
}
}
*ヒントと豆知識 [#m5e35013]
ここでは、今回の演習に関わる豆知識やヒントを紹介します。
**stageの使い方 [#vc29bcc7]
SFL固有の構文として、stageという機能があります。
このstageを定義するためには、まず名前と、起動時の引数を宣言する必要があります。~
今回の課題では、引数は使用しないので単純に起動するためには、以下のような記述をすれば実現できます。
stage_name main { task do(); }
内部動作を定義するためには、stage構文で処理の記述を囲みます。例えば、以下のような記述ができます。
stage main {
par {
/* ステージの動作 */
}
}
今回はステートマシンを使った記述を用います。
**stateの使い方 [#s2312bcd]
SFLではステートマシンを作成する際に、state構文を使って、ステート毎の機能を簡単に記述できます。
state構文を使うにはステージ定義内部で、state_nameとfirst_stateを宣言する必要があります。~
state_nameには実装するステートの名前を、first_stateは起動時の初期ステートを指定します。
サンプル回路では、以下のような記述になります。
state_name first, second, third, fourth; /* ステートの宣言 */
first_state first; /* 初期ステート */
そして各ステートの機能を次のstate構文で記述していきます。
state first par {
...
}
state second par {
...
}
**gotoの使い方 [#s2dd83df]
SFLでは状態遷移のために、gotoという構文が用意されています。~
例えば、次はthirdという名称のステートに遷移させたいときは、以下のような記述ができます。
goto third;
このように、クロックが進む毎に状態遷移が発生する回路を簡単に実現できます。
**generateの使い方 [#l99b1f98]
stageで記述したブロックを動作させるためには、generateを使用します。~
例えばstart信号が起動したときにmain(前述の例)の動作を開始するような記述は、以下のようになります。
instruct start generate main.do();
終了行:
[[SFLで作るPICO-16プロセッサ]]
*ステートマシンを用いた制御ユニットの設計 [#kb50239f]
[[第5回>SFLで作るPICO-16プロセッサ/第5回]]で設計したデータパスを、ステートマシンを用いて制御します。~
この制御ユニットを付加することで、今までは手動で行っていた(テストベンチ内に記述していた)命令フェッチと実行の制御を自動で行うことができます。
**コンテンツ [#h29b4f83]
#contents
*制御ユニット [#ca6bd767]
今回設計する制御ユニットはステートマシンを用いて、命令フェッチと実行の2つの動作を制御します。
*仕様 [#sa070019]
ステートマシンを用いてデータパスの制御を行います。
**入出力 [#m6404368]
制御入力のみになります。
**サブモジュール [#cc1bfb5d]
-fpico16
--[[第5回>SFLで作るPICO-16プロセッサ/第5回]]で設計した全体の回路。
**ステートマシン [#q6ab600e]
ステートマシンは内部に状態を持ち、ある条件によって次のステートに遷移します。~
今回は遷移条件がないので、クロックが進む度に、2つのステートを交互に遷移します。この状態遷移図は以下のように書くことができます。
CENTER:&ref(fpico16_state.png);
2つのステートを実装します。それぞれのステート名と動作は以下のようになります。
+inst_fetch(命令フェッチ)
--初期ステート。
--データパスのinst_fetchを実行する。
--実行ステートに遷移する。
+execute(実行)
--データパスのexecuteを実行する。
--命令フェッチステートに遷移する。
このステートを持つステージ名はcontrolとしてください。
**機能 [#t9e64206]
-ステージの起動
--ステートマシンでデータパスを制御する機能を持つステージを起動(generate)する。
*実装 [#x420603a]
ファイル名はfpico16_top.sfl及び、fpico16_top.hとします。
**ヘッダ [#t77658bf]
declare fpico16_top {
instrin start;
}
**モジュール [#p8a70c9e]
以下の手順に従って記述してください。
/* 1. サブモジュールとして使用するモジュールのヘッダをインクルード */
module fpico16_top {
/* 2. 入出力信号、制御入出力信号を記述 */
/* 3. サブモジュール宣言 */
/* 4. ステージ名(control)とタスクを記述 */
/* 5. 制御入力に対する動作を記述 */
/* 6. ステージ(control)の動作を記述 */
}
今回はステージに関する記述が必要になってきます。[[ステートマシン記述のサンプル>#x298add2]]を参考に設計してください。
*論理シミュレーション [#u7960edc]
回路が正しく動作しているかどうかを確認します。
+&ref(ex06.tar.gz);をダウンロードする。~
~
解凍方法)
% tar zxvf ex06.tar.gz
+fpico16_top.h、fpico16_top.sflを作成し、ex06ディレクトリに入れる。
--fpico16_top.hは、[[ここ>#t77658bf]]から内容をコピーする。
--fpico16_top.sflは、[[ここ>#p8a70c9e]]から内容をコピーして、記述を完成させる。
+[[第5回>SFLで作るPICO-16プロセッサ/第5回]]で作成したSFLファイル及びヘッダファイルを全てex06にコピーする。
+シミュレーションを行う。
--シミュレーションには次のコマンドを使います。
% make
もしくは、
% make sim
--シミュレーションの結果はsim.logに出力されます。正しく動作していると&ref(sim.log.txt);のようになります。
--余裕があればテストベンチを自由に改変してみましょう。
+波形を観察する。
--波形ビューワの起動には次のコマンドを使います。
% make wave
--
+ファイルをクリーンする。
--ファイルのクリーンには次のコマンドを使います。
% make clean
--シミュレーションや波形ビューワで生成されたファイルのサイズが大きいときもあるので、全て終わったら余計なファイルを削除しておきましょう。
*ステートマシン記述のサンプル [#gcacf168]
ステートマシンの記述方法はサンプル回路を参考にしてください。
+&ref(ex06_sample.tar.gz);をダウンロードする。~
~
解凍方法)
% tar zxvf ex06_sample.tar.gz
+シミュレーションを行う。
--シミュレーションには次のコマンドを使います。
% make
もしくは、
% make sim
--シミュレーションの結果はsim.logに出力されます。次のような結果が出ます。
out:0
out:1
out:2
out:3
out:0
out:1
...
この出力はステートマシンによって制御されています。~
state_sample.sflの内容を見て、ステートマシンの記述方法を理解しましょう。
**サンプル回路の記述 [#x298add2]
ステートによって出力が変化する回路です。~
制御入力のstartはステートマシンを使うために必要なステージ(ここではmain)の起動を行っています。
ステージ名とタスク宣言で記述しているtaskには引数を持たせることもできますが、今回の設計では必要ありません。
module state_sample {
/* 入出力、制御入出力 */
instrin start;
output out<2>;
/* ステージ名とタスクの宣言 */
stage_name main { task do(); }
/* startはmainステージをgenerateする */
instruct start generate main.do();
/* mainステージ */
stage main {
state_name first, second, third, fourth; /* ステートの宣言 */
first_state first; /* 初期ステート */
/* firstステートの動作 */
state first par {
out = 0b00;
goto second; /* 次のステート */
}
/* secondステートの動作 */
state second par {
out = 0b01;
goto third; /* 次のステート */
}
/* thirdステートの動作 */
state third par {
out = 0b10;
goto fourth; /* 次のステート */
}
/* fourthステートの動作 */
state fourth par {
out = 0b11;
goto first; /* 次のステート */
}
}
}
*ヒントと豆知識 [#m5e35013]
ここでは、今回の演習に関わる豆知識やヒントを紹介します。
**stageの使い方 [#vc29bcc7]
SFL固有の構文として、stageという機能があります。
このstageを定義するためには、まず名前と、起動時の引数を宣言する必要があります。~
今回の課題では、引数は使用しないので単純に起動するためには、以下のような記述をすれば実現できます。
stage_name main { task do(); }
内部動作を定義するためには、stage構文で処理の記述を囲みます。例えば、以下のような記述ができます。
stage main {
par {
/* ステージの動作 */
}
}
今回はステートマシンを使った記述を用います。
**stateの使い方 [#s2312bcd]
SFLではステートマシンを作成する際に、state構文を使って、ステート毎の機能を簡単に記述できます。
state構文を使うにはステージ定義内部で、state_nameとfirst_stateを宣言する必要があります。~
state_nameには実装するステートの名前を、first_stateは起動時の初期ステートを指定します。
サンプル回路では、以下のような記述になります。
state_name first, second, third, fourth; /* ステートの宣言 */
first_state first; /* 初期ステート */
そして各ステートの機能を次のstate構文で記述していきます。
state first par {
...
}
state second par {
...
}
**gotoの使い方 [#s2dd83df]
SFLでは状態遷移のために、gotoという構文が用意されています。~
例えば、次はthirdという名称のステートに遷移させたいときは、以下のような記述ができます。
goto third;
このように、クロックが進む毎に状態遷移が発生する回路を簡単に実現できます。
**generateの使い方 [#l99b1f98]
stageで記述したブロックを動作させるためには、generateを使用します。~
例えばstart信号が起動したときにmain(前述の例)の動作を開始するような記述は、以下のようになります。
instruct start generate main.do();
ページ名: