www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Up/Down Counter Problem - kein Unterlauf


Autor: Martin Kohler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe einen 32Bit Up/Down Counter. Bei diesem ist das Problem, dass
er zwar richtig zählt, nach oben von 0xFFFFFFFF nach 0x00000000
überläuft, aber nach unten zählend nicht von 0x00000000 nach 0xFFFFFFFF
unterläuft.

Was ist wohl das Problem? Hier der Code-Abschnitt:
-----------------------------------------
    -- step counter
    process(INT_CLK,COUNT_RESET,STEP_UP_sig,STEP_DOWN_sig)
    begin
        if rising_edge(INT_CLK) then
            if COUNT_RESET = '1' then
                STEP_COUNT_sig <= X"00000000";
            else
                -- no reset, count steps
                if STEP_UP_sig = '1' then
                    -- count up
                    -- at overflow, change to 0
                    STEP_COUNT_sig <= STEP_COUNT_sig + 1;
                elsif STEP_DOWN_sig = '1' then
                    -- count down
                    -- at underflow, change to FFFFFFFF
                    STEP_COUNT_sig <= STEP_COUNT_sig - 1;
                end if;
            end if;
        end if; -- if rising_edge..
    end process;
-----------------------------------------
STEP_UP_sig und STEP_DOWN_sig sind die Zählimpulse.

Ideen?

Autor: Tobias Schneider (tobias)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

was hat den STEP_COUNT_sig fuer einen Datentyp?

Auserdem koenntest du COUNT_RESET, STEP_UP_sig und STEP_DOWN_sig aus
der Sensivitaetsliste des Prozesses rausnehmen, du reagierst intern ja
sowieso nur auf eine Flanke von INT_CLK.

Gruss Tobias

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was passiert denn bei deinem underflow, garnix?

Autor: Martin Kohler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Datentyp:

    -- step counter
    signal STEP_COUNT_sig       : STD_LOGIC_VECTOR(31 downto 0);


Bei Underflow bleibt der Counter auf 0 stehen, geht also nicht auf
0xFFFFFFFF

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nimm als Datentyp

signal STEP_COUNT_sig       : unsigned(31 downto 0);

Dazu muss die numeric_std Lib eigebunden werden

use ieee.numeric_std.all;

Mit std_logic_vector arithmetisch rechnen sollte man tunlichst
vermeiden. Um das Zählsignal an die Ausgänge zu leiten (die ja bestimmt
std_logic_vector) sind, kann man dann einfach eine  Typcastung vornehmen
mit

std_logic_vector(STEP_COUNT_sig);


T.M.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, und wie kann man dann auf einen Zählerwert triggern?

if STEP_COUNT_SIG = "11111111" then .... bringt eine Fehlermeldung.

Mfg,Dirk

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Liegt vielleicht daran, dass der Vector 32 Bit hast, Du ihn aber nur mit
8 Bit fütterst.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, natürlich darf IEEE.STD_LOGIC_ARITH.ALL; nicht mehr genutzt
werden.

Dirk

Autor: Martin Kohler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Unterstützung. Mit der von T.M. vorgeschlagenen Variante
läuft es nun sauber.

Ich hatte auch noch ein Problem in der Testbench, wahrscheinlich wäre
auch die ursprüngliche Variante mit STD_LOGIC_VECTOR zum laufen
gekommen.

Das Thema ist für mich somit abgeschlossen. Nochmals Danke!

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich hab gestern ein Generic Counter mit UP / Down Funktion beschrieben
ohne Natural  Integer  Unsigned (nur std_logic_vector) und konnte
deinen Fehler nicht reproduzieren.
Liegt es vielleicht daran das ich die Lib unsigned trotzdem mits
aufrufe?

Regards, Dirk

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.