pp.274-276
コメントを足した以外はテキストのままである。
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity ram_dc_wb is port( CLK_DC : in std_logic; CLK_WB : in std_logic; RAM_ADDR : in std_logic_vector(7 downto 0); RAM_IN : in std_logic_vector(15 downto 0); IO65_IN : in std_logic_vector(15 downto 0); RAM_WEN : in std_logic; RAM_OUT : out std_logic_vector(15 downto 0); IO64_OUT : out std_logic_vector(15 downto 0) ); end ram_dc_wb; architecture RTL of ram_dc_wb is subtype RAM_WORD is std_logic_vector(15 downto 0); -- RAM_WORDという、16ビットの型を宣言し、 type RAM_ARRAY_TYPE is array (0 to 63) of RAM_WORD; -- RAM_ARRAY_TYPEという、RAM_WORD × 64本の型を宣言し、 signal RAM_ARRAY : RAM_ARRAY_TYPE; -- それを実体化 signal ADDR_INT : integer range 0 to 255; begin ADDR_INT <= conv_integer(RAM_ADDR); -- 配列 RAM_ARRAY の読み出し処理 process (CLK_DC) begin if (CLK_DC'event and CLK_DC = '1') then -- decodeクロックが立ち上がっって、 if (ADDR_INT < 64) then -- アドレスが64未満であったら、 RAM_OUT <= RAM_ARRAY(ADDR_INT); -- そのアドレスのRAMを読み出してexecモジュールへ与えるが、 elsif (ADDR_INT = 65) then -- アドレスが65であったら、 RAM_OUT <= IO65_IN; -- INポートから読み出してexecモジュールへ与える。 end if; end if; end process; -- 配列 RAM_ARRAY の書き込み処理 process (CLK_WB) begin if (CLK_WB'event and CLK_WB = '1') then -- write backクロックが立ち上がって、 if (RAM_WEN = '1') then -- write enableが有意であって、 if (ADDR_INT < 64) then -- アドレスが64未満であったら、 RAM_ARRAY(ADDR_INT) <= RAM_IN; -- execから出てきた値をそのアドレスのRAMへ書き込むが、 elsif (ADDR_INT = 64) then -- アドレスが64であったら、 IO64_OUT <= RAM_IN; -- OUTポートへ出力する。 end if; end if; end if; end process; end RTL;
シンボル化して下のように配線した。