CPU、ROM、クロックジェネレーターをまとめてCPU1738を完成させる

ROM、クロックジェネレーターは、『CPUの創りかた』のときに作ったVHDLをそのまま使った。

これで一往完成である。

library ieee;
use ieee.std_logic_1164.all;

entity cpu1738 is
    port(
        source_clk   : in std_logic;
        manual_clk_in: in std_logic;
        sel          : in std_logic_vector(1 downto 0);
        aclr_n       : in std_logic;
        inp          : in std_logic_vector(3 downto 0);

        halt   : out std_logic;
        a_reg  : out std_logic_vector(3 downto 0);
        b_reg  : out std_logic_vector(3 downto 0);
        outp   : out std_logic_vector(3 downto 0);
        clk_out: out std_logic
    );
end entity;

architecture rtl of cpu1738 is
    signal address      : std_logic_vector(3 downto 0);
    signal data         : std_logic_vector(7 downto 0);
    signal clk_inside   : std_logic;
    signal delayed_clk_0: std_logic;
    signal delayed_clk_1: std_logic;
begin
    module_cpu: entity work.cpu
    port map(
        aclr_n  => aclr_n, -- 外部へ配線
        inp     => inp, -- 外部へ配線
        data    => data,
        clk     => delayed_clk_1,
        halt    => halt, -- 外部へ配線
        a_reg   => a_reg, -- 外部へ配線
        b_reg   => b_reg, -- 外部へ配線
        address => address,
        outp    => outp -- 外部へ配線
    );
    
    module_clk_gen: entity work.clk_gen
    port map(
        clk           => source_clk,
        manual_clk_in => manual_clk_in,
        sel           => sel,
        clk_out       => clk_inside
    );
    
    module_rom: entity work.rom
    port map(
        clock   => clk_inside,
        address => address,
        q       => data
    );

   -- 確認のためクロックジェネレーターの出力を外へ出す。
    clk_out <= clk_inside;

   --『CPUの創りかた』と同じく、CPUへ与えるクロックを少し遅らせる。
    process(clk_out)
    begin
        if rising_edge(source_clk) then
            delayed_clk_0 <= clk_inside;
            delayed_clk_1 <= delayed_clk_0;
        end if;
    end process;
end architecture;

RTLビュー:
f:id:ti-nspire:20210915153148p:plain