ROM部を作る

pp.195-196

これもテキストどおりである。この段階ではVHDLの中にマシン語を直接記述している(すなわちROM (のようなもの)をLEで実現している)が、最終的にはメモリーブロックに移すとの由。

-- fetch.vhd
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity fetch is
    port(
        CLK_FT  : in std_logic;
        P_COUNT : in std_logic_vector(7 downto 0);  -- アドレスは8ビット幅
        
        PROM_OUT : out std_logic_vector(14 downto 0) -- マシン語は15ビット幅
    );
end fetch;

architecture RTL of fetch is

subtype WORD is std_logic_vector(14 downto 0); -- 15ビット幅のデータ型WORDを作っておいて、
type MEMORY is array (0 to 15) of WORD;        -- そのデータ型 × 16本の排列MEMORYを作って、
constant MEM : MEMORY :=                       -- その排列をMEMという名前で宣言して初期化する。
    (
        "100100000000000", -- ldh Reg0, 0
        "100000000000000", -- ldl Reg0, 0
        "100100100000000", -- ldh Reg1, 0
        "100000100000001", -- ldl Reg1, 1
        "100101000000000", -- ldh Reg2, 0
        "100001000000000", -- ldl Reg2, 0
        "100101100000000", -- ldh Reg3, 0
        "100001100001010", -- ldl Reg3, 10
        "000101000100000", -- add Reg2, Reg1
        "000100001000000", -- add Reg0, Reg2
        "111000001000000", -- st  Reg0, 64
        "101001001100000", -- cmp Reg2, Reg3
        "101100000001110", -- je  14
        "110000000001000", -- jmp 8
        "111100000000000", -- hlt
        "000000000000000"  -- nop
    );

begin
    process(CLK_FT)
    begin
        if (CLK_FT'event and CLK_FT = '1') then
           -- MEM(インデックス)という構文で排列の要素を参照するが、
           -- MEMのインデックスはinteger型であり、P_COUNTはstd_logic_vector型であるため、
           -- conv_integer()を使ってstd_logic_vector型からinteger型へ変換する。
            PROM_OUT <= MEM(conv_integer(P_COUNT(3 downto 0)));
        end if;
    end process;
end RTL;

DIPスイッチでアドレスを設定したあと手動でクロックを送り込んで、アドレスに応じたマシン語が出力されることを確かめる。
f:id:ti-nspire:20210114135834p:plain:h250 f:id:ti-nspire:20210114135916j:plain:h250
f:id:ti-nspire:20210114140745p:plain