算術論理演算回路では, 同時処理文 を用いて組合せ回路を設計しました.今度は, 順次処理文 を用いて組合せ回路を設計してみましょう.設計対象は,命令デコーダです.
先ほどダウンロードしたidc_seq.vhdファイルの命令デコード部 (118行目)を御覧下さい.ここでは,順次処理文であるプロセス文を用いて 命令デコーダの設計を行っています.プロセス文中の動作記述は,プロセス文 中で使用できるif文およびcase文を用いて定義しています.組合せ回路を設計 する際に問題になるのは,プロセス文のセンシティビティ リストです.センシティビティリストとは,プロセス文を評価するタ イミングを示す信号のリストです.言い換えれば,センシティビティリスト中 の信号が変化すると,プロセス文が実行されます.つまり,組合せ回路をプロ セス文を用いて設計するには,センシティビティリストにプロセス文中の式 (expression)で用いられる信号をすべて記述する必要があります.
では,センシティビティリストを書いてみましょう!
DECODE_PROC : process() begin case IR(15 downto 12) is when "0000" => PRESENT_INST <= LD_D; when "0001" => PRESENT_INST <= ST_D; when "0010" => PRESENT_INST <= CALL; when "0011" => PRESENT_INST <= JP; . . .
では,次にデコード部の動作を記述してみましょう.デコードの記述は, idc_seq.vhdの120行目から186行目までで記述しています.KITE-1 マイクロプロセッサの命令では,命令アドレッシングによって命令のオペレー ションコード長(4ビット[直接],6ビット[レジスタ,含意],8ビット[インデッ クス修飾,即値])が異なります.そこで,3つのcase文を用いて定義しています.
では,ロード命令(インデックス修飾)のためのデコードを行いましょう.ロー ド命令(インデックス修飾)のオペレーションコードは"11000010",その時の PRESENT_INSTはLD_IXと宣言してください.
case IR(15 downto 8) is when "11000001" => PRESENT_INST <= LD_IM; when "10010001" => PRESENT_INST <= OR_IM; when "10000001" => PRESENT_INST <= ADD_IM; when "10000101" => PRESENT_INST <= SUB_IM; when "10010101" => PRESENT_INST <= EOR_IM; when "10011001" => PRESENT_INST <= AND_IM; -- when "11000110" => PRESENT_INST <= ST_IX; when "10000010" => PRESENT_INST <= ADD_IX; when "10000110" => PRESENT_INST <= SUB_IX; when "10011010" => PRESENT_INST <= AND_IX; when "10010010" => PRESENT_INST <= OR_IX; when "10010110" => PRESENT_INST <= EOR_IX; when others => NULL; end case;