SFL例題/第8回
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[SFL例題]]
*レジスタを使った回路の設計 [#sfd12549]
情報を記憶することが出来るレジスタを使った回路の設計をする。~
~
この例題では、値を1ずつ加算していくインクリメンタを作成する。
----
#contents
**ダウンロード [#tb568d7d]
&ref(sample08.tar.gz);
**覚えること [#p1d02837]
-レジスタの使用方法
-circuit宣言
***レジスタの使用方法 [#m3150593]
レジスタは値を保持することが出来る回路である。演算結果や状態の保持に使用される。~
ここでは8ビットのカウンタを例にして説明する。~
レジスタの宣言には3つの種類がある。
reg rgst<8>;
reg_wr rgst<8>;
reg_ws rgst<8>;
のように、reg, reg_wr, reg_ws の3つが用意されていて、それぞれ任意の名前とビット幅が指定可能である。~
:reg|初期値が不定のレジスタ宣言
:reg_wr|初期値が全ビット0のレジスタ宣言
:reg_ws|初期値が全ビット1のレジスタ宣言
通常、レジスタは初期値として不定値をとっている。~
ユーザーはレジスタを使用する前に、必ずリセット処理を行い、レジスタの値を0にするなどしてから使用する必要があるが、~
SFLでは宣言時に初期化の際の初期値を与えることが出来る。~
~
レジスタへの代入は := 演算子を使用する。例としては、
rgst := 0b10010010;
rgst := inc8.do(rgst).out;
のように表記する。レジスタにおける代入演算子は特殊であることには注意していただきたい。~
~
レジスタへの書き込みは1クロック後に反映される。つまり、クロックに同期して値が変更される。~
***circuit宣言 [#d505f548]
circuit宣言はmodule宣言と等価であるが、その回路の中に+や-などの算術演算式を含む回路を作成するときに使われる。~
このとき、その演算に使われる回路はPARTHENONが既に用意している回路を使用することになる。~
~
今回はインクリメンタの回路は省略するために、算術演算式を用いて実現しているが、~
演習ではcircuit宣言は使用しないで回路を設計する。
**サンプルソース[#i6787003]
/* register で使うインクリメンタの宣言 */
declare inc8 {
input in<8>;
output out<8>;
instrin do;
instr_arg do(in);
}
module register {
output out<8>;
instrin do;
/* 初期値が 0 のレジスタ */
reg_wr count<8>;
/* サブモジュール */
inc8 inc;
par {
out = count;
}
instruct do par {
/* レジスタへの入力は := を使用する */
count := inc.do(count).out;
}
}
/* PARTHENON のサンプルを使ってインクリメンタを作成 */
circuit inc8 {
input in<8>;
output out<8>;
instrin do;
instruct do out = in + 0x01;
}
**シミュレーション [#y982d50e]
+[[ダウンロード>#tb568d7d]]にあるsample08.tar.gzをダウンロードする。
--解凍方法は
% tar zxvf sample08.tar.gz
+sample08ディレクトリに移って、以下のファイルがあることを確認し、
--Makefile
--register.sfl
--register.sim
% make sim
+結果は以下のようになる。
time:1 out:1
time:2 out:2
time:3 out:3
time:4 out:4
time:5 out:5
(中略)
time:96 out:96
time:97 out:97
time:98 out:98
time:99 out:99
time:100 out:100
終了行:
[[SFL例題]]
*レジスタを使った回路の設計 [#sfd12549]
情報を記憶することが出来るレジスタを使った回路の設計をする。~
~
この例題では、値を1ずつ加算していくインクリメンタを作成する。
----
#contents
**ダウンロード [#tb568d7d]
&ref(sample08.tar.gz);
**覚えること [#p1d02837]
-レジスタの使用方法
-circuit宣言
***レジスタの使用方法 [#m3150593]
レジスタは値を保持することが出来る回路である。演算結果や状態の保持に使用される。~
ここでは8ビットのカウンタを例にして説明する。~
レジスタの宣言には3つの種類がある。
reg rgst<8>;
reg_wr rgst<8>;
reg_ws rgst<8>;
のように、reg, reg_wr, reg_ws の3つが用意されていて、それぞれ任意の名前とビット幅が指定可能である。~
:reg|初期値が不定のレジスタ宣言
:reg_wr|初期値が全ビット0のレジスタ宣言
:reg_ws|初期値が全ビット1のレジスタ宣言
通常、レジスタは初期値として不定値をとっている。~
ユーザーはレジスタを使用する前に、必ずリセット処理を行い、レジスタの値を0にするなどしてから使用する必要があるが、~
SFLでは宣言時に初期化の際の初期値を与えることが出来る。~
~
レジスタへの代入は := 演算子を使用する。例としては、
rgst := 0b10010010;
rgst := inc8.do(rgst).out;
のように表記する。レジスタにおける代入演算子は特殊であることには注意していただきたい。~
~
レジスタへの書き込みは1クロック後に反映される。つまり、クロックに同期して値が変更される。~
***circuit宣言 [#d505f548]
circuit宣言はmodule宣言と等価であるが、その回路の中に+や-などの算術演算式を含む回路を作成するときに使われる。~
このとき、その演算に使われる回路はPARTHENONが既に用意している回路を使用することになる。~
~
今回はインクリメンタの回路は省略するために、算術演算式を用いて実現しているが、~
演習ではcircuit宣言は使用しないで回路を設計する。
**サンプルソース[#i6787003]
/* register で使うインクリメンタの宣言 */
declare inc8 {
input in<8>;
output out<8>;
instrin do;
instr_arg do(in);
}
module register {
output out<8>;
instrin do;
/* 初期値が 0 のレジスタ */
reg_wr count<8>;
/* サブモジュール */
inc8 inc;
par {
out = count;
}
instruct do par {
/* レジスタへの入力は := を使用する */
count := inc.do(count).out;
}
}
/* PARTHENON のサンプルを使ってインクリメンタを作成 */
circuit inc8 {
input in<8>;
output out<8>;
instrin do;
instruct do out = in + 0x01;
}
**シミュレーション [#y982d50e]
+[[ダウンロード>#tb568d7d]]にあるsample08.tar.gzをダウンロードする。
--解凍方法は
% tar zxvf sample08.tar.gz
+sample08ディレクトリに移って、以下のファイルがあることを確認し、
--Makefile
--register.sfl
--register.sim
% make sim
+結果は以下のようになる。
time:1 out:1
time:2 out:2
time:3 out:3
time:4 out:4
time:5 out:5
(中略)
time:96 out:96
time:97 out:97
time:98 out:98
time:99 out:99
time:100 out:100
ページ名: