www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Counter Problem


Autor: Mikey (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich möchte im 1s-Takt einen Zähler hochzählen bzw. runterzählen 
lassen, zur Verfügung steht mir ein 50 MHz Clock Signal, d.h ich müsste 
20000 Clock Signale zählen, und dann einen anderen Zähler um 1 erhöhen, 
aber irgendwie funktioniert der Code nicht.Compiliert wird ohne Fehler! 
Kann mir jemand helfen?
architecture Verhalten of xc is

  signal s1, s0: std_logic_vector (3 downto 0);
  signal zaehler: std_logic_vector(14 downto 0) := "000000000000000";
  signal zaehler2: std_logic_vector(3 downto 0) := "0000";
  signal aufwaerts: boolean := true;
  
  
begin
  
  



  process(key(1)) begin
    if falling_edge(key(1)) then
      aufwaerts <= not aufwaerts;
    end if;
  end process;

  process(clock_50) begin
    if rising_edge(clock_50) then
        zaehler<= zaehler + 1;
        if (zaehler >= "100111000100000") then
        
          if aufwaerts then
            zaehler2 <= zaehler2 + 1;
          else
            zaehler2 <= zaehler2 - 1;
          end if;
          zaehler <= "000000000000000";
        end if;
      
    end if;
  end process;


Vielen Dank im Vorraus!

Autor: Thomas K. (tomthegeek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
          if aufwaerts then
            zaehler2 <= zaehler2 + 1;
          else
            zaehler2 <= zaehler2 - 1;
          end if;
          zaehler <= "000000000000000";

Wofür ist die if-abfrage, wenn der zähler anschließend wieder genullt 
wird?

Thomas

Autor: Mikey (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist so gedacht:
zaehler erreicht 20000(dezimal), danach soll zaehler2 eins hoch- bzw. 
runterzählen.
Deshalb wird der zaehler wieder genullt, und dann beginnt das ganze 
wieder von vorne.

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

Bewertung
0 lesenswert
nicht lesenswert
Mikey schrieb:
> aber irgendwie funktioniert der Code nicht.
Warum meinst du das? Wie stellst du das fest?

> Kann mir jemand helfen?
Ich würde da mal eine Simulation empfehlen...

Mit deinen zwei Takten:
    if falling_edge(key(1)) then
  :
    if rising_edge(clock_50) then
wirst du dir noch einige Schwierigkeiten an die Backe kleben...
Eine Flankenerkennung für ein externes Signal geht so:
http://www.lothar-miller.de/s9y/categories/18-Flan...

Sowas ist an Gefährlichkeit kaum zu übertreffen:
  process(key(1)) begin
    if falling_edge(key(1)) then  ---- AUTSCH, ein Taster als Taktquelle
      aufwaerts <= not aufwaerts;
    end if;
  end process;
Wenn dein Schalter prellt, dann hast du da z.B. 20-30 Taktflanken 
blitzschnell hintereinander. Das ist also eher ein Zufallsgenerator... 
:-)

Zusammenfassend nochmal meine Postulate für den geneigten VHDL-Anfänger:
Ein Design (insbesondere ein Anfängerdesign) hat genau 1 Takt, 
der immer auf dieselbe Flanke aktiv ist. 
Es gibt keinen (und schon gar keinen asynchronen) Reset.
Externe Signale werden über 2 Flipflops einsynchronisiert.
Jede Abweichung von diesen Regeln muß fundiert begründet werden können.

Autor: Christian Leber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mikey schrieb:

> ich möchte im 1s-Takt einen Zähler hochzählen bzw. runterzählen
> lassen, zur Verfügung steht mir ein 50 MHz Clock Signal, d.h ich müsste
> 20000 Clock Signale zählen, und dann einen anderen Zähler um 1 erhöhen,

20000? Sicher?
Zaehlt zaehler2 zufaellig 2500 mal zu schnell?

Gruss
Christian

Autor: Mikey (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Christian, jetzt funktionierts!
Ich muss zaehler2 bis 50000000 zählen lassen (nicht bis 20000)!
Hab mich da irgendwie mit den Zehnerpotenzen verhauen!

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

Bewertung
0 lesenswert
nicht lesenswert
Mikey schrieb:
> Ich muss zaehler2 bis 50000000 zählen lassen!
LOL... Falsch...  :-D

Auflösung:
Du mußt den Zähler von 0 bis 49999999 zählen lassen, sonst zählst du 
einen Takt zuviel.

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.