Forum: FPGA, VHDL & Co. Integer Überlauf


von Tim S. (169)


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.

von Klakx (Gast)


Lesenswert?

auf dem board ja und in der simulation wirds bei einem Integer 
wahrscheinlich mit einem Constraint Overflow abstürzen. Sollte bei 
>2^32-1 passieren.

von Christian R. (supachris)


Lesenswert?

Er läuft über, ja. Wahrscheinlich dann auf den kleinsten negativen Wert, 
der damit darstellbar ist. Darum musst du dich selber kümmern. Integer 
in VHDL ohne Range ist erst mal 32 Bit. Was dann die Synthese 
wegoptmiert ist abhängig von dem Rest der Beschreibung.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von Klaus F. (kfalser)


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.

von Tim S. (169)


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;

von dito (Gast)


Lesenswert?

Tim S. schrieb:
>> Mach dir sowas bitte nicht zur Gewohnheit!
>
> Wie wird denn sonst so etwas umgesetzt?

Durch eine Abfrage der Range und explizites Setzen des neuen 
Zählerstandes. Ist halt sehr viel sauberer. Zumal du nur so verhindern 
kannst, dass deine Simulation nicht mit einem Fehler abbricht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tim S. schrieb:
> Lothars Beispiel:
Ja, jetzt wissen wir mal worum es geht. Das ist ja sowieso nur ein übles 
Beispiel für die Simulation. Diese Beschreibung wirst du niemals in 
Hardware bekommen, und deshalb habe ich da den range einfach 
weggelassen...

von Tim S. (169)


Lesenswert?

Aber...
im Signaltap kann ich beobachten wie der Zähler zurückgesetzt wird.
Wie lässt sich das erklären?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

: Bearbeitet durch Moderator
von Duke Scarring (Gast)


Lesenswert?

Wenn man integer verwenden will und den Überlauf braucht, verwendet man 
einfach den modulo-Operator. Bei geschickt gewählten Bereichen entsteht 
da keine überflüssige Hardware und die Simulation läuft auch sauber 
durch.

Duke

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.