Easyelectronics.ru

Электроника для всех
Текущее время: 22 авг 2019, 21:17

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 25 июл 2017, 15:48 
Только пришел

Зарегистрирован: 12 июл 2017, 22:53
Сообщения: 9
Возникла проблема.Есть устройство,на выходе которого 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.Numeric_Std.all;

entity led_blink_tb is
end;

architecture bench of led_blink_tb is

  component led_blink
    port (
      clk : in  std_logic;
      btn : in  std_logic;
      led : out std_logic_vector(3 downto 0)
    );
  end component;

  signal clk: std_logic;
  signal btn: std_logic;
  signal led: std_logic_vector(3 downto 0) ;


constant PERIOD : TIME := 100 ns;
constant DUTY_CYCLE : real := 0.5;
constant OFFSET : time := 3 ns;

begin
btn <= '0' after 500 ms, '1' after 3000  ms, '0' after 5000 ms, '1'after 9000 ms, '0' after 14000 ms, '1'after 20000 ms ;

  uut: led_blink port map ( clk => clk,
                            btn  => btn,
                            led => led );

clk_gen: PROCESS
BEGIN
WAIT for OFFSET;
CLOCK_LOOP : LOOP
CLK <= '0';
WAIT FOR (PERIOD - (PERIOD * DUTY_CYCLE));
CLK <= '1';
WAIT FOR (PERIOD * DUTY_CYCLE);
END LOOP CLOCK_LOOP;
END PROCESS;
end;


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

DR.jpg
DR.jpg [ 74 Кб | Просмотров: 1892 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 25 июл 2017, 17:12 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3532
Хватит париться и изобретать лисапед.
Настройте любой таймер (в том числе, программный неблокирующий) и выполняйте опрос кнопки по истечению интервала таймера (программный таймер должен выставить флаг истечения интервала). Среднее время опроса кнопки - 15-40 мс. Среднее время дребезга кнопки - от 5 мс для новых хороших кнопок, до 50 мс для хреновых с нечетким щелчком. Среднее время удержания кнопки в нажатии - 25 - 70 мс, среднее время повторного нажатия кнопки - 150 - 300 мс.
В процедуре опроса кнопки, если зафиксировано состояние нажатия кнопки, предварительно смотрите предыдущее состояние (по флагу), и если не было флага, выставляете флаг нажатой кнопки, и выполняете действие (либо выставляете флаг запроса на выполение действия). Проверка флага предыдущего состояния перед выполнением действия необходима для блокировки повторного выполнения действия. Когда в следующий раз зафиксируется отпускание кнопки, флаг сбрасывается.
В большинстве случаев такой подход дает хороший результат без лишних заморочек.

Есть немного другой алгоритм, для сильношумящих кнопок или при импульсных помехах. При опросе, получив нажатое состояние кнопки, инкрементируете счетчик, начиная от нуля, а получив в следующий раз состояние отпущеной кнопки, декрементируете счетчик от предыдущего значения, но не допуская перехода значения ниже нуля. Как только значение счетчика превысило какое-то определенное вами значение, выставляете флаг фиксации нажатой кнопки и выполняете действие, как в предыдущем случае.

В принципе, нечто подобное вы и написали, только перемудрили.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 26 июл 2017, 08:37 
Старожил

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

Вообще-то, дребезг устраняется аппаратно очень просто, с помощью обычного RS-триггера и кнопки с перекидными контактами. Или нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 26 июл 2017, 10:55 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3532
Нет, гораздо проще! Керамический конденсатор на 100nF на контакты кнопки. А то где ж вы столько RS-триггеров наберете, да и тактовых кнопок с перекидными контактами как-то не встречал. Между прочим, кондер настолько хорошо устраняет дребезг и импульсные короткие помехи, что процедура программного подавления упрощается до предела. Установка кондера - хорошая практика!

Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 26 июл 2017, 13:08 
Только пришел

Зарегистрирован: 12 июл 2017, 22:53
Сообщения: 9
Bill писал(а):
Вообще-то, дребезг устраняется аппаратно очень просто, с помощью обычного RS-триггера и кнопки с перекидными контактами. Или нет?

НУ,мне нужно программно учитывать дребезг...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 26 июл 2017, 15:46 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 617
Откуда: Челябинск
BusMaster писал(а):
Нет, гораздо проще! Керамический конденсатор на 100nF на контакты кнопки. А то где ж вы столько RS-триггеров наберете, да и тактовых кнопок с перекидными контактами как-то не встречал. Между прочим, кондер настолько хорошо устраняет дребезг и импульсные короткие помехи, что процедура программного подавления упрощается до предела. Установка кондера - хорошая практика!
Если речь идет о ПЛИС, то какие могут быть проблемы с триггерами?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 26 июл 2017, 15:48 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 617
Откуда: Челябинск
LYZIFER писал(а):
Bill писал(а):
Вообще-то, дребезг устраняется аппаратно очень просто, с помощью обычного RS-триггера и кнопки с перекидными контактами. Или нет?

НУ,мне нужно программно учитывать дребезг...

Вообще-то, VHDL - язык описания аппаратуры, а не язык программирования. Или нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 26 июл 2017, 18:33 
Старожил

Зарегистрирован: 21 янв 2015, 16:19
Сообщения: 570
Если можно сделать программно, нахрена городить аппаратные плюшки? Этож паять потом надо, искать детальки, место на плате занимает... Как уже сказали, раз в 40мс опрашивать, углядел, что нажата - ждешь, когда отпустят и выполняешь действие (именно при отпускании! - так привычней юзеру) Если надо прям супер надежность, то можно после установления факта нажатия еще разок через 5-10мс заглянуть, если все еще нажата, ну значит это нажатие было, а не наводка. И резисторы подтяжки - внутренние. У меня такая схема и на авто работает, никогда не сбоит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 26 июл 2017, 18:41 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 617
Откуда: Челябинск
remontsofta писал(а):
Если можно сделать программно, нахрена городить аппаратные плюшки? Этож паять потом надо, искать детальки, место на плате занимает... Как уже сказали, раз в 40мс опрашивать, углядел, что нажата - ждешь, когда отпустят и выполняешь действие (именно при отпускании! - так привычней юзеру) Если надо прям супер надежность, то можно после установления факта нажатия еще разок через 5-10мс заглянуть, если все еще нажата, ну значит это нажатие было, а не наводка. И резисторы подтяжки - внутренние. У меня такая схема и на авто работает, никогда не сбоит.

А кто эту программу будет выполнять? Где вы возьмете таймер на эти самые 5-10мс?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 26 июл 2017, 18:48 
Старожил

Зарегистрирован: 21 янв 2015, 16:19
Сообщения: 570
Я, извините, как бэ, и написал, если можно, потому как в плисах не в зуб ногой, а сморозить чего-нибудь прямо здесь и прямо щас очень хотелось))) А что, даже програмного никакого таймера нет? Как их вообще тогда программировать во времени? На мой вопрос можно не отвечать)))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 26 июл 2017, 18:55 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 617
Откуда: Челябинск
remontsofta писал(а):
Я, извините, как бэ, и написал, если можно, потому как в плисах не в зуб ногой, а сморозить чего-нибудь прямо здесь и прямо щас очень хотелось))) А что, даже програмного никакого таймера нет? Как их вообще тогда программировать во времени? На мой вопрос можно не отвечать)))
Ну, так тактовый генератор в любом случае должен быть. А далее вся ПЛИС в вашем распоряжении, делайте что хотите: хоть таймер, хоть SPI, хоть UART, хоть микроконтроллер целиком.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 26 июл 2017, 19:01 
Старожил

