mikrocontroller.net

Forum: FPGA, VHDL & Co. Counter Problem


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_arith.all;

entity biterkenner is
  
  port
  (
    clk1ms      :   in std_logic;
    dcf_sig      :  in std_logic;
    reset        :  in std_logic;
    auswertung    :  out std_logic
  );

end entity;

architecture rtl of biterkenner is

  signal count1: integer := 0; -- Zaehler fuer ms
  

  
begin
  
  process (clk1ms, count1, reset)
  begin
-- hier Code
    
    if(reset = '1') then
      
      count1 <= 0;
    
    elsif (rising_edge(clk1ms))then
            
      if (count1 > 500) then
        auswertung <= '1';
      
      end if;
      count1 <= count1 +1;
      
    end if;

        
  end process;
  
end rtl;

Autor: Dr.Schmock (Gast)
Datum:

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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt... hab es jetzt unter count1 <= count1 + 1;  hinzugefügt. sollte 
die richtige Stelle sein. Nur ist jetzt auswertung dauerhaft auf 0.
    elsif (rising_edge(clk1ms))then
            
      if (count1 > 500) then
        auswertung <= '1';
      
      end if;
      count1 <= count1 +1;
      auswertung <= '0';
      
    end if;

Autor: Chris (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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':
    elsif (rising_edge(clk1ms))then
      if (count1 > 500) then
        auswertung <= '1';    -- hier eine bedingte Zuweisung
      end if;
      count1 <= count1 +1;
      auswertung <= '0';      -- hier wird immer '0' zugewiesen
    end if;

Richtig wäre es so:
    elsif (rising_edge(clk1ms))then
      auswertung <= '0';      -- Defaultzuweisung von '0'
      if (count1 > 500) then
        auswertung <= '1';    -- hier eine bedingte Zuweisung
      end if;
      count1 <= count1 +1;
    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:
    elsif (rising_edge(clk1ms))then
      count1 <= count1 +1;    -- dann ist der nächste Wert von count1 = 301
      auswertung <= '0';      
      if (count1 > 500) then  -- die Abfrage geht aber noch auf den aktuellen Wert von 300
        auswertung <= '1'; 
      end if;
    end if;
Und damit ist diese Abfrage falsch:
    elsif (rising_edge(clk1ms))then
      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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.