RAMの読み出し部を作る

pp.198-200

これもテキストのままである。16ビット×256本のRAMのうち1本を選んで出力する。ただしここでは8+1本のなかから選べるようにした。

-- ram_dc.vhd
library IEEE;
use IEEE.std_logic_1164.all;

entity ram_dc is
    port(
        CLK_DC    : in std_logic;
        RAM_AD_IN : in std_logic_vector(7 downto 0);
        
       -- アドレスが8ビット幅なので256本まで指定できるが、
       -- ここでは8+1本のみ使用する。
        RAM_0,
        RAM_1,
        RAM_2,
        RAM_3,
        RAM_4,
        RAM_5,
        RAM_6,
        RAM_7,      
        IO65_IN : in std_logic_vector(15 downto 0);
        
        RAM_AD_OUT : out std_logic_vector(7 downto 0);
        RAM_OUT    : out std_logic_vector(15 downto 0)
    );
end ram_dc;


architecture RTL of ram_dc is

begin
    process(CLK_DC)
    begin
        if(CLK_DC'event and CLK_DC = '1') then
           -- アドレス(RAM_AD_IN)に応じたRAMを出力する。
            case RAM_AD_IN is
                when "00000000" => RAM_OUT <= RAM_0;
                when "00000001" => RAM_OUT <= RAM_1;
                when "00000010" => RAM_OUT <= RAM_2;
                when "00000011" => RAM_OUT <= RAM_3;
                when "00000100" => RAM_OUT <= RAM_4;
                when "00000101" => RAM_OUT <= RAM_5;
                when "00000110" => RAM_OUT <= RAM_6;
                when "00000111" => RAM_OUT <= RAM_7;
                when "01000001" => RAM_OUT <= IO65_IN;
                when others     => null; -- 該当するアドレスのない場合は何もしない。
               --RAM_OUT <= (others => '0'); -- 該当するアドレスのない場合に全ビットを0にしたい場合はこの行を追加する。
               --RAM_OUT <= (others => '1'); -- 該当するアドレスのない場合は全ビットを1にしたい場合はこの行を追加する。
            end case;
        end if;
    end process;

    RAM_AD_OUT <= RAM_AD_IN; -- RAMアドレスは次のステージで使うのでそのまま出力する。

end RTL;

とても全部は試せないので、セレクト信号を0x41 (0d65)にしたときにIO65_INが出力されるのを確かめるにとどめる。RAM_0~7は假想端子につないでおく。
f:id:ti-nspire:20210119070606p:plain:h300 f:id:ti-nspire:20210119062608j:plain:h300