Зарегистрирован: 21 янв 2015, 16:19
Сообщения: 570
Ну! Тогда первое, что нужно сделать практически в любой программе - таймер и простейший диспетчер на этом таймере!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 26 июл 2017, 19:34 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 617
Откуда: Челябинск
remontsofta писал(а):
Ну! Тогда первое, что нужно сделать практически в любой программе - таймер и простейший диспетчер на этом таймере!

См. по ссылке, например.
Verilog: http://www.asic-world.com/examples/verilog/simple_counter.html
VHDL: http://www.asic-world.com/examples/vhdl/simple_counter.html#8-Bit_Simple_Up_Counter


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 26 июл 2017, 20:54 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 02 июн 2015, 23:00
Сообщения: 134
Наверно более правильно, и в целях экономии и вобще, делать клок-домены, для своих нужды, и от них тактироваться, а не городить таймер под каждую кнопку...с этого как бы начинают.
Опишите модуль кнопки (модуль, имею ввиду если надо там сложности - нажата/отжата/длительное/двойное/)
Скомпонуйте модули по нужному количеству и проинициализируйте (нужно 3 кнопки на отжатие, 1 на нажатие, 2 на дабл, и 6 на двойное например)
Определите отдельный клок-домен для модуля кнопок, и заведите его на все используемые модули.

Для самого модуля кнопок, нужно использовать 2 триггера (и не только для этого, триггерная линейка вобще нужна для перехода из неизвестного клока/сигнала в ваш тактовый), тогда наименьшая частота захвата будет равна вашему одному такту, а между тактовыми сигналами, тригеры свое состояние изменять не будут - борьба с дребезгом.

_________________
saw_tooth


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АНТИДРЕБЕЗГ (VHDL)
СообщениеДобавлено: 03 авг 2017, 15:13 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 226
я делал так
Код:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;

ENTITY debounce IS
  GENERIC(
    counter_size  :  INTEGER := 19); --counter size (19 bits gives 10.5ms with 50MHz clock)
  PORT(
    clk     : IN  STD_LOGIC;  --input clock
    button  : IN  STD_LOGIC;  --input signal to be debounced
    result  : OUT STD_LOGIC); --debounced signal
END debounce;

ARCHITECTURE logic OF debounce IS
  SIGNAL flipflops   : STD_LOGIC_VECTOR(1 DOWNTO 0); --input flip flops
  SIGNAL counter_set : STD_LOGIC;                    --sync reset to zero
  SIGNAL counter_out : STD_LOGIC_VECTOR(counter_size DOWNTO 0) := (OTHERS => '0'); --counter output
BEGIN

  counter_set <= flipflops(0) xor flipflops(1);   --determine when to start/reset counter
 
  PROCESS(clk)
  BEGIN
    IF(clk'EVENT and clk = '1') THEN
      flipflops(0) <= button;
      flipflops(1) <= flipflops(0);
      If(counter_set = '1') THEN                  --reset counter because input is changing
        counter_out <= (OTHERS => '0');
      ELSIF(counter_out(counter_size) = '0') THEN --stable input time is not yet met
        counter_out <= counter_out + 1;
      ELSE                                        --stable input time is met
        result <= flipflops(1);
      END IF;   
    END IF;
  END PROCESS;
END logic;


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB