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.
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.
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
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...
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.
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;
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.
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...
Aber... im Signaltap kann ich beobachten wie der Zähler zurückgesetzt wird. Wie lässt sich das erklären?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.