クロックジェネレーター、ROM、CPUを配線して仕上げる

全体を配線して、これで完成である。

library ieee;
use ieee.std_logic_1164.all;

entity top_level_entity is
    generic(
        F_CLK  : natural := 48_000_000;
        FREQ_LO: natural := 1;
        FREQ_HI: natural := 10
    );
    port(
        aclr_n       : in std_logic;
        inp          : in std_logic_vector(3 downto 0);
        source_clk   : in std_logic;
        manual_clk_in: in std_logic;
        sel          : in std_logic_vector(1 downto 0);
        
        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 top_level_entity is
    signal clk_inside   : std_logic;
    signal delayed_clk_0: std_logic;
    signal delayed_clk_1: std_logic;
    signal data         : std_logic_vector(7 downto 0);
    signal address      : std_logic_vector(3 downto 0);
begin

    module_clk_gen: entity work.clk_gen
        generic map(
            F_CLK   => F_CLK,
            FREQ_LO => FREQ_LO,
            FREQ_HI => FREQ_HI
        )
        port map(
            clk           => source_clk,    -- 外部へ配線
            manual_clk_in => manual_clk_in, -- 外部へ配線
            sel           => sel,           -- 外部へ配線
            clk_out       => clk_inside
        );
        
    module_td4: entity work.td4
        port map(
            clk     => delayed_clk_1,
            aclr_n  => aclr_n, -- 外部へ配線
            inp     => inp,    -- 外部へ配線
            data    => data,
            a_reg   => a_reg,  -- 外部へ配線
            b_reg   => b_reg,  -- 外部へ配線
            outp    => outp,   -- 外部へ配線
            address => address
        );

    module_rom: entity work.rom
        port map(
            address => address,
            q       => data,
            clock   => clk_inside
        );
        
   -- ROMへ与えるクロックよりもCPUへ与えるクロックを遅らせるためDFFに2回通す。
    process(source_clk)
    begin
        if rising_edge(source_clk) then
            delayed_clk_0 <= clk_inside;
            delayed_clk_1 <= delayed_clk_0;
        end if;
    end process;
        
   -- 確認用としてクロックを出力する。
    clk_out <= clk_inside; 
end architecture;

テキストのラーメンタイマー(3分15秒タイマー)を10 Hzクロックで動かしている(結局19.5秒タイマーである)。