По мотивам темы в одном из блогов "Простенькие примеры на VHDL" на easyelectronics, пытаюсь выполнить мигалку светодиодом. Логика ее работы такова: в зависимости от состояния переключателя ( ноль или единица) светодиод должен мигать с частотой входящего сигнала от кварца или в десять раз медленнее. Но какую то ошибку все же я не вижу, так как в самом устройстве уже, корректно работает только ветка с условием "1 на входе", а если "0", то светодиод чуть светится, причем непрерывно.
Направьте пожалуйста на путь истинный.
П.С. Код прилагаю.
Код: Выделить всё
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.std_logic_unsigned.all;
entity Migalka is
port( Knopka, CLK: in std_logic; -- кнопка и частота
Led : out std_logic); -- выход на светодиод
end Migalka;
architecture Behavioral of Migalka is
signal counter, Knopka_temp : std_logic_vector(3 downto 0):= (others => '0');
signal Led_temp, res : std_logic := '0'; -- сигнал состояния кнопки
begin
-- count : process(Knopka) -- процесс проверки состояния кнопки
-- begin
-- Knopka_temp<=(others => '0');
-- if (Knopka='1') then Knopka_temp<=Knopka_temp+1;
-- else Knopka_temp<=Knopka_temp+10;
-- end if;
--
-- end process;
count1 : process(CLK,res) -- первый процесс счетчика
begin
if(res = '1') then -- обнуляем счетчик, когда res = 1, как видно сброс асинхронный
counter <= (others => '0');
elsif(rising_edge(CLK)) then -- здесь ждем фронта сигнала и увеличиваем на единицу значение в счетчике, если будет фронт
counter <= counter +1;
end if;
-- Knopka_temp<=(others => '0');
-- if (Knopka='1') then Knopka_temp<=Knopka_temp+1;
-- elsif (Knopka='0') then Knopka_temp<=Knopka_temp+10;
-- end if;
end process;
L : process(counter)
begin
Knopka_temp<=(others => '0');
if (Knopka='1') then Knopka_temp<=Knopka_temp+1;
elsif (Knopka='0') then Knopka_temp<=Knopka_temp+20;
end if;
if(counter = Knopka_temp) then -- проверяем достижения 'Knopka_temp' тактов
res <= '1'; -- если достигли ставим сигнал сброса
LED_temp <= not LED_temp; -- меняем значение в выдаваемого на светодиод, здесь как раз хорошо видно для чего нужен триггер
--( это реализуется на триггере, мы помним предыдущее значение и его изменяем)
else
res <= '0'; -- если еще не досчитали до 'Knopka_temp' подтверждаем отсутствие сброса
end if;
end process;
Led <= Led_temp; -- вот тут передаем значения из триггера на выход
end Behavioral;


