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


von Marcel B. (mpunkt)


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...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity Frequenzzaehler is
6
   port ( clk  : in std_logic; -- z.B. 50 kHz-Takt
7
          puls : in std_logic;
8
          counter : out std_logic_vector(11 downto 0)
9
        );
10
end Frequenzzaehler;
11
12
architecture Behavioral of Frequenzzaehler is
13
   signal cntsec  : integer range 0 to 50000-1 := 0; -- 0...49999 = 1 sec bei 50kHz
14
   signal cntpuls : integer range 0 to 20000 := 0;
15
   signal pulssr  : std_logic_vector(3 downto 0) := "0000";
16
begin
17
18
   process begin
19
      wait until rising_edge(clk);
20
      pulssr <= pulssr(pulssr'left-1 downto 0) & puls; -- Schieberegister für Flankenerkennung
21
      if (pulssr="0111") then                          -- steigende Flanke am Pulseingang
22
         cntpuls <= cntpuls+1;                         -- Puls zählen
23
      end if;
24
      if (cntsec=50000-1) then                                 -- 1 sec vorbei
25
         counter <= std_logic_vector(to_unsigned(cntpuls,12)); -- Zählerwert ausgeben
26
         cntsec <= 0;                                          -- und neu beginnen
27
         cntpuls <= 0;
28
      else
29
         cntsec <= cntsec+1;
30
      end if; 
31
   end process;
32
33
end Behavioral;

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

von Der Besucher (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

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

von Marcel B. (mpunkt)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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:
1
   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.

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


Lesenswert?

Eine Bedingung hat Lothars Lösung.

Der Clk muss mindestens viermal schneller als eine Impulsfolge sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.