web-dev-qa-db-ja.com

VHDL変数対。信号

私はVHDLプログラミングに関するテキストを読んでいます(タイトルを付けることはできません)。私がテキストから理解するのに苦労してきた1つの問題は、変数対信号をいつ使用するかです。シグナル(つまり内部シグナル)をいつ使用するかについては明確に理解していると思いますが、変数にはそれほど多くありません。

テキストは通常​​、プロセスを定義する前にシグナルを宣言および初期化しますが、変数はプロセス内で宣言されます(初期化されることはないと思います)。

とにかくそれをクリアするには、定義または例のいずれかで素晴らしいでしょう!

33
doddy

変数は、通常の並列コードとは異なり、シリアル化されたコードを作成するときに使用されます。 (シリアル化とは、コマンドが一緒にではなく順番に実行されることを意味します)。変数はプロセス内にのみ存在でき、値の割り当ては並列ではありません。たとえば、次のコードを考えます。

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'abの両方に挿入します。

率直に言って、私の経験では、ほとんどの場合、変数を使用する必要はありません。変数を使用した唯一の場所は、いくつかの信号のいずれかが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 =>
            --...
40
SIMEL

変数は、プロセス内で値を保存するために使用されることを目的としています。そのため、範囲は限られています。合成されたハードウェアとの直接的な関係はあまりありません。

変数もすぐに値を取得しますが、シグナルは取得しません。次の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;

これは、更新がスケジュールされているが、実際にはまだ変更されていないためです。 <=には時間要素が含まれます。

12
Voider

変数:一時的な場所;それらは「プロセス」内に中間値を保存するために使用されます。

signals:シグナル値を更新します。シグナルの変更によってアクティブ化された実行プロセス。プロセスの実行中は、システム内のすべてのシグナルは変更されません。

違い:

変数:それらはローカルです;遅延なし;プロセス内で宣言された

signals:これらはグローバルです(開始前)。ワイヤーによる遅延。キーワードの開始前に宣言

7
deepika

サイドノートでは、変数はプロセス内だけでなく(たとえば、プロシージャ内でも)生きることができず、さらに複数のプロセスからアクセス可能な共有変数にすることができます(参照: http://www.ics.uci.edu/~ jmoorkan/vhdlref/var_dec.html )。

1
Piedone