|
|
  |
Новичковое: дребезг кнопок |
|
|
|
Jan 25 2008, 09:48
|

Частый гость
 
Группа: Свой
Сообщений: 109
Регистрация: 14-01-08
Из: Москва
Пользователь №: 34 069

|
Приветствую!
Начал пробовать свои силы в работе с FPGA. Схемотехникой немного занимался, но очень давно (ещё когда PLM были "будущим электроники", а не её настоящим), поэтому сразу стали возникать "вопросы новичка". Буду признателен за разъяснения.
Итак, дано: макетная плата с Spartan-3E, ISE Webpack. Прогоняю технологическую цепочку, чтобы понять, как "оно" работает, на примитивном тесте: светодиодиками на макетной плате помигать. Мигает. Дальше хочу задействовать имеющуюся кнопку для управления процессом (выключения светодиодика).
Придумывается что-то типа:
reg ONOFF;
... always @(posegde clk) if ( ~ butt) ONOFF = ~ ONOFF; ...
assign LED = ONOFF & .... ;
И "меня терзают смутные сомнения", придуманная конструкция явно неустойчива к "дребезгу" контактов кнопки. Какой стандартный ход применяют те, кто уже имеет опыт? Делят такт и опрашивают реже? А что если единственный опрос придётся как раз на время дребезга?
Посоветуйте, пожалуйста.
|
|
|
|
|
Jan 25 2008, 10:02
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(ReedCat @ Jan 25 2008, 12:48)  Приветствую!
Итак, дано: макетная плата с Spartan-3E, ISE Webpack. Прогоняю технологическую цепочку, чтобы понять, как "оно" работает, на примитивном тесте: светодиодиками на макетной плате помигать. Мигает. Дальше хочу задействовать имеющуюся кнопку для управления процессом (выключения светодиодика).
И "меня терзают смутные сомнения", придуманная конструкция явно неустойчива к "дребезгу" контактов кнопки. Какой стандартный ход применяют те, кто уже имеет опыт? Делят такт и опрашивают реже? А что если единственный опрос придётся как раз на время дребезга? Посоветуйте, пожалуйста. 1. сдвиговый регистр. сдвигаете сигнал, когда все выходы 1, значит 1. Или реверсивный счетчик. два уровня ниже или равно нижней планке - 0, выше или равно верхней - 1. 2. Таймер. запускается сигналом и блокирует поступление сигнала на время. 3. Микропроцессор... Про RC-цепочки - забудьте!
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Jan 25 2008, 10:18
|

Частый гость
 
Группа: Свой
Сообщений: 109
Регистрация: 14-01-08
Из: Москва
Пользователь №: 34 069

|
Цитата(Liseev @ Jan 25 2008, 13:00)  Во-первых частоту clk нужно подобрать такую, чтобы переходные процессы (дребезг) по длительности не превышали ее период, порядка 50 - 100 Гц, понятно, делим клок. Цитата во-вторых дабы избежать случайного защелкивания неверного уровня, нужно использовать как минимум 2 регистра, защелкивающие сигнал с разницей по времени в один период clk. Если оба регистра защелкнули одинаковое значение - принимайте новое состояние кнопки и берем два отсчёта. Спасибо, буду пробовать Цитата(iosifk @ Jan 25 2008, 13:02)  1. сдвиговый регистр. сдвигаете сигнал, когда все выходы 1, значит 1. Не осознал.  Можно поподробнее. Цитата Или реверсивный счетчик. два уровня ниже или равно нижней планке - 0, выше или равно верхней - 1. Это понял. Цитата 2. Таймер. запускается сигналом и блокирует поступление сигнала на время. Это тоже понял. Чуть в другом виде правда, стробирование "медленным" клоком. То, что уже порекомендовали. Цитата 3. Микропроцессор... Не очень понял.  Что "микропроцессор"? На прерывание кнопку повесить? Там с дребезгом ещё хуже будет.  Циклом программным опрашивать? Цитата Про RC-цепочки - забудьте! Хех... Уже забыл Спасибо!
|
|
|
|
|
Jan 25 2008, 10:39
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(sazh @ Jan 25 2008, 13:24)  А если таких кнопок - за 100 будет? А если кнопок будет много, то их собирают в матрицу и матрицу сканируют. Память, счетчик и сумматор-вычитатель (аккумулятор)... Делают 100 ячеек памяти для промежуточного результата. На нужном такте читают память и делают инкремент или декремент и результат пишут обратно в память. Ресурсы: 100 ячеек памяти, счетчик адресов, сумматор-вычитатель, регистр, автомат на несколько состояний... Как видите, абсолютно ничего сложного.... А простейший фильтр - это сдвиговый регистр, с него все выходы и вход подаются на И, оттуда на S-вход триггера. Также все сигеалы подаются на ИЛИ-НЕ, оттуда на вход К триггера. При всех "1" в сдвиговом регистре, триггер переключится в 1, при всех нулях - в "0"... Реверсивный счетчик с двумя уровнями - это понятно. Ну а микроконтроллер - это если он уже есть в проекте. Обработка кнопки программная, как обычно. Просто я всегда представлял, что проект делается не только для обработки одной кнопки...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Jan 25 2008, 11:11
|

Частый гость
 
Группа: Свой
Сообщений: 109
Регистрация: 14-01-08
Из: Москва
Пользователь №: 34 069

|
Цитата(iosifk @ Jan 25 2008, 13:39)  Ну а микроконтроллер - это если он уже есть в проекте. Обработка кнопки программная, как обычно. Просто я всегда представлял, что проект делается не только для обработки одной кнопки... В проекте, конечно, кнопка исчезающе малая деталь. Но нужная иногда.  Что же касается микроконтроллера, то пока просветления не могу достичь. Программно на нем сделать стробирование и/или мажоритарную обработку? Но это нужно вешать в обработчик таймерного прерывания, которому, обычно, и так есть чем заняться. Чем это может оказаться лучше решения, если "дребезг" сначала убрать схемно (накладные расходы вроде небольшие?) и уж потом заводить сигнал на порт микроконтроллера для считывания (а попутно еще на линию прерывания, чтобы поллингом его не долбить)?
|
|
|
|
|
Jan 25 2008, 11:29
|
Гуру
     
Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804

|
Цитата(iosifk @ Jan 25 2008, 13:39)  Просто я всегда представлял, что проект делается не только для обработки одной кнопки... У кого как. Я хотел сказать, что кроме программного подхода есть простой железный. У Титце и Шенка расписан. стр.359 R_S триггер и два резистора. Правда при наличии трехпозиционной кнопки. Все таки уверенность должна быть. Что сработает когда надо. module drebezg /// dff ( input r_n, //Weak Pull-Up Resistor == on input s_n, //Weak Pull-Up Resistor == on output reg out ); wire clk = 1'b1; always@ (posedge clk or negedge r_n or negedge s_n) begin if (r_n == 1'b0) out <= 1'b0; else if (s_n == 1'b0) out <= 1'b1; else out <= 1'b0; end endmodule
|
|
|
|
|
Jan 26 2008, 11:39
|

Частый гость
 
Группа: Свой
Сообщений: 109
Регистрация: 14-01-08
Из: Москва
Пользователь №: 34 069

|
Нашел ликвидатор дребезга в шаблонах стандартных конструкций в ISE. reg [2:0] <reg_name>; always @ (posedge <clock>) <reg_name> <= {<reg_name>[1:0], <input>}; assign <output> = <reg_name>[0] & <reg_name>[1] & !<reg_name>[2]; Буду учить матчасть.
|
|
|
|
|
Jan 28 2008, 10:42
|
Участник

Группа: Участник
Сообщений: 72
Регистрация: 16-05-07
Пользователь №: 27 757

|
Цитата(ReedCat @ Jan 25 2008, 12:48)  Приветствую!
Начал пробовать свои силы в работе с FPGA. Схемотехникой немного занимался, но очень давно (ещё когда PLM были "будущим электроники", а не её настоящим), поэтому сразу стали возникать "вопросы новичка". Буду признателен за разъяснения.
Итак, дано: макетная плата с Spartan-3E, ISE Webpack. Прогоняю технологическую цепочку, чтобы понять, как "оно" работает, на примитивном тесте: светодиодиками на макетной плате помигать. Мигает. Дальше хочу задействовать имеющуюся кнопку для управления процессом (выключения светодиодика).
Придумывается что-то типа: reg ONOFF;
... always @(posegde clk) if ( ~ butt) ONOFF = ~ ONOFF; ...
assign LED = ONOFF & .... ;
И "меня терзают смутные сомнения", придуманная конструкция явно неустойчива к "дребезгу" контактов кнопки. Какой стандартный ход применяют те, кто уже имеет опыт? Делят такт и опрашивают реже? А что если единственный опрос придётся как раз на время дребезга? Посоветуйте, пожалуйста. Мне кажется, что проще всего привинтить RS триггер к кнопке. Тогда проблем с переключениями не будет. Описание данной "конструкции" можно взять в книге Белова "Самоучитель по МП технике".
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|