реклама на сайте
подробности

 
 
> Антидребезг контакта., Как сделать?
Iptash
сообщение Jul 22 2011, 17:59
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Здравствуйте все.
Есть входной сигнал с плохим фронтом, поэтому происходит дребезг. Написал антидребезговый блок, так в принципе работает не плохо,
но иногда при включении стопорится, потому что видимо dreb и ndreb не обнуляются и соответственно сигнал zap
который я дальше использую не работает. Алгоритм такой. Приходит внешний сигнал IN, включается счетчик dreb и
пока не досчитает до 1000 zap будет вкл. тем самым исключая ложное срабатывание zap .
Но код какой то кривой и задний фронт вроде не коректно отрабатывает. Подскажите пожалуйста как это лучше сделать или может подправите?
Код
always @ (posedge clock1) begin
  if(IN) begin // внешний сигнал
    if(dreb == 0) begin
     zap <= 1'b1; // сигнал после фильтрации, используется дальше
     ndreb <= 0;
    end
    
  end
  
   if(zap)
    dreb <= dreb + 1'b1;
  
   if(dreb > 1000) begin
    zap <= 1'b0;  
   end
  
   if(!IN) begin
    if(ndreb == 0) begin
     nzap <= 1'b1;
     dreb <= 0;
    end
    
    end
   if(nzap)
    ndreb <= ndreb + 1'b1;
   if(ndreb > 1000) begin
    nzap <= 1'b0;      
   end
end
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Timmy
сообщение Jul 25 2011, 21:11
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Цитата(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: очень полезно публиковать исходникиsm.gif, так как изначально я перезапускал счётчик по фронту, а надо по уровню. Иначе он будет давать второй ложный фронт на дребезге на отпускании кнопки. Странно, что не заметил, правда я с этим только слегка игрался на evaluation board.


Сообщение отредактировал Timmy - Jul 26 2011, 06:00
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 10:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01452 секунд с 7
ELECTRONIX ©2004-2016