IPカタログを使ってカウンターを自動生成する / 下位VHDLをcompnent宣言してから実体化する

(テキストとは無関係)

前回はテキストどおりにカウンターを一から記述したが、今度はIPカタログを使って自動生成した。モジュロ48 M、モジュロ10の2つのカウンターを生成して、あとは接続するだけでよい。非常にスッキリ書ける。自前のint_to_seven_seg()函数は引数がnaturalなので、ieee.numeric_std.allを利用してunsignedにキャストしてからto_integer()integerに変換した。動作は前回と同じ。
f:id:ti-nspire:20210710130220p:plain

トップレベル:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.seven_segment_pkg.all;

entity slow_counter is
    port(
        reset_n, clock: in  std_logic;
        seven_seg     : out std_logic_vector(6 downto 0)
    );
end;

architecture rtl of slow_counter is

    component counter_48M is
        PORT(
            aclr : IN  STD_LOGIC;
            clock: IN  STD_LOGIC;
            cout : OUT STD_LOGIC
        );
    end component;
    
    component counter_10 is
        PORT(
            aclr : IN STD_LOGIC ;
            cin  : IN STD_LOGIC ;
            clock: IN STD_LOGIC ;
            q    : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)
        );
    end component;

    signal timer_1_sec: std_logic;
    signal digit      : std_logic_vector(3 downto 0);
    
begin

    c1: counter_48M port map(
        aclr  => not reset_n, -- リセットはLo有意にした。
        clock => clock,
        cout  => timer_1_sec
    );

    c2: counter_10 port map(
        aclr  => not reset_n, -- リセットはLo有意にした。
        cin   => timer_1_sec,
        clock => clock,
        q     => digit
    );
    
    seven_seg <= int_to_seven_seg(to_integer(unsigned(digit)));

end;

f:id:ti-nspire:20210710125927p:plain