命令デコーダーをVHDLで書き換える

今度は命令デコーダーをVHDLで書き換える。p.242の真理値表をそのまま記述する。

library ieee;
use ieee.std_logic_1164.all;

entity instruction_decoder is
    port(
        c_flag_n: in std_logic;
        op_code : in std_logic_vector(3 downto 0);

       -- "00"のときA_REGを選択、"01"のときB_REGを選択、"10"のときINポートを選択 
        sel: out std_logic_vector(1 downto 0);

       -- "1110"のときA_REGにロード、"1101"のときB_REGにロード、
       -- "1011"のときOUT_REGにロード、"0111"のときPCにロード  
        load_n: out std_logic_vector(3 downto 0)
    );
end entity;

architecture rtl of instruction_decoder is 
    signal load_n_sel: std_logic_vector(5 downto 0);
begin

   -- ページ242の真理値表を書き写す。
   -- 最適化された最終的な回路に合わせてc_flagは反転してc_flag_nにした。
    load_n_sel <= "1110" & "00" when op_code = "0000" else -- ADD A, Im
                  "1110" & "01" when op_code = "0001" else -- MOV A, B
                  "1110" & "10" when op_code = "0010" else -- IN A
                  "1110" & "11" when op_code = "0011" else -- MOV A, Im
                  "1101" & "00" when op_code = "0100" else -- MOV B, A
                  "1101" & "01" when op_code = "0101" else -- ADD B, Im
                  "1101" & "10" when op_code = "0110" else -- IN B
                  "1101" & "11" when op_code = "0111" else -- MOV B, Im
                  "1011" & "01" when op_code = "1001" else -- OUT B
                  "1011" & "11" when op_code = "1011" else -- OUT Im
                  "0111" & "11" when op_code = "1110" and c_flag_n = '1' else -- JNC (C=0)
                  "1111" & "--" when op_code = "1110" and c_flag_n = '0' else -- JNC (C=1)
                  "0111" & "11" when op_code = "1111" else -- JMP
                  "----" & "--" ; -- 必ずデフォルトを記述する。

   -- A、B、OUTの各レジスタおよびPCへ与える!ロード信号を抜いて返す。
    load_n <= load_n_sel(5 downto 2);
    
   -- マルチプレクサへ与えるセレクト信号を抜いて返す。
    sel <= load_n_sel(1 downto 0);

/*
   -- 最適化された回路(ページ272)をVHDLで表現した例
   sel(1) <= op_code(1);
   sel(0) <= op_code(0) or op_code(3);

   load_n(0) <= op_code(2) or op_code(3);
   load_n(1) <= (not op_code(2)) or op_code(3);
   load_n(2) <= (not op_code(2)) nand op_code(3);
   load_n(3) <= not((c_flag_n or op_code(0)) and op_code(2) and op_code(3));
*/

end architecture;