Up/Down Counter Problem - kein Unterlauf

Gast #390030
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?
Gast #390034
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.
Gast #390038
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!
Gast #390039
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren