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!
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 =>
--...
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.
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é
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 ).