> 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 ;-)