реклама на сайте
подробности

 
 
> АНТИДРЕБЕЗГ (VHDL)
lyzifer
сообщение Jul 25 2017, 14:52
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 13-07-17
Пользователь №: 98 133



Возникла проблема.Есть устройство,на выходе которого 4 светодиода (led).Они поочерёдно загораются и тухнут с частотой 1Гц . К устройству подключена кнопка (btn). Когда она нажата, сигнал должен идти на светодиоды (как показано на диаграмме). Так вот, при нажатии возникает дребезг, диоды горят хаотично, при чём даже могут гореть, когда кнопка отпущена. Код вроде простой.но никак не могу правильно этот антидребезг добавить. Заранее благодарен.

ВЕРХНИЙ ФАЙЛ

Код
library ieee;
  use ieee.std_logic_1164.all;
  use ieee.numeric_std.all;

entity led_blink is
  port (
    clk : in  std_logic; -- синхросигнал
    btn : in  std_logic; --кнопка
    led : out std_logic_vector(3 downto 0) --выход на светодиоды
  );
end led_blink;

architecture rtl of led_blink is
  signal ONN_OFF : std_logic                    := '1';
  signal state   : std_logic_vector(3 downto 0) := "0001";
  signal divider : unsigned(23 downto 0)        := (others => '0'); --делитель частоты
begin
  main_p : process(clk)
  begin
    if (rising_edge(clk)) then
      if (divider < 5000000) then  ---если меньше 5 млн. тактов, то счётчик наращивает 1
        divider <= divider + 1;
      else
        divider <= (others => '0');--если больше,то счётчик сбрасывается в 0
        if (btn = '1') then --если нажата кнопка
          ONN_OFF <= not(ONN_OFF);--светодиоды загораются
          if (ONN_OFF = '1') then
            state <= state(2 downto 0) & state(3);
            led   <= state;
          else --если НЕ нажата
            led   <= (others => '0');--сигнал на выход светодиодов не идёт
          end if;
        else
          ONN_OFF <= '1';
          led     <= (others => '0');
        end if;
      end if;
    end if;
  end process;
end rtl;


АНТИДРЕБЕЗГ (КОРЯВЫЙ)

Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity Debouncer is
    Port ( clk : in  std_logic;
           btn : in  std_logic;
           led : out std_logic_vector(3 downto 0));
end Debouncer;


architecture Behavioral of Debouncer is
  signal led : std_logic_vector (3 downto 0);
  signal btn_cl : std_logic;
begin
  process (clk)
  begin
    if rising_edge(clk) then
      if clk /= btn_cl then
        btn_cl <= clk;
        led <= (others => '0');
      elsif led = "1111" then
        btn <= btn_cl;
      else
        led <= led + 1;
      end if;
    end if;
  end process;
end Behavioral;



Временная диаграмма работы устройства.
При загрузке в устройсво, кнопка конечно же без антидребега так идеально не работает (((

Go to the top of the page
 
+Quote Post



Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 08:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01356 секунд с 7
ELECTRONIX ©2004-2016