Hi,
Heres a (4) switch debouncer written in AHDL quite like mentioned above:
Hope it works for you - it certainly works for me.
Peter
-------------------------------------------------------------------
SUBDESIGN debounce
(
clk : INPUT;
key_pressed[3..0] : INPUT;
pulse[3..0] : OUTPUT;
)
VARIABLE
count_reg0[20..0] : DFF;
at_zero0 : NODE;
count_reg1[20..0] : DFF;
at_zero1 : NODE;
count_reg2[20..0] : DFF;
at_zero2 : NODE;
count_reg3[20..0] : DFF;
at_zero3 : NODE;
BEGIN
% Preset to 255 when key bounces or is not %
% pressed. Decrement when key is pressed. %
%-0---%
count_reg0[].clk = clk;
count_reg0[].prn = not key_pressed[0];
count_reg0[].d = count_reg0[].q - (00000,!at_zero0);
% Emit single pulse when counter reaches 1. %
pulse[0] = count_reg0[].q == h"00001";
% Don't let counter decrement below zero. %
at_zero0 = count_reg0[].q == h"00000";
%-1---%
count_reg1[].clk = clk;
count_reg1[].prn = not key_pressed[1];
count_reg1[].d = count_reg1[].q - (00000,!at_zero1);
% Emit single pulse when counter reaches 1. %
pulse[1] = count_reg1[].q == h"00001";
% Don't let counter decrement below zero. %
at_zero1 = count_reg1[].q == h"00000";
%-2---%
count_reg2[].clk = clk;
count_reg2[].prn = not key_pressed[2];
count_reg2[].d = count_reg2[].q - (00000,!at_zero2);
% Emit single pulse when counter reaches 1. %
pulse[2] = count_reg2[].q == h"00001";
% Don't let counter decrement below zero. %
at_zero2 = count_reg2[].q == h"00000";
%-3--%
count_reg3[].clk = clk;
count_reg3[].prn = not key_pressed[3];
count_reg3[].d = count_reg3[].q - (00000,!at_zero3);
% Emit single pulse when counter reaches 1. %
pulse[3] = count_reg3[].q == h"00001";
% Don't let counter decrement below zero. %
at_zero3 = count_reg3[].q == h"00000";
END;