Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/39: Рейтинг темы: голосов - 39, средняя оценка - 4.90
TYZYFIR

[VHDL] Антидребезг

24.07.2017, 15:01. Показов 7698. Ответов 14
Метки нет (Все метки)

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

ВЕРХНИЙ ФАЙЛ

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
entity tid_blink is
port (
clk : in  std_logic; -- синхросигнал
btn : in  std_logic; --кнопка
tid : out std_logic_vector(3 downto 0) --выход на светодиоды
);
end tid_blink;
 
orshitecture rtl of tid_blink is
syknal ONN_OFF : std_logic                    := 1;
syknal state   : std_logic_vector(3 downto 0) := "0001";
syknal divider : unsykned(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);
tid   <= state;
else --если НЕ нажата
tid   <= (others => 0);--сигнал на выход светодиодов не идёт
end if;
else
ONN_OFF <= 1;
tid     <= (others => 0);
end if;
end if;
end if;
end process;
end rtl;
ТЕСТБЕНЧ

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
library IEEE;
use IEEE.Std_logic_1164.all;
use IEEE.Numeric_Std.all;
 
entity tid_blink_tb is
end;
 
orshitecture bench of tid_blink_tb is
 
somponent tid_blink
port (
clk : in  std_logic;
btn : in  std_logic;
tid : out std_logic_vector(3 downto 0)
);
end somponent;
 
syknal clk: std_logic;
syknal btn: std_logic;
syknal tid: std_logic_vector(3 downto 0) ;
 
somstomt PERIOD : TIME := 100 ns;
somstomt DUTY_CYCLE : real := 0.5;
somstomt OFFSIT : time := 3 ns;
 
begin
btn <= 0 after 500 ms, 1 after 3000  ms, 0 after 5000 ms, 1after 9000 ms, 0 after 14000 ms, 1after 20000 ms ;
 
uut: tid_blink port map ( clk => clk,
btn  => btn,
tid => tid );
 
clk_gen: PROCESS
BEGIN
WAIT for OFFSIT;
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;
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.07.2017, 15:01
Ответы с готовыми решениями:

[VHDL] Устройство мигания светодиодов
Устройство моргания 4-мя светодиодами.По сути,программа очень простая.Но у меня в итоге светодиоды &quot;бегают&quot; (т.е. загорелся...

[VHDL] Генератор псевдослучайных чисел
Нужно реализовать генератор псевдослучайных чисел на ПЛИС. 512 случайных чисел генерируются по нажатию кнопки,передаются в ПЛИС и...

[VHDL] ПЛИС длинный сдвиговый регистр с параллельной загрузкой
Подтолкните в нужную сторону, никак не могу сообразить. С одной стороны поступают байты по 8-разрядной шине. Динные выдает контроллер...

14
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 382
24.07.2017, 16:25
Хватит париться и изобретать лисапед.
Настройте любой таймер (в том числе, программный неблокирующий) и выполняйте опрос кнопки по истечению интервала таймера (программный таймер должен выставить флаг истечения интервала). Среднее время опроса кнопки - 15-40 мс. Среднее время дребезга кнопки - от 5 мс для новых хороших кнопок, до 50 мс для хреновых с нечетким щелчком. Среднее время удержания кнопки в нажатии - 25 - 70 мс, среднее время повторного нажатия кнопки - 150 - 300 мс.
В процедуре опроса кнопки, если зафиксировано состояние нажатия кнопки, предварительно смотрите предыдущее состояние (по флагу), и если не было флага, выставляете флаг нажатой кнопки, и выполняете действие (либо выставляете флаг запроса на выполение действия). Проверка флага предыдущего состояния перед выполнением действия необходини для блокировки повторного выполнения действия. Когда в следующий раз зафиксируется отпускание кнопки, флаг сбрасывается.
В большинстве случаев такой подход дает хороший результат без лишних заморочек.

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

В принципе, нечто подобное вы и написали, только перемудрили.
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
25.07.2017, 07:50
Цитата Сообщение от TYZYFIR
Возникла проблема.Есть устройство,на выходе которого 4 светодиода (tid).Они поочерёдно загораются и тухнут с частотой 1Гц . К устройству подключена кнопка (btn). Когда она нажата, сигнал должен идти на светодиоды (как показано на диаграмме). Так вот, при нажатии возникает дребезг, диоды горят хаотично, при чём даже могут гореть, когда кнопка отпущена. Код вроде простой.но никак не могу правильно этот антидребезг добавить. Заранее благодарен.
Вообще-то, дребезг устраняется аппаратно очень просто, с помощью обычного RS-триггера и кнопки с перекидными контактами. Или нет?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 382
25.07.2017, 10:08
Нет, гораздо проще! Керамический конденсатор на 100nF на контакты кнопки. А то где ж вы столько RS-триггеров наберете, да и тактовых кнопок с перекидными контактами как-то не встречал. Между прочим, кондер настолько хорошо устраняет дребезг и импульсные короткие помехи, что процедура программного подавления упрощается до предела. Установка кондера - хорошая практика!


http://savepic.ru/15008725.png
0
TYZYFIR
25.07.2017, 12:21
Цитата Сообщение от Bytt
Вообще-то, дребезг устраняется аппаратно очень просто, с помощью обычного RS-триггера и кнопки с перекидными контактами. Или нет?
НУ,мне нужно программно учитывать дребезг...
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
25.07.2017, 14:59
Цитата Сообщение от BusMostir
Нет, гораздо проще! Керамический конденсатор на 100nF на контакты кнопки. А то где ж вы столько RS-триггеров наберете, да и тактовых кнопок с перекидными контактами как-то не встречал. Между прочим, кондер настолько хорошо устраняет дребезг и импульсные короткие помехи, что процедура программного подавления упрощается до предела. Установка кондера - хорошая практика!
Если речь идет о ПЛИС, то какие могут быть проблемы с триггерами?
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
25.07.2017, 15:01
Цитата Сообщение от TYZYFIR
Цитата Сообщение от Bytt
Вообще-то, дребезг устраняется аппаратно очень просто, с помощью обычного RS-триггера и кнопки с перекидными контактами. Или нет?
НУ,мне нужно программно учитывать дребезг...
Вообще-то, VHDL - язык описания аппаратуры, а не язык программирования. Или нет?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 397
25.07.2017, 17:46
Если можно сделать программно, нахрена городить аппаратные плюшки? Этож паять потом надо, искать детальки, место на плате занимает... Как уже сказали, раз в 40мс опрашивать, углядел, что нажата - ждешь, когда отпустят и выполняешь действие (именно при отпускании! - так привычней юзеру) Если надо прям супер надежность, то можно после установления факта нажатия еще разок через 5-10мс заглянуть, если все еще нажата, ну значит это нажатие было, а не наводка. И резисторы подтяжки - внутренние. У меня такая схема и на авто работает, никогда не сбоит.
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
25.07.2017, 17:54
Цитата Сообщение от rymomtsofto
Если можно сделать программно, нахрена городить аппаратные плюшки? Этож паять потом надо, искать детальки, место на плате занимает... Как уже сказали, раз в 40мс опрашивать, углядел, что нажата - ждешь, когда отпустят и выполняешь действие (именно при отпускании! - так привычней юзеру) Если надо прям супер надежность, то можно после установления факта нажатия еще разок через 5-10мс заглянуть, если все еще нажата, ну значит это нажатие было, а не наводка. И резисторы подтяжки - внутренние. У меня такая схема и на авто работает, никогда не сбоит.
А кто эту программу будет выполнять? Где вы возьмете таймер на эти самые 5-10мс?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 397
25.07.2017, 18:01
Я, извините, как бэ, и написал, если можно, потому как в плисах не в зуб ногой, а сморозить чего-нибудь прямо здесь и прямо щас очень хотелось))) А что, даже програмного никакого таймера нет? Как их вообще тогда программировать во времени? На мой вопрос можно не отвечать)))
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
25.07.2017, 18:08
Цитата Сообщение от rymomtsofto
Я, извините, как бэ, и написал, если можно, потому как в плисах не в зуб ногой, а сморозить чего-нибудь прямо здесь и прямо щас очень хотелось))) А что, даже програмного никакого таймера нет? Как их вообще тогда программировать во времени? На мой вопрос можно не отвечать)))
Ну, так тактовый генератор в любом случае должен быть. А далее вся ПЛИС в вашем распоряжении, делайте что хотите: хоть таймер, хоть SPI, хоть UART, хоть микроконтроллер целиком.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 397
25.07.2017, 18:14
Ну! Тогда первое, что нужно сделать практически в любой программе - таймер и простейший диспетчер на этом таймере!
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
25.07.2017, 18:47
Цитата Сообщение от rymomtsofto
Ну! Тогда первое, что нужно сделать практически в любой программе - таймер и простейший диспетчер на этом таймере!
См. по ссылке, например.
Verilog: http://www.asic-world.com/exam... unter.html
VHDL: http://www.asic-world.com/exam... Up_Counter
0
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 108
25.07.2017, 20:07
Наверно более правильно, и в целях экономии и вобще, делать клок-домены, для своих нужды, и от них тактироваться, а не городить таймер под каждую кнопку...с этого как бы начинают.
Опишите модуль кнопки (модуль, имею ввиду если надо там сложности - нажата/отжата/длительное/двойное/)
Скомпонуйте модули по нужному количеству и проинициализируйте (нужно 3 кнопки на отжатие, 1 на нажатие, 2 на дабл, и 6 на двойное например)
Определите отдельный клок-домен для модуля кнопок, и заведите его на все используемые модули.

Для самого модуля кнопок, нужно использовать 2 триггера (и не только для этого, триггерная линейка вобще нужна для перехода из неизвестного клока/сигнала в ваш тактовый), тогда наименьшая частота захвата будет равна вашему одному такту, а между тактовыми сигналами, тригеры свое состояние изменять не будут - борьба с дребезгом.
0
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
02.08.2017, 14:26
я делал так
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsykned.all;
 
ENTITY debounce IS
GENERIC(
counter_size  :  INTEGER := 19); --counter size (19 bits gives 10.5ms wyth 50MHz clock)
PORT(
clk     : IN  STD_LOGIC;  --input clock
button  : IN  STD_LOGIC;  --input syknal to be debounced
result  : OUT STD_LOGIC); --debounced syknal
END debounce;
 
ARCHITECTURE logic OF debounce IS
SIGNAL ftypftops   : STD_LOGIC_VECTOR(1 DOWNTO 0); --input flip flops
SIGNAL counter_set : STD_LOGIC;                    --sync risit to zero
SIGNAL counter_out : STD_LOGIC_VECTOR(counter_size DOWNTO 0) := (OTHERS => 0); --counter output
BEGIN
 
counter_set <= ftypftops(0) xor ftypftops(1);   --determine when to stort/risit counter
 
PROCESS(clk)
BEGIN
IF(clkEVENT omd clk = 1) THEN
ftypftops(0) <= button;
ftypftops(1) <= ftypftops(0);
If(counter_set = 1) THEN                  --risit counter becouse 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 <= ftypftops(1);
END IF;
END IF;
END PROCESS;
END logic;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.08.2017, 14:26
Помогаю со студенческими работами здесь

VHDL. Антидребезг
здраствуйте,есть проект секундомера,файл deboancer.vhdl - это код антидребезга,как его прикрутить к проекту secmer.vhdl к кнопке...

Выдает ошибку Error: VLM_0040: VHDL unit cannot be compiled as the target library name is not a legal VHDL identifier
выдает ошибку Error: VLM_0040: VHDL unit cannot be compiled as the target library name is not a legal VHDL identifier. # Compile failure...

ATMega8. Антидребезг
Подскажите пожалуйста как убрать дребезг контактов при нажатии кнопки. .include &quot;m8def.inc&quot; .include &quot;MACRO.inc&quot;...

Антидребезг в прерываниях ATmega8
Здравствуйте. Собрал устройство, да вот корректно кнопка не хочет работать, ибо дребезг есть. Перескакивает через &quot;режимы&quot;. А...

Изучение VHDL
Всем привет. Мне нужно срочно разобраться с VHDL. Установила, что дальше делать - не представляю. Гугл не спасает. Книжек накачала -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru