range と length と subtype
signal の指定は range と length を使うと便利。
信号の宣言
signal s_addr0 : std_logic_vector(17 downto 0); signal s_addr1 : std_logic_vector(17 downto 0); signal s_addr2 : std_logic_vector(17 downto 0);
信号の宣言(range)
signal s_addr0 : std_logic_vector(17 downto 0); signal s_addr1 : std_logic_vector(addr0'range); signal s_addr2 : std_logic_vector(addr0'range);
こうすると、s_addr0 のバス幅を変えるだけですべてのバス幅が変わる。
アドレスやデータなど幅が統一な場合に使える。
この場合は、addr0'range = 17 downto 0 に変換される。
信号の宣言(subtype)
subtype ADDR_BUS is std_logic_vector(17 downto 0); signal s_addr0 : ADDR_BUS; signal s_addr1 : ADDR_BUS; signal s_addr2 : ADDR_BUS;
C言語で言うところの typedef に相当。
自分の分かりやすい名前で型を定義できる。
一括変更も簡単。
length
バス幅を返す。
使い方は下記のような感じ。
signal s_addr0 : std_logic_vector (17 downto 0); ----- s_addr0 <= conv_std_logic_vector(count/5 + 128, s_addr0'length);
conv_std_logic_vector(i,l) は第一引数i に integer の数値、
第二引数l に 変換後のバス幅を入れることで 幅l の std_logic_vector型 に
変換をしてくれる。
この場合は s_addr0'length = 18 に変換される。
こうすると、バス幅が変わった時に修正する必要がなくなる。
そんな感じ。