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 に変換される。
こうすると、バス幅が変わった時に修正する必要がなくなる。


そんな感じ。