KITE-1マイクロプロセッサの算術論理演算回路では,下表に示すような処理を 実行する必要があります.これから各命令の動作を記述していくわけですが,
「if (制御コード = ) then 加算を行え!」
というように0x0000というバイナリコードをソース中にたくさん書いてしまう と,非常に可読性の悪いソースになってしまいます.そこで,このように定数 として使用するものは, 定数オブジェクト を用いて宣言します.
本来は,ALUの命令セットなどの定義はソースファイル中に行うのではなく別 ファイルにパッケージとして定義した方がソースの可読性も良いのですが,今 回の演習ではソース中に書き込むこととします.
KITE-1マイクロプロセッサの演算命令の動作がわからない方は,表内の演算内
容をクリックして動作を確認してください.
では,算術論理演算回路の命令セットを記述していきましょう.
定数オブジェクト
は,
アーキテクチャ
の中で定義します.ですから,まずarchitectureの記述を行いましょう.なお,
今回の演習では下記の記述のようにBEHAとしてくだ
さい.定数名は上表の演算内容の()内の表記を用いています.
アーキテクチャで動作の記述を行う際,
同時処理文
のみで記述する方法と
順次処理文
も用いて記述する方法の2通りがあります.順次処理文は順序回路を作成する
際には必ず使用する必要がありますが,算術論理演算回路は組合せ回路ですか
ら演習の意味も含めて同時処理文のみを用いて設計していきます.順次処理文
は本コースの制御回路設計時に使用します.
組合せ回路だからといって必ずしも同時処理文を用いなければならないことは
ありません.一般には,順次処理文の方が同時処理文より記述しやすく設計者
も理解しやすいため,順次処理文で書かれることが多いようです.ここでは,
演習のため同時処理文を用いています.
では,動作の定義を行う前に,算術論理演算回路で用いる信号オブジェクトの
宣言を行います.信号オブジェクトとしては加減算の結果からキャリ(ボロー)
を得るために,算術論理演算回路の入出力データ長より1ビット長い
TMP と可読性を高めるために状態フラグ(CARRY,OFLOW,
ZERO,SIGN)を宣言します.
VHDLのデータオブジェクトには,
定数オブジェクト
以外に
信号オブジェクト
と
変数オブジェクト
があります.変数オブジェクトは順次処理文中でのみ使用でき,同時処理文中
では使用できません.ですから,上記の宣言では信号オブジェクトで宣言して
います.
S_ALU(3)
S_ALU(2)
S_ALU(1)
S_ALU(0)
演算内容
加算(IADD)
減算(ISUB)
インクリメント(IINC)
デクリメント(IDEC)
論理和(IOR)
論理積(IAND)
排他的論理和(IEOR)
補元(INOT)
論理左シフト(ILSL)
算術左シフト(IASL)
論理右シフト(ILSR)
算術右シフト(IASR)
左回転(IROL)
右回転(IROR)
スワップ(ISWP)
architecture of ALU is
constant IADD : STD_LOGIC_VECTOR(3 downto 0) := "0000";
constant ISUB : STD_LOGIC_VECTOR(3 downto 0) := "0001";
.
.
.
end BEHA;
信号オブジェクトの宣言
信号オブジェクトの宣言が終了したら,動作を記述する前にbeginを記述して
下さい.
architecture BEHA of ALU is
constant IADD : STD_LOGIC_VECTOR(3 downto 0) := "0000";
constant ISUB : STD_LOGIC_VECTOR(3 downto 0) := "0001";
.
.
.
signal TMP : STD_LOGIC_VECTOR(16 downto 0);
signal CARRY : STD_LOGIC;
.
.
.
end BEHA;
完成しましたか? では,次に算術論理演算回路の各命令の動作定義を行いま
しょう.
ホーム
シミュレーション
辞書