Impulszähler für vhdl?

#1550584
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...
Moderator (Firma: Titel) Persönliche Seite #1550989
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  ;-)
Gast #1551051
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
Moderator (Firma: Titel) Persönliche Seite #1551062
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;
Moderator (Firma: Titel) Persönliche Seite #1551134
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren