Forum: FPGA, VHDL & Co. Counter Problem


von Chris (Gast)


Lesenswert?

Hallo,

ich hab ein Problem und komme nicht mehr weiter. Ich bin VHDL Einsteiger 
und wollte als erstes versuchen Taktflanken zu zählen und bei einer 
bestimmten Anzahl den ausgang des Zählers auf 1 zu setzen. Aber leider 
ist es so, dass der Ausgang schon am Anfang auf 1 steht... Vielleicht 
sieht ja jemand das Problem. Würde mich sehr freuen.
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
use ieee.std_logic_arith.all;
5
6
entity biterkenner is
7
  
8
  port
9
  (
10
    clk1ms      :   in std_logic;
11
    dcf_sig      :  in std_logic;
12
    reset        :  in std_logic;
13
    auswertung    :  out std_logic
14
  );
15
16
end entity;
17
18
architecture rtl of biterkenner is
19
20
  signal count1: integer := 0; -- Zaehler fuer ms
21
  
22
23
  
24
begin
25
  
26
  process (clk1ms, count1, reset)
27
  begin
28
-- hier Code
29
    
30
    if(reset = '1') then
31
      
32
      count1 <= 0;
33
    
34
    elsif (rising_edge(clk1ms))then
35
            
36
      if (count1 > 500) then
37
        auswertung <= '1';
38
      
39
      end if;
40
      count1 <= count1 +1;
41
      
42
    end if;
43
44
        
45
  end process;
46
  
47
end rtl;

von Dr.Schmock (Gast)


Lesenswert?

Im Code steht nirgendwo, wann "auswertung" den wert '0' haben soll

von Chris (Gast)


Lesenswert?

stimmt... hab es jetzt unter count1 <= count1 + 1;  hinzugefügt. sollte 
die richtige Stelle sein. Nur ist jetzt auswertung dauerhaft auf 0.
1
    elsif (rising_edge(clk1ms))then
2
            
3
      if (count1 > 500) then
4
        auswertung <= '1';
5
      
6
      end if;
7
      count1 <= count1 +1;
8
      auswertung <= '0';
9
      
10
    end if;

von Chris (Gast)


Lesenswert?

problem gelöst :) war doch die falsche Stelle! Danke für die Hilfe, dass 
war der nötige Denkanstoß!

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


Lesenswert?

Chris schrieb:
> Nur ist jetzt auswertung dauerhaft auf 0.
Für alle, die irgendwann die Lösung wissen wollen:
In einem Porzess gilt die letzte Zuweisung an ein Signal. Bei dieser 
Beschreibung gewinnt daher immmer die '0':
1
    elsif (rising_edge(clk1ms))then
2
      if (count1 > 500) then
3
        auswertung <= '1';    -- hier eine bedingte Zuweisung
4
      end if;
5
      count1 <= count1 +1;
6
      auswertung <= '0';      -- hier wird immer '0' zugewiesen
7
    end if;

Richtig wäre es so:
1
    elsif (rising_edge(clk1ms))then
2
      auswertung <= '0';      -- Defaultzuweisung von '0'
3
      if (count1 > 500) then
4
        auswertung <= '1';    -- hier eine bedingte Zuweisung
5
      end if;
6
      count1 <= count1 +1;
7
    end if;

Das ist übrigens genau das selbe, weiul sich der Wert eines Signals 
immmer erst am Ende des Prozesses ändert. Wenn hier z.B. count1 mit 300 
hereinkommt:
1
    elsif (rising_edge(clk1ms))then
2
      count1 <= count1 +1;    -- dann ist der nächste Wert von count1 = 301
3
      auswertung <= '0';      
4
      if (count1 > 500) then  -- die Abfrage geht aber noch auf den aktuellen Wert von 300
5
        auswertung <= '1'; 
6
      end if;
7
    end if;
Und damit ist diese Abfrage falsch:
1
    elsif (rising_edge(clk1ms))then
2
      if (count1 > 500) then
Hier wird 501 Schritte gezählt (0,1,2,3...500).
Fazit: die Uhr geht um 0,2% falsch... :-o

Und mir gibt sehr zu denken, dass hier von einem clk1ms geschrieben 
wird. Schlimmstenfalls könnten da sogar mehrere Takte im Design 
beteiligt 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.