私はVHDLプログラミングに関するテキストを読んでいます(タイトルを付けることはできません)。私がテキストから理解するのに苦労してきた1つの問題は、変数対信号をいつ使用するかです。シグナル(つまり内部シグナル)をいつ使用するかについては明確に理解していると思いますが、変数にはそれほど多くありません。
テキストは通常、プロセスを定義する前にシグナルを宣言および初期化しますが、変数はプロセス内で宣言されます(初期化されることはないと思います)。
とにかくそれをクリアするには、定義または例のいずれかで素晴らしいでしょう!
変数は、通常の並列コードとは異なり、シリアル化されたコードを作成するときに使用されます。 (シリアル化とは、コマンドが一緒にではなく順番に実行されることを意味します)。変数はプロセス内にのみ存在でき、値の割り当ては並列ではありません。たとえば、次のコードを考えます。
signal a,b : std_logic_vector(0 to 4);
process (CLK)
begin
if (rising_Edge(clk)) then
a <= '11111';
b <= a;
end if;
end process;
プロセスが実行される前にb
の値をa
に入れますが、'11111
'。一方、コード:
signal a,b : std_logic_vector(0 to 4);
process (CLK)
variable var : std_logic_vector(0 to 4);
begin
if (rising_Edge(clk)) then
var := '11111';
a <= var;
b <= var;
end if;
end process;
値'11111'
をa
とb
の両方に挿入します。
率直に言って、私の経験では、ほとんどの場合、変数を使用する必要はありません。変数を使用した唯一の場所は、いくつかの信号のいずれかが1かどうかをチェックする必要があるループ内でした。
type BitArray is array (natural range <>) of std_logic;
--...
entity CAU_FARM is
port
(
-- IN --
REQUEST : in BitArray(0 to (FLOW_num -1));
--..
);
end CAU_FARM;
--...
farm_proc: process(CLK_FARM, RESET)
variable request_was_made_var : std_logic;
begin
if RESET = C_INIT then
-- ...
elsif rising_Edge(CLK_FARM) then
-- read state machine --
case read_state is
when st_read_idle =>
request_was_made_var := '0';
for i in 0 to (FLOW_num -1) loop
if (REQUEST(i) = '1') then
request_was_made_var := '1';
end if;
end loop;
if (request_was_made_var = '1') and (chosen_cau_read_sig /= 8) then
read_state <= st_read_stage_1;
for i in 0 to (FLOW_num -1) loop
if (i = choice_out_sig) then
ACKNOWLEDGE(i) <= '1';
end if;
end loop;
else
read_state <= st_read_idle;
end if;
------------------------
when st_read_stage_1 =>
--...
変数は、プロセス内で値を保存するために使用されることを目的としています。そのため、範囲は限られています。合成されたハードウェアとの直接的な関係はあまりありません。
変数もすぐに値を取得しますが、シグナルは取得しません。次の2つのプロセスの効果は同じです。
signal IP, NEXTP : STD_LOGIC_VECTOR(0 to 5);
process (CLK)
Variable TEMP : STD_LOGIC_VECTOR(0 to 5);
begin
if (rising_Edge(clk)) then
TEMP := IP;
IP <= NEXTP;
NEXTP <= TEMP(5) & TEMP(0 to 4);
end if;
end process;
signal IP, NEXTP : STD_LOGIC_VECTOR(0 to 5);
process (CLK)
begin
if (rising_Edge(clk)) then
IP <= NEXTP;
NEXTP <= IP(5) & IP(0 to 4);
end if;
end process;
これは、更新がスケジュールされているが、実際にはまだ変更されていないためです。 <=
には時間要素が含まれます。
変数:一時的な場所;それらは「プロセス」内に中間値を保存するために使用されます。
signals:シグナル値を更新します。シグナルの変更によってアクティブ化された実行プロセス。プロセスの実行中は、システム内のすべてのシグナルは変更されません。
違い:
変数:それらはローカルです;遅延なし;プロセス内で宣言された
signals:これらはグローバルです(開始前)。ワイヤーによる遅延。キーワードの開始前に宣言
サイドノートでは、変数はプロセス内だけでなく(たとえば、プロシージャ内でも)生きることができず、さらに複数のプロセスからアクセス可能な共有変数にすることができます(参照: http://www.ics.uci.edu/~ jmoorkan/vhdlref/var_dec.html )。