SFL例題/第5回
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[SFL例題]]
*ハーフアダーを用いたフルアダーの設計 [#v4d95d88]
ハーフアダーを二つ並べてフルアダーを設計する。
----
#contents
**ダウンロード [#l311bba8]
&ref(sample05.tar.gz);
**覚えること [#u817b1fe]
-サブモジュールの使用方法
***サブモジュール [#r84f4c7e]
[サブモジュール名].[制御信号]([引数/入力信号]).[出力信号]という書き方で、~
制御信号に対しての出力を得ることが出来る。~
~
前回の例題でハーフアダーは既に設計済みである。~
この例題では、そのハーフアダーを違うモジュールから呼び出して使用する。~
~
例えば、inaとinbが入力してハーフアダーのsoutの結果をoutに出力させるとき、~
ハーフアダーのサブモジュールの名前をhaとして、~
out = ha.do(ina, inb).sout;
の様に書くことで使用することが出来る。これは、
par {
ha.do(ina, inb);
out = ha.sout;
}
と書くことと同じ意味を持つ。~
par で書かれたブロックの中は全て1クロックで動作するため、同じ処理として扱われる。
***declare [#h9562286]
moduleで書かれたブロックは、モジュールの"定義"であって、その機能の内容を記述する。~
一方、declareではモジュールの"宣言"で、使用する回路のインターフェイス部分を記述する。~
~
このとき、制御端子があるときは、その制御端子を呼び出す回路が~
その制御に対して、どのような入力が必要なのか、どの入力端子に入力すれば良いのかということを定義する。~
1つの制御端子に対して、instr_argで、その情報を記述する。~
このとき、制御端子に必要な入力の定義を、仮引数の定義という。~
~
この機能により、Cプログラミングで言うところの関数を呼び出すかのように~
サブモジュールを使用することが可能である。~
~
例えば、ハーフアダーならば2つの入力(ina, inb)を使用してdoという機能を行うので、~
instr_arg do(ina, inb);
のように書く。~
これをサブモジュールで上記に書いたように使用することで、信号線を接続し、出力を得ることが出来る。
**例題 [#vba0a55e]
ハーフアダーを用いてフルアダーを設計する。
***真理値表 [#q4d14860]
|ina|inb|cin|sout|cout|
|0|0|0|0|0|
|0|0|1|1|0|
|0|1|0|1|0|
|0|1|1|0|1|
|1|0|0|1|0|
|1|0|1|0|1|
|1|1|0|0|1|
|1|1|1|1|1|
***論理ゲートを用いた設計例 [#cef94964]
CENTER:&ref(full_adder.png);
**サンプルソース [#a3f43580]
ハーフアダーを用いたフルアダーは以下のように記述できる。
/* モジュールの宣言 */
declare half_adder {
input ina;
input inb;
output sout;
output cout;
instrin do;
/* 仮引数の定義 */
/* 制御信号 do は ina と inb に値を入力して使用する機能 */
instr_arg do(ina, inb);
}
module full_adder {
input ina;
input inb;
input cin;
output cout;
output sout;
instrin do;
/* サブモジュールの宣言 */
half_adder ha0, ha1;
instruct do par {
/* ina と inb を入力して do という機能を実行する */
ha0.do(ina, inb);
/* ha0 の sout と cin を入力して do という機能を実行する */
ha1.do(ha0.sout, cin);
/* 上の記述が do を実行しているので結果を出力させる */
sout = ha1.sout;
cout = ha0.cout | ha1.cout;
}
}
**シミュレーション [#a1d2bd93]
+[[ダウンロード>#l311bba8]]にあるsample05.tar.gzをダウンロードする。
--解凍方法は
% tar zxvf sample05.tar.gz
+sample05ディレクトリに移って、以下のファイルがあることを確認し、
--Makefile
--half_adder.sfl
--full_adder.sfl
--full_adder.sim
% make sim
+結果は以下のようになる。
do:0 ina:0 inb:0 cin:0 cout: sout:
do:0 ina:0 inb:0 cin:1 cout: sout:
do:0 ina:0 inb:1 cin:0 cout: sout:
do:0 ina:0 inb:1 cin:1 cout: sout:
do:0 ina:1 inb:0 cin:0 cout: sout:
do:0 ina:1 inb:0 cin:1 cout: sout:
do:0 ina:1 inb:1 cin:0 cout: sout:
do:0 ina:1 inb:1 cin:1 cout: sout:
do:1 ina:0 inb:0 cin:0 cout:0 sout:0
do:1 ina:0 inb:0 cin:1 cout:1 sout:0
do:1 ina:0 inb:1 cin:0 cout:1 sout:0
do:1 ina:0 inb:1 cin:1 cout:0 sout:1
do:1 ina:1 inb:0 cin:0 cout:1 sout:0
do:1 ina:1 inb:0 cin:1 cout:0 sout:1
do:1 ina:1 inb:1 cin:0 cout:0 sout:1
do:1 ina:1 inb:1 cin:1 cout:1 sout:1
終了行:
[[SFL例題]]
*ハーフアダーを用いたフルアダーの設計 [#v4d95d88]
ハーフアダーを二つ並べてフルアダーを設計する。
----
#contents
**ダウンロード [#l311bba8]
&ref(sample05.tar.gz);
**覚えること [#u817b1fe]
-サブモジュールの使用方法
***サブモジュール [#r84f4c7e]
[サブモジュール名].[制御信号]([引数/入力信号]).[出力信号]という書き方で、~
制御信号に対しての出力を得ることが出来る。~
~
前回の例題でハーフアダーは既に設計済みである。~
この例題では、そのハーフアダーを違うモジュールから呼び出して使用する。~
~
例えば、inaとinbが入力してハーフアダーのsoutの結果をoutに出力させるとき、~
ハーフアダーのサブモジュールの名前をhaとして、~
out = ha.do(ina, inb).sout;
の様に書くことで使用することが出来る。これは、
par {
ha.do(ina, inb);
out = ha.sout;
}
と書くことと同じ意味を持つ。~
par で書かれたブロックの中は全て1クロックで動作するため、同じ処理として扱われる。
***declare [#h9562286]
moduleで書かれたブロックは、モジュールの"定義"であって、その機能の内容を記述する。~
一方、declareではモジュールの"宣言"で、使用する回路のインターフェイス部分を記述する。~
~
このとき、制御端子があるときは、その制御端子を呼び出す回路が~
その制御に対して、どのような入力が必要なのか、どの入力端子に入力すれば良いのかということを定義する。~
1つの制御端子に対して、instr_argで、その情報を記述する。~
このとき、制御端子に必要な入力の定義を、仮引数の定義という。~
~
この機能により、Cプログラミングで言うところの関数を呼び出すかのように~
サブモジュールを使用することが可能である。~
~
例えば、ハーフアダーならば2つの入力(ina, inb)を使用してdoという機能を行うので、~
instr_arg do(ina, inb);
のように書く。~
これをサブモジュールで上記に書いたように使用することで、信号線を接続し、出力を得ることが出来る。
**例題 [#vba0a55e]
ハーフアダーを用いてフルアダーを設計する。
***真理値表 [#q4d14860]
|ina|inb|cin|sout|cout|
|0|0|0|0|0|
|0|0|1|1|0|
|0|1|0|1|0|
|0|1|1|0|1|
|1|0|0|1|0|
|1|0|1|0|1|
|1|1|0|0|1|
|1|1|1|1|1|
***論理ゲートを用いた設計例 [#cef94964]
CENTER:&ref(full_adder.png);
**サンプルソース [#a3f43580]
ハーフアダーを用いたフルアダーは以下のように記述できる。
/* モジュールの宣言 */
declare half_adder {
input ina;
input inb;
output sout;
output cout;
instrin do;
/* 仮引数の定義 */
/* 制御信号 do は ina と inb に値を入力して使用する機能 */
instr_arg do(ina, inb);
}
module full_adder {
input ina;
input inb;
input cin;
output cout;
output sout;
instrin do;
/* サブモジュールの宣言 */
half_adder ha0, ha1;
instruct do par {
/* ina と inb を入力して do という機能を実行する */
ha0.do(ina, inb);
/* ha0 の sout と cin を入力して do という機能を実行する */
ha1.do(ha0.sout, cin);
/* 上の記述が do を実行しているので結果を出力させる */
sout = ha1.sout;
cout = ha0.cout | ha1.cout;
}
}
**シミュレーション [#a1d2bd93]
+[[ダウンロード>#l311bba8]]にあるsample05.tar.gzをダウンロードする。
--解凍方法は
% tar zxvf sample05.tar.gz
+sample05ディレクトリに移って、以下のファイルがあることを確認し、
--Makefile
--half_adder.sfl
--full_adder.sfl
--full_adder.sim
% make sim
+結果は以下のようになる。
do:0 ina:0 inb:0 cin:0 cout: sout:
do:0 ina:0 inb:0 cin:1 cout: sout:
do:0 ina:0 inb:1 cin:0 cout: sout:
do:0 ina:0 inb:1 cin:1 cout: sout:
do:0 ina:1 inb:0 cin:0 cout: sout:
do:0 ina:1 inb:0 cin:1 cout: sout:
do:0 ina:1 inb:1 cin:0 cout: sout:
do:0 ina:1 inb:1 cin:1 cout: sout:
do:1 ina:0 inb:0 cin:0 cout:0 sout:0
do:1 ina:0 inb:0 cin:1 cout:1 sout:0
do:1 ina:0 inb:1 cin:0 cout:1 sout:0
do:1 ina:0 inb:1 cin:1 cout:0 sout:1
do:1 ina:1 inb:0 cin:0 cout:1 sout:0
do:1 ina:1 inb:0 cin:1 cout:0 sout:1
do:1 ina:1 inb:1 cin:0 cout:0 sout:1
do:1 ina:1 inb:1 cin:1 cout:1 sout:1
ページ名: