вот вам пример
Код
reg knopka_old = 0;
reg [7:0] ButHolder = 0;
reg knopka = 0;
reg knopka_0 = 0;
always @(posedge clk)
begin
//устраняем метастабильность
knopka_0 <= knopka_in;
knopka <= knopka_0;
//выделяем фронт
knopka_old <= knopka;
//устраняем дребезг
if(ButHolder != 0)
ButHolder <= ButHolder - 1'b1;
//реагируем на нажатие
if((ButHolder == 0) && (knopka_old == 1'b1) && (knopka == 1'b0)) //для нулящей кнопки
begin
ButHolder <= 255;
.... //действия на нажатие кнопки
end
end
тут надо использовать внешний клок с заданной частотой идущий на клоковую ногу, можно его поправить при помощи PLL
knopka_in - это ножка кнопки, считаем что кнопка нулит вход, его надо подтянуть в 1.
первое что делается это устраняется метастабильность - это обязательно надо делать со всеми входными произвольными сигналами.
второе это сохраняется старое значение кнопки, когда старое будет 1, а новое 0 - это фронт, это переход из не нажатого состояние в нажатое, мы реагиурем не на уровень а на изменение, причем в одну сторону.
Но нажатие детектируется только когда счетчик в 0. Этот счетчик каждое нажатие кнопки взводиться в число, тем самым определяется пауза, во время этой паузы не будет детектироваться нажатия кнопки.
вот собственно и все. Дребезг - это по сути многократные нажатия кнопки, мы вводим паузу которая их просто пропускает.