web-dev-qa-db-fra.com

VHDL Variable Vs. Signal

J'ai lu un texte (je ne l'ai pas devant moi, je ne peux pas donner le titre) sur la programmation VHDL. Un problème que j'ai du mal à comprendre du texte est de savoir quand utiliser une variable par rapport à un signal. Je pense que je comprends très bien quand utiliser un signal (signal interne), mais pas autant pour une variable.

J'ai remarqué que le texte déclare et initialise généralement les signaux avant de définir un processus alors qu'une variable est déclarée (et je suppose jamais initialisée ..) à l'intérieur d'un processus.

Quoi qu'il en soit, éclaircir cela, par définition ou par exemple, serait formidable!

31
doddy

Les variables sont utilisées lorsque vous souhaitez créer un code sérialisé, contrairement au code parallèle normal. (Sérialisé signifie que les commandes sont exécutées dans leur ordre, l'une après l'autre au lieu d'être ensemble). Une variable ne peut exister qu’à l’intérieur d’un processus et l’affectation de valeurs n’est pas parallèle. Par exemple, considérons le code suivant:

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;

mettra dans b la valeur de a avant l'exécution du processus et non pas '11111 '. Par contre, le code:

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;

mettra la valeur '11111' à la fois dans a et b.

Franchement, selon mon expérience, la plupart du temps, vous n'avez pas besoin de variables, le seul endroit où je l'ai utilisé était dans une boucle où je devais vérifier si l'un des signaux était 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 =>
            --...
37
SIMEL

Les variables sont destinées à être utilisées pour stocker une valeur dans un processus. En tant que tel, sa portée est limitée. Il existe une relation moins directe avec le matériel synthétisé. 

Les variables ont également une valeur immédiate, contrairement aux signaux. les deux processus suivants ont le même effet:

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;

En effet, les mises à jour sont planifiées mais n'ont pas encore été modifiées. le <= inclut un élément temporel.

12
Voider

variables: emplacement temporaire; ils sont utilisés pour stocker des valeurs intermédiaires dans "process".

signaux: met à jour les valeurs du signal. Le processus d'exécution est activé par les modifications apportées au signal. Pendant l'exécution du processus, tous les signaux du système restent inchangés.

Différences:

variables: elles sont locales; sans délais; déclaré dans le processus

signaux: Ils sont globaux (avant de commencer); retard dû au fil; déclaré avant le début de la clé

7
deepika

En note, les variables ne peuvent pas vivre uniquement dans les processus (mais aussi, par exemple, dans les procédures), elles peuvent en outre être des variables partagées accessibles à partir de plusieurs processus (voir: http://www.ics.uci.edu/~jmoorkan/ vhdlref/var_dec.html ).

1
Piedone