|
*std_logic_vector
データバスなど幅を持った信号はstd_logicの配列タイプです。 std_logic_vectorにバス幅を定義します。 A:in
std_logic_vector (3 downto 0)
信号名(バス名):A バス幅:4bit B:in
std_logic_vector (0 to 3)
信号名(バス名):B バス幅:4bit
ここで使用しているdowntoは降順を示し、toは昇順を示しています。
演算子(+, -, *, /)あるいは関係演算(=, <, >, /=, <=,>=)を行う場合は、一番左側のビットが演算上の最上位ビット(MSB)でないと正しい演算ができません。
使用するシステムにあわせMSBが一番大きい数字の場合はdowntoを使用し、MSBが0の場合はtoを使用するようにしてください。
[例] 8ビットバッファ
library IEEE;
use IEEE std_logic_1164.all;
entity BUF is
port(
A :in std_logic_vector(7 downto 0);
B :out std_logic_vector(7 downto 0)
);
end BUF;
architecture BUFFER of BUF is
begin
B <= A;
end BUFFER;
*配列のスライス
幅をもった信号から特定のビットの値を切り出すには信号名に括弧を付加し、その中に特定ビットの数字を記述します。
また、ビット幅をもって切り出す場合には、downtoまたはtoを使用します。
[例]
signal A:std_logic_vector(3 downto 0);
signal B:std_logic_vector(7 downto 0);
signal C:std_logic;
signal D:std_logic_vector(7 downto 0);
A
<= B(7 downto 4);
C <= B(2);
D(7 downto 4) <= B(3 downto 0);
ただし、downtoで宣言したものはdowntoでしか、toで宣言したものはtoでしか取り出せません。
signal A:std_logic_vector(3 downto 0);
signal B:std_logic_vector(7 downto 0);
A <= B(4 to 7); できません
*ビットの結合(連結子と集合体)
ビットを結合させる場合は、連接子“&”を使います。
signal a :std_logic_vector(3 downto 0);
signal en :std_logic;
signal b :std_logic_vector(3 downto 0);
signal y :std_logic_vector(7 downto 0);
b <= a and ( en & en & en & en ); ビット同士の結合例
y <= a & b; ベクタの結合例
結合は、左側に書いたものが左側、右側に書いたものが右側になります。
上記の例を展開すると以下のようになります。
b(3) <= a(3) and en;
b(2) <= a(2) and en;
b(1) <= a(1) and en;
b(0) <= a(0) and en;
y(7) <= a(3);
y(6) <= a(2);
y(5) <= a(1);
y(4) <= a(0);
y(3) <= b(3);
y(2) <= b(2);
y(1) <= b(1);
y(0) <= b(0);
ビットの結合はこの他に集合体を使用する方法もあります。
b <= (en,en,en,en); ただし、集合体はベクタ同士を結合することはできません。
y <= ( a,b ); これはエラーです
集合体はビット指定することもできます。
b <= (3 => en,2 => en,1 => en,0 => en);
b <= ( 3 downto 0 => en);
また、ビット指定では“others”(残りのすべて)というオプションもあります。
b <= (others => en); “others”の利用方法は例えば2ビット目だけ0であれば
b <= ( 2 => 0,others => en); 記述します。
|
|
|