Цитата(Iptash @ Jul 22 2011, 21:59)

Есть входной сигнал с плохим фронтом, поэтому происходит дребезг. Написал антидребезговый блок, так в принципе работает не плохо,
но иногда при включении стопорится, потому что видимо dreb и ndreb не обнуляются и соответственно сигнал zap
Я использую вот такой антидребезг:
Код
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity deglitch is
generic(count:integer:=100);
port(
clk, rst, ce:std_logic;
d:std_logic;
q:out std_logic
);
end entity;
architecture rtl of deglitch is
signal cnt:integer range 1-count to 0;
signal sig0, sig1, sig2:std_logic;
begin
process(clk,rst) is begin
if rst = '1' then
cnt <= 0; sig0<='0'; sig1<='0'; sig2<='0';
elsif rising_edge(clk) then
sig0 <= d; sig1 <= sig0; sig2 <= sig1; --eliminate metastability
if sig2 = '1' then
cnt <= 1-count;
end if;
if cnt < 0 and ce = '1' then
cnt <= cnt+1;
end if;
end if;
end process;
q <= '1' when cnt < 0 else '0';
end rtl;
Обратите внимание, как делать эффективный счётчик(всё будет работать на очень высокой тактовой частоте).
Сигнал CE позволяет уменьшить разрядность счётчиков в каждой из антидребезжалок, подключив их к дополнительному общему счётчику.
UPD: очень полезно публиковать исходники

, так как изначально я перезапускал счётчик по фронту, а надо по уровню. Иначе он будет давать второй ложный фронт на дребезге на отпускании кнопки. Странно, что не заметил, правда я с этим только слегка игрался на evaluation board.
Сообщение отредактировал Timmy - Jul 26 2011, 06:00