mikrocontroller.net

Forum: FPGA, VHDL & Co. Wie wendet man "range" in VHDL an?


Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte einen Zähler von 0 bis 10 bauen. Bei Überschreiten von 10, 
soll er wieder beim Wert 0 beginnen.

Hier mein Code:
entity test_range is
    Port ( CLK : in  STD_LOGIC;
           Counter : out integer);
end test_range;

architecture Behavioral of test_range is
  signal Counter_internal : integer range 0 to 10;
begin

  Counter <= Counter_internal;

  TIMING : process(CLK)
  begin
    if rising_edge(CLK) then
      Counter_internal <= Counter_internal + 1;
    end if;
  end process;

end Behavioral;

Leider funktioniert die Beschreibung nicht. Laut ISim zählt der auch 
nach Erreichen von 10 fröhlich weiter auf 11, 12, ... Es findet kein 
Überlaufen auf 0 statt.

Wieso funktioniert die Beschreibung nicht?

Grüße
Steffen

Autor: Commtel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
must du das so machen oder geht auch

architecture Behavioral of test_range is
  signal Counter_internal : integer range 0 to 10;
begin

  Counter <= Counter_internal;

  TIMING : process(CLK)
  begin
    if rising_edge(CLK) then
     if Counter_internal = (10) then
      Counter_internal <= 0 ;
     else
      Counter_internal <= Counter_internal + 1;
    end if;
  end process;

end Behavioral;

Habs jetzt nicht getested ob s geht

Autor: Commtel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab da noch was für dich

http://www.lothar-miller.de/s9y/categories/37-FSM

bei "Ein- oder Zwei-Prozess-Schreibweise für FSM"

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht lesenswert
> Laut ISim zählt der auch nach Erreichen von 10 fröhlich weiter
> auf 11, 12, ...
Da sollte aber bei einer Verletzung des Bereichs eine hammerharte 
Fehlermeldung kommen, denn du hast ja gesagt, dass du dem Zähler nur 
einen Zahlenbereich von 0 bis 10 zulässt.... :-o

> Es findet kein Überlaufen auf 0 statt.
Das ist nicht Sinn der range Angabe!
In der Hardware wird dein Zähler binär abgebildet, und dort wird er bei 
15 nach 0 überlaufen, denn 16 ist die nächste Zweierpotenz.

> ich möchte einen Zähler von 0 bis 10 bauen. Bei Überschreiten von 10,
> soll er wieder beim Wert 0 beginnen.
Vermutlich willst du einen Zähler von 0 bis 9 bauen, denn der zählt dann 
in Zehnerschritten. O bis 10 ergeben 11 Zähltakte.

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Euch beiden.

@Commtel:
Ich hatte gehofft, genau diese ausführliche Schreibweise damit umgehen 
zu können. Aber offensichtlich ist das Schlüsselwort dafür nicht 
geeignet.

@lkmiller:
Es kommt keine Fehlermeldung. Wenn ich mir die RTL Schematic anschaue, 
ist mir auch klar, warum nicht. Er verwendet einen 32-Bit Zähler. Unklar 
ist mir allerdings, warum er keinen 4-Bit Zähler implementiert?

Der Wertebereich 0-10 war übrigens nur ein Beispiel.

Grüße
Steffen

Autor: Steffen Hausinger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Eben habe ich noch etwas bemerkt:

In der Simulation läuft der Zähler auch jenseits der 10 oder 15 weiter 
aufwärts. In der RTL Schematic erkenne ich, dass er offensichtlich einen 
32-Bit Zähler verwendet.

Andererseits hat dieser Zähler angeblich nur 3 Ausgänge und in der 
Synthese gibt er ebenfalls an, einen 4-Bit Zähler einzusetzen. Siehe 
Anhang.

