Integer Überlauf

#3523066
Lesenswert?

Hallo Leute,
ich habe einen freilaufenden Zähler als Integer implementiert.
Range habe ich nicht angegeben.
Was passiert nun wenn er da vor sich hin zählt und dann eine Grenze 
erreicht.
Wird er dann zurückgesetzt oder ???
Vielen Dank für eure Unterstützung.
Moderator (Firma: Titel) Persönliche Seite #3523161
Lesenswert?

Tim S. schrieb:
> Hallo Leute,
> ich habe einen freilaufenden Zähler als Integer implementiert.
> Range habe ich nicht angegeben.
Mach dir sowas bitte nicht zur Gewohnheit!
> Was passiert nun wenn er da vor sich hin zählt und dann eine Grenze
> erreicht.
Du bekommst einen Fehler in der Simulation.
> Wird er dann zurückgesetzt oder ???
Stell dir einfach mal vor, wie denn so ein Zähler in Hardware umgesetzt 
werden wird. Und du wirst sehen: er wird nicht zurückgesetzt, sondern 
addiert einfach nochmal eins drauf und läuft über.

> Was passiert nun wenn er da vor sich hin zählt und dann eine Grenze
> erreicht.
Vermutlich wird vorher schon der Synthesizer schauen, wiviele Bits der 
Zähler tatsächlich braucht. Und den Rest wegoptimieren. Wenn du diesen 
Zähler nirgends verwendest wird er komplet wegoptimiert...
#3523606
Lesenswert?

Lothar Miller schrieb:
>> Was passiert nun wenn er da vor sich hin zählt und dann eine Grenze
>> erreicht.
> Du bekommst einen Fehler in der Simulation.

Das ist ja schließlich auch der Sinn einer Simaulation.
Wenn ich davon ausgehe, dass die Zahl z.B. zwischen 0 und 99 bleibt und 
irgendwo wird die Grenze überschritten, dann habe ich entweder einen 
Fehler im Algorithmus oder einen Denkfehler.
In jedem Fall will ich das entdecken.
#3525273
Lesenswert?

Lothar Miller schrieb:

> Mach dir sowas bitte nicht zur Gewohnheit!

Wie wird denn sonst so etwas umgesetzt?
Es geht um ein Inkrementalgebersignal, dass ich permanent erfasse.
Der Weg wird erfasst und nach einer bestimmten Strecke ein Aktor 
bedient.
Dies läuft kontinuierlich. Lothars Beispiel:

entity EncoderSim is
    Port ( A : in  STD_LOGIC;
           B : in  STD_LOGIC;
           Position : out  STD_LOGIC_VECTOR (31 downto 0));
end EncoderSim;

architecture Behavioral of EncoderSim is
signal p : integer := 0;
begin
  process (A,B) begin
     if rising_edge(A) then
        if (B='1') then p<=p+1; else p<=p-1; end if;
     end if;
     if falling_edge(A) then
        if (B='0') then p<=p+1; else p<=p-1; end if;
     end if;
     if rising_edge(B) then
        if (A='0') then p<=p+1; else p<=p-1; end if;
     end if;
     if falling_edge(B) then
        if (A='1') then p<=p+1; else p<=p-1; end if;
     end if;
  end process;
  Position <= std_logic_vector(to_signed(p,32));
end Behavioral;
Moderator (Firma: Titel) Persönliche Seite #3527338
Lesenswert?

Tim S. schrieb:
> im Signaltap kann ich beobachten wie der Zähler zurückgesetzt wird.
Welcher Zähler in welcher Beschreibung mit welcher Toolchain auf welcher 
Zielhardware?
> Wie lässt sich das erklären?
Wahrscheinlich so: du siehst nur die Nullen, und deshalb meinst du, der 
Zähler würde zurückgesetzt. In Wahrheit läuft er über, weil
0x0_ffff_ffff + 1 = 0x1_0000_0000

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