mikrocontroller.net

Forum: FPGA, VHDL & Co. Impulszähler für vhdl?


Autor: Marcel Bbbbb (mpunkt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo gemeinde,
ich will einen pulszäler mit vhdl codieren, mit zeitfenster 1sec in die 
ungefähr  1000 pulse laufen. Jetzt meine Frage macht ihr dafür auch zwei 
prozesse einen für das fenster einen um die pulse zu zählen? oder gibt 
es eine elegantere methode?? habt ihr vllt einen link für mein probl. 
oder ein beispielcode wie ihr das lösen würdet?? freu mich auf eure 
anregungen...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Jetzt meine Frage macht ihr dafür auch zwei
> prozesse einen für das fenster einen um die pulse zu zählen?
Eigentlich brauchst du nur 2 Zähler. Ob du die dann in 1 Prozess packst, 
oder in 2 oder 4, dass liegt in deiner Verantwortung.

Du willst doch erfassen, wieviele externe Pulse in 1 sec passen, 
richtig?
Dazu wäre eine Flankenerkennung des Pulseingangssignals sinnvoll.
Das wäre dann meine Lösung für die obige Aufgabenstellung:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity Frequenzzaehler is
   port ( clk  : in std_logic; -- z.B. 50 kHz-Takt
          puls : in std_logic;
          counter : out std_logic_vector(11 downto 0)
        );
end Frequenzzaehler;

architecture Behavioral of Frequenzzaehler is
   signal cntsec  : integer range 0 to 50000-1 := 0; -- 0...49999 = 1 sec bei 50kHz
   signal cntpuls : integer range 0 to 20000 := 0;
   signal pulssr  : std_logic_vector(3 downto 0) := "0000";
begin

   process begin
      wait until rising_edge(clk);
      pulssr <= pulssr(pulssr'left-1 downto 0) & puls; -- Schieberegister für Flankenerkennung
      if (pulssr="0111") then                          -- steigende Flanke am Pulseingang
         cntpuls <= cntpuls+1;                         -- Puls zählen
      end if;
      if (cntsec=50000-1) then                                 -- 1 sec vorbei
         counter <= std_logic_vector(to_unsigned(cntpuls,12)); -- Zählerwert ausgeben
         cntsec <= 0;                                          -- und neu beginnen
         cntpuls <= 0;
      else
         cntsec <= cntsec+1;
      end if; 
   end process;

end Behavioral;

Achtung:
es kann sein, dass dein Lehrer/Prof noch nicht reif ist für das
      wait until rising_edge(clk);
Aber die Synthesetools können es  ;-)

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Achtung:
> es kann sein, dass dein Lehrer/Prof noch nicht reif ist für das      wait until 
rising_edge(clk);
> Aber die Synthesetools können es  ;-)

Also das Synthesetool welches ich verwende versteht das definitiv nicht.

Marcel sollte wohl doch lieber "nach Lehrbuch" den synchronen Process 
beschreiben, um eventuelle Probleme von Anfang an zu vermeiden. Später 
muß man sowieso sehen, was zur Verfügung steht und welche Optimierungen 
man vornehmen kann.

Der Besucher

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Besucher schrieb:
> Also das Synthesetool welches ich verwende versteht das definitiv nicht.
Welches hast du?

Gut, dann im old school style:
   process (clk) begin
      if rising_edge(clk) then
         pulssr <= pulssr(pulssr'left-1 downto 0) & puls; -- Schieberegister für Flankenerkennung
         if (pulssr="0111") then                          -- steigende Flanke am Pulseingang
            cntpuls <= cntpuls+1;                         -- Puls zählen
         end if;
         if (cntsec=50000-1) then                                 -- 1 sec vorbei
            counter <= std_logic_vector(to_unsigned(cntpuls,12)); -- Zählerwert ausgeben
            cntsec <= 0;                                          -- und neu beginnen
            cntpuls <= 0;
         else
            cntsec <= cntsec+1;
         end if; 
      end if;
   end process;

Autor: Marcel Bbbbb (mpunkt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank hat mir schon sehr geholfen. Muß nur das mit den integer 
umschreiben, bei uns wird das arbeiten mit integer nicht so gern 
gesehen, die wollen wenn es geht alles mit singnalen...
noch ne kleine frage was macht pulssr'left hab ich noch nie benutzt..? 
danke

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pulssr'left ist 3
das kommt von (3 downto 0) --> left = 3, right = 0
Bei (5 to 12) wäre left = 5 und right = 12.  Cool, nicht wahr?  ;-)
Such mal mit Google nach "vhdlqrc.pdf"
Da drin sind noch mehr von den Attributen aufgeführt.

BTW:
Auch ein Signal kann vom Typ integer sein. Das steht ausdrücklich dort:
   signal cntsec  : integer range 0 to 50000-1 := 0; -- 0...49999 = 1 sec bei 50kHz
Das Signal cntsec ist ein Integer mit einem Bereich von 0 bis 49999.

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Bedingung hat Lothars Lösung.

Der Clk muss mindestens viermal schneller als eine Impulsfolge sein.

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.