Задержка VHDL перед освещением

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

посмотрите на два кода (тактовая частота 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;

1 ответ

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

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

Другие вопросы по тегам