Кнопка с антидребезгом и автоповтором:
Код:
entity manual is
Port ( clk : in STD_LOGIC;
key : in STD_LOGIC;
set : out STD_LOGIC);
end manual;
architecture Behavioral of manual is
signal countdown: STD_LOGIC_VECTOR (4 downto 0) := conv_std_logic_vector(31,5);
constant start: std_logic_vector := conv_std_logic_vector(31,5);
constant repeat: std_logic_vector := conv_std_logic_vector(10,5);
begin
process (clk, key)
begin
if (clk'event and clk='1') then
if key='0' then
countdown <= start;
else
if (countdown = 0) then
countdown <= repeat;
else
countdown <= countdown - 1;
End IF;
End if;
End if;
end process;
set <= '1' when ((countdown = 0) or (countdown = (start-2))) else '0';
end Behavioral;
на клок подаётся 32 Гц (или масштабируйте для своих целей) на кей - кнопка, а на сет - чистые импульсы.
Цитата:
Этот модуль обеспечивает подавление дребезга контактов кнопки и автоповтор срабатывания. Это обеспечивается следующим образом. Главный элемент - пятиразрядный счетчик с обратным отсчетом (можно и с прямым, но мне так удобнее). Пока кнопка не нажата счетчик принудительно устанавливается в значение 31 (все лог.1). Как только кнопка будет нажата, счетчик начнёт свой обратный отсчет. Если кнопка будет удерживаться досточно долго (2/32 секунды), счетчик досчитает до 29 - пройдет импульс позволяющий инкрементировать счетчик часов или минут. Если кнопка будет отпущена, то вся система возвратится в исходное состояние, если нет - то счетчик продолжит свой обратный отсчет. Если счетчик досчитает до 0 (примерно через секунду) - пройдет следующий импульс установки времени. Однако, после того как счетчик достигнет нуля он не перейдет в состояние 31, а установится в значение 10, и уже с этого значения опять повторится обратный отсчет. Это обеспечит то, что повторные импульсы будут следовать с частотой, приблизительно, 3 импульса в секунду. В любой момент отпустив кнопку, система возвращается в исходное состояние.