函数とプロシージャとを作る

pp.21-22

ということなので、意味のない単純な函数とプロシージャとを作って試してみる。ここではどちらもアーキテクチャに記述した。

entity sute_vhdl is
    port(
        num_in: in natural range 0 to 7;
        
        num_in_thru   : out natural range 0 to 7;
        num_out_plus_1: out natural range 0 to 8;
        num_out_plus_2: out natural range 0 to 9
    );
end entity;

architecture rtl of sute_vhdl is

   -- 函数を定義する。
    function plus_1(num: natural) -- 引数の範囲は指定してもしなくてもよい。
        return natural -- 返値の範囲は指定できない。
    is
    begin
        return num + 1;
    end;

   -- プロシージャを定義する。
    procedure plus_2(
        signal   sig_in : in  natural;
        variable out_val: out natural
    ) is
    begin
        out_val := sig_in + 2;
    end;

begin
    num_in_thru <= num_in; -- 確認のため入力をそのまま出力する。

    process(all)
        variable sute_var: natural;
    begin
        num_out_plus_1 <= plus_1(num_in); -- 函数をコールする。
        plus_2(num_in, sute_var); -- プロシージャをコールする。
        num_out_plus_2 <= sute_var;
    end process;
    
end architecture;

左の4ビットが入力をそのまま出力したもの(7)。
その右隣の4ビットが、函数を使って入力に1足したもの(8)。
さらにその右隣の4ビットが、プロシージャを使って入力に2足したもの(9)。
f:id:ti-nspire:20210707142753j:plain:w500