mikrocontroller.net

Forum: FPGA, VHDL & Co. Eingang digital filtern - wie am einfachsten?


Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Das Problem im weiter unten stehenden Thread "Pegelproblem am Spartan3 
XC3S250-4VQG100CCS1" hat sich als Optokoppler-Problem herausgestellt.

Ein Workaround besteht darin, die Eingangssignale zu filtern. Als Filter 
stelle ich mir vor, dass das Eingangssignal nur dann übernommen wird, 
wenn es während mind. 5 Taktzyklen/Samples konstant gewesen ist.

Wie lässt sich das am einfachsten umsetzen?
- 5 FFs hintereinander
- Sample = Input, falls alle FF gleich, sonst alter Wert behalten

Die Verzögerung um 5 Takte ist durchaus verschmerzbar.

Hat jemand eine andere Idee?

Gruss, M.Kohler

Autor: heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Summe der 5 Eingänge > 4 dürfte genügen.
Das Ergebniss kann man ja trotzdem prozessieren und dann als gültig 
annehmen, wenn diese Randkriterium stimmt.

Autor: Francesco Na (franceso-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Filter, der 3 Werte mittelt.
------------------------------------------------------------------------ 
----------
-- filter.vhd
--
-- Copyright (C) 2006 Michael Poppitz
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or (at
-- your option) any later version.
--
-- This program is distributed in the hope that it will be useful, but
-- WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- General Public License for more details.
--
-- You should have received a copy of the GNU General Public License 
along
-- with this program; if not, write to the Free Software Foundation, 
Inc.,
-- 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
--
------------------------------------------------------------------------ 
----------
--
-- Details: http://sump.org/projects/analyzer/
--
-- Fast 32 channel digital noise filter using a single LUT function for 
each
-- individual channel. It will filter out all pulses that only appear 
for half
-- a clock cycle. This way a pulse has to be at least 5-10ns long to be 
accepted
-- as valid. This is sufficient for sample rates up to 100MHz.
--
-- Noise cancelation is important when connecting to 5V signals with 
high
-- slew rate, because cross talk will occur.
-- It may or may not be necessary with low voltage signals.
--
------------------------------------------------------------------------ 
----------

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity filter is
    Port ( input : in  STD_LOGIC_VECTOR (31 downto 0);
        clock : in std_logic;
        clock180 : in std_logic;
           output : out  STD_LOGIC_VECTOR (31 downto 0));
end filter;

architecture Behavioral of filter is

signal input0, input180, input360, input180Delay, nresult, result : 
STD_LOGIC_VECTOR (31 downto 0);

begin
  process(clock)
  begin
    if rising_edge(clock) then
      input0 <= input;
      input180 <= input180Delay;
      input360 <= input0;
      result <= nresult;
    end if;
  end process;
  output <= result;

  process(clock180)
  begin
    if rising_edge(clock180) then
      input180Delay <= input;
    end if;
  end process;

  -- determine next result
  process(input0, input180, input360, result)
  begin
    for i in 31 downto 0 loop
      if
        (result(i) = '0' and input360(i) = '0' and input180(i) = '0' and 
input0(i) = '0')
        or (result(i) = '0' and input360(i) = '0' and input180(i) = '0' 
and input0(i) = '1')
        or (result(i) = '0' and input360(i) = '0' and input180(i) = '1' 
and input0(i) = '0')
        or (result(i) = '0' and input360(i) = '1' and input180(i) = '0' 
and input0(i) = '0')
        or (result(i) = '0' and input360(i) = '1' and input180(i) = '0' 
and input0(i) = '1')
        or (result(i) = '1' and input360(i) = '0' and input180(i) = '0' 
and input0(i) = '0')
        or (result(i) = '1' and input360(i) = '0' and input180(i) = '0' 
and input0(i) = '1')
        or (result(i) = '1' and input360(i) = '1' and input180(i) = '0' 
and input0(i) = '0')
      then
        nresult(i) <= '0';
      else
        nresult(i) <= '1';
      end if;
    end loop;
  end process;

end Behavioral;

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich danke euch für die Antworten.

Die Implementation ähnlich dem vorgeschlagenen Code scheint mir 
plausibel zu sein. Ich werde es mal so versuchen.

Gruss, M.Kohler

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.