VIVADO Simulation

#4315480
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
Angehängte Dateien:
(Firma: Schweigstill IT) Persönliche Seite #4315556
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.
Gast #4315655
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
#4316308
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!
Angehängte Dateien:
Gast #4316319
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren