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...
> 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 ;-)
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
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; |
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.