Forum: FPGA, VHDL & Co. VIVADO Simulation


von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Hallo,

also wenn ich schreibe
1
signal position: integer range 0 to 15:=0;
2
3
process begin
4
wait until rising_edge(btnC);
5
    led_vector <= (others => '0');
6
    position <= position +1;
7
    led_vector(position) <= '1';
8
end process;

dann würde ich erwarten, dass das ein 4-Bit Zähler ist der dann 
überläuft. Auf Hardware ist das auch so. In der Simulation nimmt 
position aber den Wert 16 (!) an.

ERROR: Index 16 out of bound 15 downto 0

Der Fehler betrifft die Zeile mit dem led_vector.

Dann habe ich das umgeschrieben nach:
1
if position < 15 then
2
    position <= position +1;
3
else
4
    position <= 0;
5
end if;

Und bekomme den Fehler immernoch. Was mache ich falsch?
Im Anhang alles was man braucht.

Edit:
Stimmt nicht, nach der Änderung kommt der Fehler nichtmehr sondern die 
Simulation zeigt das richtige Ergebnis. Wieso hab ich das nicht bemerkt? 
Anscheinend reicht es in VIVADO nicht das vhdl zu editieren, 
abzuspeichern und die Simulation neu zu starten, sondern man muss auch 
die Synthese vorher neu laufen lassen?! Liege ich da richtig?
Wieso die limitierte Integer nicht überläuft und sogar einen Wert 
ausserhalb des Bereichs annimmt verstehe ich trotzdem nicht. Mit 
unsigned passt alles. War das schon immer so dass Integers nicht 
übergelaufen sind? Wieso ist das so?

Vielen Dank!
Gustl

: Bearbeitet durch User
von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Gustl B. schrieb:
> Anscheinend reicht es in VIVADO nicht das vhdl zu editieren,
> abzuspeichern und die Simulation neu zu starten, sondern man muss auch
> die Synthese vorher neu laufen lassen?! Liege ich da richtig?

Ja, natürlich ist das so. Wie sollen sich denn sonst die Auswirkungen 
der Änderung bemerkbar machen? Auf Grund des unter Umständen sehr hohen 
Zeitbedarfs für eine erneute Synthese wird diese nicht automatisch 
angestoßen, sobald sich ein Quelltext geändert hat.

von Gustl B. (-gb-)


Lesenswert?

War das bei ISE auch so? Mir war das jetzt neu ... aber ok.

von Christian R. (supachris)


Lesenswert?

Synthese muss für die Simulation eigentlich nicht angestoßen werden. 
Aber die Kompilierung des Quellcodes. Vielleicht hat Vivado da nicht 
korrekt mitbekommen, dass sich etwas geändert hat?

von Gustl B. (-gb-)


Lesenswert?

Ah ok, hast recht. Da gibt es restart und relaunch. Bei relaunch wird 
das neue VHDL beachtet. Jetzt passt wieder alles.

von Bit Klemnpner (Gast)


Lesenswert?

Gustl B. schrieb:
> War das schon immer so dass Integers nicht
> übergelaufen sind? Wieso ist das so?

Bei der simulation muss der range check angeschaltet sein um Überläufe 
zu entdecken. Bei Vivado - isim ist er wohl defaultmäßig off.

von Duke Scarring (Gast)


Lesenswert?

Gustl B. schrieb:
> War das schon immer so dass Integers nicht
> übergelaufen sind? Wieso ist das so?
Ja, das war schon immer so. Und das ist auch gut so.
Damit kann man in der Simulation genau solche Fehler entdecken, die in 
Hardware zu unerwartetem Verhalten führen.

Der Simulator kann gar nicht wissen, wie ein Integer auf Hardware 
abgebildet wird. Das mach ja ein anderes Tool: die Synthese.

Duke

von Klakx (Gast)


Lesenswert?

wenn du den überlauf modellieren willst, dann geh eine Etage tiefer und 
nimm unsigned statt integer

von Michael W. (Gast)


Lesenswert?

Klakx schrieb:
> wenn du den überlauf modellieren willst, dann geh eine Etage tiefer und
> nimm unsigned statt integer


Deshalb nehme ich so gerne den logic-vector :-)

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Ok, vielen Dank! Aber es geht weiter, wieder hab ich eine Simulation die 
nicht zur Hardwarebeschreibung passt, also das glaube ich zumindest mal 
wieder.

Ich habe eine PWM da wird ein 16 Bit Zähler hochgezählt. Mit den 16 
Switches auf dem Board soll man die PWM Weite einstellen können.

Die LEDs sind dann '1' wenn der mit den Switches eingestellte Wert 
kleinergleich dem Zählerwert ist. Auf Hardware funktioniert das auch, 
aber in der Simulation sind die LEDs immer auf '1'.

Ja es sind 3 LEDs, das ist eine RGB die ich einfach weiß dimmen möchte.

Weil die Zähler etwas länger sind muss man etwas mehr Zeit simulieren. 
Das ist auch gleich der nächste Punkt, dieser iSIM in VIVADO stürzt 
gerne mal ab wenn man da ein paar ms lang simulieren möchte. Und dann 
funktioniert auch der Rest vom VIVADO nichtmehr :-(

So, die VHDL sind im Anhang.

Vielen Dank!

von Klakx (Gast)


Lesenswert?

Gustl B. schrieb:
> Die LEDs sind dann '1' wenn der mit den Switches eingestellte Wert
> kleinergleich dem Zählerwert ist. Auf Hardware funktioniert das auch,
> aber in der Simulation sind die LEDs immer auf '1'.

Init:
signal pwm_zaehler: unsigned(15 downto 0):=(others => '0');
signal sw_tb : std_logic_vector(15 downto 0):=(others => '0');

Auführung:
RGB1_Red <= '1' when pwm_zaehler <= unsigned(sw);
RGB1_Green <= '1' when pwm_zaehler <= unsigned(sw);
RGB1_Blue <= '1' when pwm_zaehler <= unsigned(sw);

da zum Zeitpunkt 0 beide Werte 0 sind, sind folglich deine LEDs auf 1

von Gustl B. (-gb-)


Lesenswert?

Ja gut, aber das kann ich verschmerzen. In der Simulation bleiben die 
dauerhaft auf '1', auf der Hardware aber nicht.

Edit:
Oh weia, ich habe natürlich das else '0' vergessen ... es ist einfach zu 
spät. Sorry!

: Bearbeitet durch User
von Michael W. (Gast)


Lesenswert?

ModelSIM - coverage verwenden. Sehr aufschlussreich. Keine Ahnung, ob 
Vivado sowas kann.

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.