ピタゴラスイッチMIPS版/基本回路の実装方法
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[ピタゴラスイッチMIPS版/作業メモ]]
*概要 [#xf161562]
基本回路の実装方法まとめ。
----
#contents
*設計フロー [#i223ed18]
+基本回路の実装
--mips_simulator/mips_sim/circuit/basicディレクトリに移動。
--BasicCircuit.templateを設計する回路のjavaファイルとして複製。
--クラス名を変更。([[詳細>#ecd6984f]])
--コンストラクタをクラス名に合わせる。([[詳細>#x9c6b2dd]])
--setModulesメソッドを記述。([[詳細>#a05c08ab]])
--setWiresメソッドを記述。([[詳細>#kf763fd5]])
--setRegistersメソッドを記述。([[詳細>#t933a13c]])
--simulateメソッドを記述。([[詳細>#y9870878]])
+回路の登録
--mips_simulator/mips_sim/globalディレクトリに移動。
--GlobalObjects.javaのBASIC_CIRCUITSに作成した基本回路クラスを登録。([[詳細>#je74df51]])
*基本回路の実装 [#f93be59c]
カウンタの実装を例にしています。
**クラス名の変更 [#ecd6984f]
クラス名とクラスに対するコメントを記述します。
-変更前
/**
* クラスの名称
* @author 設計者名
* @version バージョン(日付など)
*/
public class template extends BasicCircuit {
-変更後
/**
* カウンタ
* @author Daisuke Ohwada (m5121216@u-aizu.ac.jp)
* @version Time-stamp: <2009/07/29 00:20:43 by Daisuke Ohwada>
*/
public class Counter extends BasicCircuit {
**コンストラクタ [#x9c6b2dd]
コンストラクタ名をクラス名に合わせます。
-変更前
/**
* コンストラクタ
*/
public template() {
super(circuit_name);
}
-変更後
/**
* コンストラクタ
*/
public Counter() {
super(circuit_name);
}
**setModules [#a05c08ab]
使用するモジュールを定義します。~
使用できるモジュールは[[こちら>#e77b60d0]]。
-変更前
/**
* モジュールのセット
*/
public final void setModules() {
modules = new Module [] {
/* ここにモジュールを定義 */
};
}
-変更後
/**
* モジュールのセット
*/
public final void setModules() {
modules = new Module [] {
new Adder("adder"),
new ImmediateValue("imm_1", 1),
new Register("reg_counter", 0)
};
}
**setWires [#kf763fd5]
使用するワイヤと接続情報を定義します。
-変更前
/**
* ワイヤのセット
*/
public final void setWires() {
wires = new Wire [] {
/* ここにワイヤを定義 */
};
}
-変更後
/**
* ワイヤのセット
*/
public final void setWires() {
wires = new Wire [] {
new Wire("adder_result", number("adder"), number("reg_counter")),
new Wire("counter_value", number("reg_counter"), number("adder")),
new Wire("imm_val", number("imm_1"), number("adder"))
};
}
***接続情報登録 [#ya4ae98d]
ワイヤのコンストラクタは以下のような形をとります。
new Wire("ワイヤ名", number("入力元モジュール名"), number("入力先モジュール名1"), number("入力先モジュール名2"), ...);
入力先モジュール名は可変長引数となっていて、複数指定することができます。~
numberメソッドはモジュール名をキーとして、対応するモジュール番号を取得するメソッドです。
**setRegisters [#t933a13c]
使用するモジュールの中から、レジスタを抜き出して再定義します。
-変更前
/**
* レジスタのセット
*/
public final void setRegisters() {
registers = new Register [] {
/* ここにレジスタを定義 */
};
}
-変更後
/**
* レジスタのセット
*/
public final void setRegisters() {
registers = new Register [] {
getRegister("reg_counter")
};
}
***レジスタの取得 [#g5a17f8f]
モジュールの定義で既にレジスタを宣言しているので、モジュールのハッシュからレジスタだけを以下のメソッドを使って抜き出します。
getRegister("レジスタ名");
**simulate [#y9870878]
シミュレーションの内容を定義します。
定義する必要があるのは大きく分けると以下の2つです。
-ワイヤが伝搬する値
-レジスタの更新後の値
逐次処理で実行できるように、実行順序に気をつけてください。
-変更前
/**
* 回路のシミュレーションの実行
*/
public final void simulate() {
/* シミュレーションの内容を定義 */
}
-変更後
/**
* 回路のシミュレーションの実行
*/
public final void simulate() {
setWire("imm_val", module("imm_1"));
setWire("counter_value", module("reg_counter"));
setWire("adder_result", module("adder", wire("counter_value"), wire("imm_val")));
setRegister("reg_counter", wire("adder_result"));
}
***モジュールの起動 [#f80894be]
モジュールを使って演算を行いたいときは、以下のメソッドを使用します。
module("モジュール名")
module("モジュール名", 引数1, 引数2,...)
引数の数と意味はモジュールによって異なります。[[こちら>#e77b60d0]]で確認してください。
***ワイヤに値を設定 [#r4dd4f00]
ワイヤに値を設定するためには以下のメソッドを使用します。
setWire("ワイヤ名", 設定する値);
setWire("ワイヤ名", module("モジュール名"));
setWire("ワイヤ名", module("モジュール名", 引数1, 引数2,...));
***ワイヤの値を取得 [#ge08ef20]
ワイヤに入っている値を取得するためには以下のメソッドを使用します。
wire("ワイヤ名");
***ビット幅を指定してワイヤの値を取得 [#z921e149]
ビット幅を指定してワイヤに入っている値を取得するためには以下のメソッドを使用します。
wire("ワイヤ名", 31, 26);
これはワイヤ名[31:26]と同義になります。
***レジスタの値の更新 [#c6d9bb6a]
レジスタの値を更新するためには以下のメソッドを使用します。
setRegister("レジスタ名", 更新する値);
setRegister("レジスタ名", 更新する値, 書き込み制御信号);
setRegister("レジスタ名", wire("更新する値が入ったワイヤ名"));
setRegister("レジスタ名", wire("更新する値が入ったワイヤ名"), wire("書き込み制御信号の値が入ったワイヤ名"));
*回路の登録 [#x251fb6b]
回路の登録に関する詳細。
**基本回路クラスの登録 [#je74df51]
GlobalObjects.javaのBASIC_CIRCUITSに実装した基本回路クラスを登録。
-変更前
// 基本回路
public static final BasicCircuit [] BASIC_CIRCUITS = new BasicCircuit [] {
new Counter(),
new UpDownCounter(),
...
};
-変更後
// 基本回路
public static final BasicCircuit [] BASIC_CIRCUITS = new BasicCircuit [] {
new Counter(),
new UpDownCounter(),
...,
new [実装したクラス名]()
};
*基本モジュール一覧 [#e77b60d0]
mips_sim.circuit.basicmodules.*をインポートして使用する。
**Adder [#y3eef26e]
-コンストラクタ
new Adder("回路の名称");
-実行時の引数(2)
--入力1
--入力2
-得られる値
--入力1 + 入力2
**AndLogicGate [#ued7c3f6]
-コンストラクタ
new AndLogicGate("回路の名称");
-実行時の引数(2)
--入力1
--入力2
-得られる値
--入力1 & 入力2
**Comparetor [#b14ff042]
-コンストラクタ
new Comparetor("回路の名称");
-実行時の引数(2)
--入力1
--入力2
-得られる値
--(入力1 == 入力2) ? 1 : 0
**Extend [#z2cb5cd0]
-コンストラクタ
new Extend("回路の名称");
-実行時の引数(2)
--入力1
--符号拡張方式
---GlobalObjects.ZERO_EXTEND (ゼロ拡張)
---GlobalObjects.SIGN_EXTEND (符号拡張)
-得られる値
--ゼロ拡張 or 符号拡張の結果
**ExternalInput [#lad1d76d]
-コンストラクタ
new ExternalInput("回路の名称");
-実行時の引数(0)
-得られる値
--標準入力の値
**ImmediateValue [#kd7aed04]
-コンストラクタ
new ImmediateValue("回路の名称", 出力する即値);
-実行時の引数(0)
-得られる値
--コンストラクタで指定した値
**Memory [#t4609449]
-コンストラクタ
new Memory("回路の名称");
new Memory("回路の名称", ベースアドレス);
**Mux2 [#nf8a0e3a]
-コンストラクタ
new Mux2("回路の名称");
-実行時の引数(3)
--入力1
--入力2
--選択制御信号
-得られる値
--選択制御信号が0のとき入力1、1のとき入力2
**Mux4 [#y919ed87]
-コンストラクタ
new Mux4("回路の名称");
-実行時の引数(5)
--入力1
--入力2
--入力3
--入力4
--選択制御信号
-得られる値
--選択制御信号が0のとき入力1、1のとき入力2、2のとき入力3、3のとき入力4
**OrLogicGate [#h6adfff1]
-コンストラクタ
new OrLogicGate("回路の名称");
-実行時の引数(2)
--入力1
--入力2
-得られる値
--入力1 | 入力2
**Register [#aca85159]
-コンストラクタ
new Register("回路の名称", 初期値);
-得られる値
--レジスタの値
**RegisterWithEnable [#l50771b8]
-コンストラクタ
new RegisterWithEnable("回路の名称", 初期値);
new RegisterWithEnable("回路の名称", 初期値, 書き込み制御タイプ);
-パラメータの指定方法
--書き込み制御タイプ
---true (1のときイネーブル)
---false (0のときイネーブル)
-得られる値
--レジスタの値
**RegisterWithResetEnable [#gbf86616]
-コンストラクタ
new RegisterWithResetEnable("回路の名称", 初期値);
new RegisterWithEnable("回路の名称", 初期値, 書き込み制御タイプ, リセット制御タイプ);
-パラメータの指定方法
--書き込み制御タイプ
---true (1のときイネーブル)
---false (0のときイネーブル)
--リセット制御タイプ
---true (1のときリセット)
---false (0のときリセット)
-得られる値
--レジスタの値
**Shifter [#maaab97f]
-コンストラクタ
new Shifter("回路の名称", シフト方向, シフト量);
-パラメータの指定方法
--シフト方向
---GlobalObjects.SHIFT_LEFT (左シフト)
---GlobalObjects.SHIFT_RIGHT (右シフト)
-得られる値
--シフト後の値
終了行:
[[ピタゴラスイッチMIPS版/作業メモ]]
*概要 [#xf161562]
基本回路の実装方法まとめ。
----
#contents
*設計フロー [#i223ed18]
+基本回路の実装
--mips_simulator/mips_sim/circuit/basicディレクトリに移動。
--BasicCircuit.templateを設計する回路のjavaファイルとして複製。
--クラス名を変更。([[詳細>#ecd6984f]])
--コンストラクタをクラス名に合わせる。([[詳細>#x9c6b2dd]])
--setModulesメソッドを記述。([[詳細>#a05c08ab]])
--setWiresメソッドを記述。([[詳細>#kf763fd5]])
--setRegistersメソッドを記述。([[詳細>#t933a13c]])
--simulateメソッドを記述。([[詳細>#y9870878]])
+回路の登録
--mips_simulator/mips_sim/globalディレクトリに移動。
--GlobalObjects.javaのBASIC_CIRCUITSに作成した基本回路クラスを登録。([[詳細>#je74df51]])
*基本回路の実装 [#f93be59c]
カウンタの実装を例にしています。
**クラス名の変更 [#ecd6984f]
クラス名とクラスに対するコメントを記述します。
-変更前
/**
* クラスの名称
* @author 設計者名
* @version バージョン(日付など)
*/
public class template extends BasicCircuit {
-変更後
/**
* カウンタ
* @author Daisuke Ohwada (m5121216@u-aizu.ac.jp)
* @version Time-stamp: <2009/07/29 00:20:43 by Daisuke Ohwada>
*/
public class Counter extends BasicCircuit {
**コンストラクタ [#x9c6b2dd]
コンストラクタ名をクラス名に合わせます。
-変更前
/**
* コンストラクタ
*/
public template() {
super(circuit_name);
}
-変更後
/**
* コンストラクタ
*/
public Counter() {
super(circuit_name);
}
**setModules [#a05c08ab]
使用するモジュールを定義します。~
使用できるモジュールは[[こちら>#e77b60d0]]。
-変更前
/**
* モジュールのセット
*/
public final void setModules() {
modules = new Module [] {
/* ここにモジュールを定義 */
};
}
-変更後
/**
* モジュールのセット
*/
public final void setModules() {
modules = new Module [] {
new Adder("adder"),
new ImmediateValue("imm_1", 1),
new Register("reg_counter", 0)
};
}
**setWires [#kf763fd5]
使用するワイヤと接続情報を定義します。
-変更前
/**
* ワイヤのセット
*/
public final void setWires() {
wires = new Wire [] {
/* ここにワイヤを定義 */
};
}
-変更後
/**
* ワイヤのセット
*/
public final void setWires() {
wires = new Wire [] {
new Wire("adder_result", number("adder"), number("reg_counter")),
new Wire("counter_value", number("reg_counter"), number("adder")),
new Wire("imm_val", number("imm_1"), number("adder"))
};
}
***接続情報登録 [#ya4ae98d]
ワイヤのコンストラクタは以下のような形をとります。
new Wire("ワイヤ名", number("入力元モジュール名"), number("入力先モジュール名1"), number("入力先モジュール名2"), ...);
入力先モジュール名は可変長引数となっていて、複数指定することができます。~
numberメソッドはモジュール名をキーとして、対応するモジュール番号を取得するメソッドです。
**setRegisters [#t933a13c]
使用するモジュールの中から、レジスタを抜き出して再定義します。
-変更前
/**
* レジスタのセット
*/
public final void setRegisters() {
registers = new Register [] {
/* ここにレジスタを定義 */
};
}
-変更後
/**
* レジスタのセット
*/
public final void setRegisters() {
registers = new Register [] {
getRegister("reg_counter")
};
}
***レジスタの取得 [#g5a17f8f]
モジュールの定義で既にレジスタを宣言しているので、モジュールのハッシュからレジスタだけを以下のメソッドを使って抜き出します。
getRegister("レジスタ名");
**simulate [#y9870878]
シミュレーションの内容を定義します。
定義する必要があるのは大きく分けると以下の2つです。
-ワイヤが伝搬する値
-レジスタの更新後の値
逐次処理で実行できるように、実行順序に気をつけてください。
-変更前
/**
* 回路のシミュレーションの実行
*/
public final void simulate() {
/* シミュレーションの内容を定義 */
}
-変更後
/**
* 回路のシミュレーションの実行
*/
public final void simulate() {
setWire("imm_val", module("imm_1"));
setWire("counter_value", module("reg_counter"));
setWire("adder_result", module("adder", wire("counter_value"), wire("imm_val")));
setRegister("reg_counter", wire("adder_result"));
}
***モジュールの起動 [#f80894be]
モジュールを使って演算を行いたいときは、以下のメソッドを使用します。
module("モジュール名")
module("モジュール名", 引数1, 引数2,...)
引数の数と意味はモジュールによって異なります。[[こちら>#e77b60d0]]で確認してください。
***ワイヤに値を設定 [#r4dd4f00]
ワイヤに値を設定するためには以下のメソッドを使用します。
setWire("ワイヤ名", 設定する値);
setWire("ワイヤ名", module("モジュール名"));
setWire("ワイヤ名", module("モジュール名", 引数1, 引数2,...));
***ワイヤの値を取得 [#ge08ef20]
ワイヤに入っている値を取得するためには以下のメソッドを使用します。
wire("ワイヤ名");
***ビット幅を指定してワイヤの値を取得 [#z921e149]
ビット幅を指定してワイヤに入っている値を取得するためには以下のメソッドを使用します。
wire("ワイヤ名", 31, 26);
これはワイヤ名[31:26]と同義になります。
***レジスタの値の更新 [#c6d9bb6a]
レジスタの値を更新するためには以下のメソッドを使用します。
setRegister("レジスタ名", 更新する値);
setRegister("レジスタ名", 更新する値, 書き込み制御信号);
setRegister("レジスタ名", wire("更新する値が入ったワイヤ名"));
setRegister("レジスタ名", wire("更新する値が入ったワイヤ名"), wire("書き込み制御信号の値が入ったワイヤ名"));
*回路の登録 [#x251fb6b]
回路の登録に関する詳細。
**基本回路クラスの登録 [#je74df51]
GlobalObjects.javaのBASIC_CIRCUITSに実装した基本回路クラスを登録。
-変更前
// 基本回路
public static final BasicCircuit [] BASIC_CIRCUITS = new BasicCircuit [] {
new Counter(),
new UpDownCounter(),
...
};
-変更後
// 基本回路
public static final BasicCircuit [] BASIC_CIRCUITS = new BasicCircuit [] {
new Counter(),
new UpDownCounter(),
...,
new [実装したクラス名]()
};
*基本モジュール一覧 [#e77b60d0]
mips_sim.circuit.basicmodules.*をインポートして使用する。
**Adder [#y3eef26e]
-コンストラクタ
new Adder("回路の名称");
-実行時の引数(2)
--入力1
--入力2
-得られる値
--入力1 + 入力2
**AndLogicGate [#ued7c3f6]
-コンストラクタ
new AndLogicGate("回路の名称");
-実行時の引数(2)
--入力1
--入力2
-得られる値
--入力1 & 入力2
**Comparetor [#b14ff042]
-コンストラクタ
new Comparetor("回路の名称");
-実行時の引数(2)
--入力1
--入力2
-得られる値
--(入力1 == 入力2) ? 1 : 0
**Extend [#z2cb5cd0]
-コンストラクタ
new Extend("回路の名称");
-実行時の引数(2)
--入力1
--符号拡張方式
---GlobalObjects.ZERO_EXTEND (ゼロ拡張)
---GlobalObjects.SIGN_EXTEND (符号拡張)
-得られる値
--ゼロ拡張 or 符号拡張の結果
**ExternalInput [#lad1d76d]
-コンストラクタ
new ExternalInput("回路の名称");
-実行時の引数(0)
-得られる値
--標準入力の値
**ImmediateValue [#kd7aed04]
-コンストラクタ
new ImmediateValue("回路の名称", 出力する即値);
-実行時の引数(0)
-得られる値
--コンストラクタで指定した値
**Memory [#t4609449]
-コンストラクタ
new Memory("回路の名称");
new Memory("回路の名称", ベースアドレス);
**Mux2 [#nf8a0e3a]
-コンストラクタ
new Mux2("回路の名称");
-実行時の引数(3)
--入力1
--入力2
--選択制御信号
-得られる値
--選択制御信号が0のとき入力1、1のとき入力2
**Mux4 [#y919ed87]
-コンストラクタ
new Mux4("回路の名称");
-実行時の引数(5)
--入力1
--入力2
--入力3
--入力4
--選択制御信号
-得られる値
--選択制御信号が0のとき入力1、1のとき入力2、2のとき入力3、3のとき入力4
**OrLogicGate [#h6adfff1]
-コンストラクタ
new OrLogicGate("回路の名称");
-実行時の引数(2)
--入力1
--入力2
-得られる値
--入力1 | 入力2
**Register [#aca85159]
-コンストラクタ
new Register("回路の名称", 初期値);
-得られる値
--レジスタの値
**RegisterWithEnable [#l50771b8]
-コンストラクタ
new RegisterWithEnable("回路の名称", 初期値);
new RegisterWithEnable("回路の名称", 初期値, 書き込み制御タイプ);
-パラメータの指定方法
--書き込み制御タイプ
---true (1のときイネーブル)
---false (0のときイネーブル)
-得られる値
--レジスタの値
**RegisterWithResetEnable [#gbf86616]
-コンストラクタ
new RegisterWithResetEnable("回路の名称", 初期値);
new RegisterWithEnable("回路の名称", 初期値, 書き込み制御タイプ, リセット制御タイプ);
-パラメータの指定方法
--書き込み制御タイプ
---true (1のときイネーブル)
---false (0のときイネーブル)
--リセット制御タイプ
---true (1のときリセット)
---false (0のときリセット)
-得られる値
--レジスタの値
**Shifter [#maaab97f]
-コンストラクタ
new Shifter("回路の名称", シフト方向, シフト量);
-パラメータの指定方法
--シフト方向
---GlobalObjects.SHIFT_LEFT (左シフト)
---GlobalObjects.SHIFT_RIGHT (右シフト)
-得られる値
--シフト後の値
ページ名: