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


von Steffen Hausinger (Gast)


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:
1
entity test_range is
2
    Port ( CLK : in  STD_LOGIC;
3
           Counter : out integer);
4
end test_range;
5
6
architecture Behavioral of test_range is
7
  signal Counter_internal : integer range 0 to 10;
8
begin
9
10
  Counter <= Counter_internal;
11
12
  TIMING : process(CLK)
13
  begin
14
    if rising_edge(CLK) then
15
      Counter_internal <= Counter_internal + 1;
16
    end if;
17
  end process;
18
19
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

von Commtel (Gast)


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

von Commtel (Gast)


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"

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


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.

von Steffen Hausinger (Gast)


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

von Steffen Hausinger (Gast)


Angehängte Dateien:

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?

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


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.

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


Lesenswert?

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

von Steffen Hausinger (Gast)


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

von Commtel @. (commtel)


Angehängte Dateien:

Lesenswert?

ich hab mit dieser pdf angefangen

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


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.

von dr.schmock (Gast)


Lesenswert?

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

von Ingo S. (logikneuling)


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

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.