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


von Martin Kohler (Gast)


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?

von Tobias S. (tobias)


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

von Steffen (Gast)


Lesenswert?

was passiert denn bei deinem underflow, garnix?

von Martin Kohler (Gast)


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

von T.M. (Gast)


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.

von Dirk (Gast)


Lesenswert?

Hallo, und wie kann man dann auf einen Zählerwert triggern?

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

Mfg,Dirk

von Daniel R. (daniel_r)


Lesenswert?

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

von Dirk (Gast)


Lesenswert?

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

Dirk

von Martin Kohler (Gast)


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!

von Dirk (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.