Wie kommt das zustande? Ein 4-Bit Zähler, der weiter als 15 zählen kann?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich mir die RTL Schematic anschaue, ist mir auch klar, warum nicht.
Mir absolut nicht, denn der Wertebereich ist constrained von 0 bis 10, 
...
> Er verwendet einen 32-Bit Zähler.
...der darf für den Zähler Counter_internal an sich keinen 
uneingeschränkten Integer hernehmen, auch wenn der Port Counter dann 
ein uneingeschränkter Integer ist. Das gibt mir sehr zu denken  :-o

EDIT:
Hast du in der Simulation irgendwas ausgeschaltet, oder einen 
Warning/Errorlevel ausgeblendet. Der dürfte niemals über 10 
hinauszählen, ohne dir die Ohren lang zu ziehen...

Simulier das doch mal mit Modelsim.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Ich habe das jetzt mal mit Modelsim simuliert:
# ** Fatal: (vsim-3421) Value 11 for counter_internal is out of range 0 to 10.
Das habe ich auch erwartet...

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin absoluter Anfänger in FPGA und VHDL. Mit der ISE von Xilinx 
hatte ich bisher ebenfalls noch nichts zu tun und dementsprechend 
komplex ist das ganze Thema momentan noch für mich. Ich kann nicht 
ausschließen, dass ich irgendetwas verstellt habe. Andererseits habe ich 
mich an das Tutorial von Xilinx gehalten und denke nicht, dass ich da 
irgendetwas verstellt habe. Wie würde der entsprechende Schalter denn 
lauten und wo wäre er zu finden?

Mit Modelsim zu simulieren klingt einfacher als es tatsächlich für mich 
ist. Ich kenne mich wie gesagt noch nicht einmal mit ISim aus. Soweit 
ich es aber verstanden habe, ist Modelsim eh kostenpflichtig?

Danke
Steffen

Autor: Commtel @msn (commtel)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ich hab mit dieser pdf angefangen

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
> Soweit ich es aber verstanden habe, ist Modelsim eh kostenpflichtig?
Nicht die Xilinx-Edition Modelsim XE. Die gibts für lau...

> Ich kenne mich wie gesagt noch nicht einmal mit ISim aus.
Ich mich auch nicht ;-)

> ich hab mit dieser pdf angefangen
Darin ist "nur" die seltsame Stimuli-Erzeugung mit einer Waveform 
beschrieben. Du solltest aber besser gleich "richtige" VHDL-Testbenches 
schreiben. Eine VHDL-Testbench ist ein normales VHDL-Modul, das keine 
Ports nach aussen hat. In dieses Modul wird die zu testende Komponente 
(component) integriert und darin Stimuli erzeugt. Sieh dir mal das an:
http://www.lothar-miller.de/s9y/categories/45-SPI-Master
Das obere VHDL-Modul beschreibt einen SPI-Master, der in der Testbench 
unten als Komponente eingebunden, verdrahtet und mit Signalen versorgt 
wird.

Autor: dr.schmock (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der 32-bit-Ausgang kommt zustande, weil der Port in der Entity so 
deklariert ist (nur "integer").

Autor: Ingo S. (logikneuling)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Ich weiß, der Beitrag ist einige Jahre alt!

Er ist aber immer noch einer der obersten Suchergebnisse, die sich über 
Google mit "integer range überlaufen isim warnung" etc. finden lassen.

Deshalb, und da ich ich heute selber einige Zeit damit verbracht habe, 
herauszufinden, wieso denn iSim eben doch keine Fehlermeldung ausgibt, 
wenn ein Integer range überschritten wird, die Erklärung:

Standardmäßig ist wohl in ISE Webpack 14.7 der entsprechende Parameter 
-rangecheck nicht gesetzt. Abhilfe schafft, im Project Navigator in der 
Ansicht "Simulation" mit Rechtsklick auf "Simulate Behavioral Model" die 
entsprechenden "Process Properties" zu öffnen, und dort ein Häkchen bei 
dem Punkt "Value Range Check" zu setzen!

Viele Grüße,
Ingo

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.