2016-11-03 2 views
1

Je veux faire un simple code vhdl qui fait un délai de 20 secondes avant qu'un led soit allumé. J'ai utilisé un compteur de signal pour faire le retard des 20 sec, mais j'ai remarqué une chose très étrange, si je ne déclare pas que la led est éteinte avant le délai, la led sera toujours allumée.VHDL Delay avant d'allumer le led

regard sur les deux codes (l'horloge est 50MHz):

dans ce code, le led est toujours allumé.

library ieee; 
use ieee.std_logic_1164.all; 
entity check is 
port(clk : in std_logic; 
     led : out std_logic); 
end check; 

architecture arc of check is 
signal counter : integer range 0 to 100e6; 
begin 
process(clk) 
begin 
if rising_edge(clk) then 
    if counter<500e6 then 
     counter<=counter+1; 
    else 
     led<='1'; 
    end if; 
end if; 
end process; 
end arc; 

Dans ce code, la led est allumée seulement après 20 secondes.

library ieee; 
use ieee.std_logic_1164.all; 
entity check is 
port(clk : in std_logic; 
     led : out std_logic); 
end check; 

architecture arc of check is 
signal counter : integer range 0 to 100e6; 
begin 
process(clk) 
begin 
if rising_edge(clk) then 
    if counter<500e6 then 
     counter<=counter+1; 
     led<='0'; 
    else 
     led<='1'; 
    end if; 
end if; 
end process; 
end arc; 
+0

Si ce code fonctionne en simulation, le simulateur est cassé. Il ne peut jamais allumer la LED. –

Répondre

0

Vous devez initialiser à la fois le compteur et le led. En simulation, quand vous ne faites pas cela, la valeur de chaque signal non initialisé sera 'U', ce qui signifie que vous ne pouvez pas être sûr de la valeur qu'il aura dans le système réel. Peut être à la fois 0 ou 1. Vous pouvez utiliser: = '0' dans la déclaration de port. Probablement led est toujours allumé, car selon ce code, si le compteur < 500e6, la valeur de 'led' n'a pas d'importance et c'est 1, donc le compilateur l'a simplifié, parce que la seule valeur que le programme met à'led' est '1'.