Forum: FPGA, VHDL & Co. in Schleife inkrementieren


von Klaus (Gast)


Lesenswert?

Hallo alle zusammen!
Ich verzweifel langsam. Innerhalb einer Schleife, möchte ich ein Signal 
(16-bit) erhöhen.
Dazu habe ich im Moment folgenden Code, der Taktsynchron arbeitet.
1
signal zahler : STD_LOGIC_VECTOR(0 to 15)
2
3
if Bus2IP_Clk'event and Bus2IP_Clk = '1' then
4
...
5
  for i in 0 to 20000 loop
6
    zahler <= CONV_STD_LOGIC_VECTOR(i,16);
7
  end loop;
8
...

Seltsamerweise erfolg die Zuweisung zu dem Signal "zahler" nur, wenn 
schon die ganze Schleife durchlaufen ist (also wird der Wert 20000 
zugewiesen).
Es soll aber kontinuierlich hochgezählt werden.
Wäre nett, wenn mir irgendjemand einen Tip geben kann und auch erklären 
kann, wieso sich das obere Codesegment so verhält.

Danke!
Klaus

von Rick Dangerus (Gast)


Lesenswert?

for-Schleifen sind in VHDL da, um mehrfach Hardware zu generieren. Suche 
mal nach dem Stichwort "Counter", da solltest du fündig werden.

Rcik

von Jan M. (mueschel)


Lesenswert?

Das kann nicht funktionieren. Eine for-Schleife in VHDL ist nicht gleich 
einer for-Schleife in C! In VHDL dient das Konstrukt nur dazu, 
Schreibarbeit zu sparen. Deine Schleife wird also zu:
1
zaehler <= '0';
2
zaehler <= '1';
3
...
4
zaehler <= '2000';
Und das dabei 2000 rauskommt, duerfte klar sein.

Was du brauchst, ist ein synchroner Prozess, der in jedem Takt dem 
Signal einen um eins hoeheren Wert zuweist.

von Frank (Gast)


Lesenswert?

Jupp, Schleifen in VHDL werden AFAIK immer ausgerollt (und die 
Wahrheitstabelle anschließend optimiert, falls möglich) und ergeben 
entsprechende Hardware. Also Vorsicht, häufig entsteht kaskadierte 
(=langsame) Logik oder Arithmetik.
Die Zuweisung eines Signals findet immer erst beim Verlassen des 
processes statt (oder bei einem wait).

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.