2016-11-03 2 views
1

Я хочу сделать простой код VHDL, который задерживает 20 секунд, прежде чем светодиод будет включен. Я использовал счетчик сигналов, чтобы сделать задержку в 20 секунд, но я заметил очень странную вещь, если я не заявляю, что светодиод выключен до задержки, светодиод всегда будет включен.VHDL Задержка перед включением освещения

взгляд на двух кодов (часы является 50МГц):

в этом коде светодиод всегда включен.

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; 

В этом коде светодиод включен только через 20 секунд.

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

Если этот код работает в симуляции, симулятор сломан. Он никогда не может включить светодиод. –

ответ

0

Вы должны инициализировать счетчик и светодиод. В симуляции, когда вы этого не сделаете, значение каждого неинициализированного сигнала будет «U», что означает, что вы просто не можете быть уверены, какое значение оно будет иметь в реальной системе. Может быть как 0, так и 1. Вы можете использовать: = '0' в объявлении порта.

Вероятно, светодиод всегда включен, поскольку в соответствии с этим кодом, если счетчик < 500e6, значение «led» не имеет значения, а еще 1, поэтому компилятор упростил его, поскольку единственное значение, которое программа устанавливает на «led» - «1».

Смежные вопросы