Counter Problem

Gast #1939479
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;
Gast #1939511
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;
Moderator (Firma: Titel) Persönliche Seite #1939548
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...

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