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
entitytest_rangeis
2
Port(CLK:inSTD_LOGIC;
3
Counter:outinteger);
4
endtest_range;
5
6
architectureBehavioraloftest_rangeis
7
signalCounter_internal:integerrange0to10;
8
begin
9
10
Counter<=Counter_internal;
11
12
TIMING:process(CLK)
13
begin
14
ifrising_edge(CLK)then
15
Counter_internal<=Counter_internal+1;
16
endif;
17
endprocess;
18
19
endBehavioral;
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
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
> 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.
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
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?
> 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.
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
> 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.
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