Counter Problem

Gast #1939479
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
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
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

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.