Forum: FPGA, VHDL & Co. for-Schleife mit variablem Range


von Erik (Gast)


Lesenswert?

Hallo,


ich möchte in VHDL den Inhalt eines Vectors analysieren und würde dazu 
gerne eine for-Schleife benutzen. Das Problem ist das ich den 
interessanten Teil des Vectors erst zur Laufzeit kenne und dieser sich 
auch ändern kann, deswegen habe ich in dem Process 2 Variablen (Type 
Integer mit dem Range des Vectors als Grenzen) die ich am Anfang mit den 
richtigen Werten befülle und dann kommt die for-Schleife. Das Problem 
ist dass das so wohl nicht synthetisiert werden kann, ich bekomme die 
Meldungen :
"VHDL syntax error at UART.vhd(495): right bound of range must be a 
constant"
"VHDL error at UART.vhd(495): left bound of range must be a constant"

Wie kann ich mein Problem nun am geschicktesten lösen?
Da es für Start-Wert und End-Wert jeweils mehrere unabhängige 
Möglichkeiten gibt möchte ich auf jeden Fall nicht alle möglichen 
Varianten (das sind doch schon recht viele) einzeln hinschreiben.

Ideen? Vorschläge? Meinungen?
Ich bin ratlos.


Grüße
Erik

von olpo (Gast)


Lesenswert?

einfach runterzählen.

von Erik (Gast)


Lesenswert?

olpo schrieb:
> einfach runterzählen.

Geht das Bitte ein ganz klein wenig genauer?
Was meinst Du?

Oder sollte ich mal andere Arten von Schleifen probieren?


Grüße
Erik

von Strickwettbewerbgewinner (Gast)


Lesenswert?

Die Größe eines Vektors ist doch im FPGA konstant, da können ja schlecht 
zur Laufzeit plötzlich Leitungen hinzukommen! Und die Größe des Vektors 
nimmst du eben als Range für die for-Loop.

von Falk B. (falk)


Lesenswert?

@  Erik (Gast)

>Ideen? Vorschläge? Meinungen?

Auf die Schnelle würde ich sagen, dass in dieser Schleife variable 
Grenzen prinzipiell nicht synthetisierbar sind. Denn du beschreibst in 
VHDL mit einer Schleife keinen sequentiellen Ablauf in der Hardware, 
sondern vielmehr eine elegante Beschriebung einer (statischen) Logik. 
Die rasselt der Compiler durch und erstellt die Wahrheitstabelle. Das 
kann er aber nur mit konstanten Grenzen. Denn DANACH wird die Tabelle 
logisch minimiert und in eine kombinatorische Schaltung umgewandelt.

Entweder musst du IMMER den gesamten Vektor mit deiner Schleife 
durchlaufen, auch wenn das im Einzelfall nicht optimal ist.

Oder du must einen echten sequentiellen Ablauf mit Zählern und State 
Machine bauen, dann kann man die Grenzen variabel halten. Dann braucht 
deine Logik aber mehrere Takt, um das Ergebnis zu berechnen.

MFG
Falk

von Erik (Gast)


Lesenswert?

Strickwettbewerbgewinner schrieb:
> Die Größe eines Vektors ist doch im FPGA konstant,

Ja.

Strickwettbewerbgewinner schrieb:
> Und die Größe des Vektors nimmst du eben als Range für die for-Loop.

Ich möchte aber immer nur bestimmte Teile des Vectors auswerten, welche 
Teile das sind hängt von äußeren Signalen ab.


Falk Brunner schrieb:
> Auf die Schnelle würde ich sagen, dass in dieser Schleife variable
> Grenzen prinzipiell nicht synthetisierbar sind.

Andere Arten von Schleifen?

Falk Brunner schrieb:
> Denn du beschreibst in VHDL mit einer Schleife keinen
> sequentiellen Ablauf in der Hardware, sondern vielmehr eine
> elegante Beschriebung einer (statischen) Logik. Die rasselt
> der Compiler durch und erstellt die Wahrheitstabelle.

Richtig, aber diese Logik muss ja nicht zwangsläufig alle Eingänge 
benutzen sondern kann sich auf die beschränken welche durch den Range in 
der for-Schleife angewählt wurden.

Da kommt mir die Idee einfach die for-Schleife über den gesamten Vector 
laufen zu lassen und den eigentlichen Inhalt mit einem
if ( (i >= START_WERT) and (i <= END_WERT) ) then
einzuleiten. Damit müsste genau das raus kommen was ich will und der 
Compiler muss sich nicht mit einem variablen Range der for-Schleife 
ärgern muss aber trotzdem genau das machen was ich will.

Ich denke das werde ich morgen mal ausprobieren.
Oder hat jemand noch eine bessere Idee ?


Ich danke Euch für die Teilname an dieser Diskussion,
Erik

von Christian R. (supachris)


Lesenswert?

Wahrscheinlich hast du wie viele Anfänger eine völlig falsche 
Vorstelleung von dem, was eine for-Schleife in VHDL bedeutet. Entgegen 
der Bedeutung in Programmiersprachen ist for in der 
Beschreibungssprache VHDL eine texturelle Darstellung für das 
parallele Synthetisieren des Schleifeninhaltes. Die in der "Schleife" 
beschriebenen Elemente werden n mal parallel in Hardware umgesetzt.

von Georg A. (georga)


Lesenswert?

Irgendwoher muss die Variabilität ja kommen... Evtl. hilft dann ja das 
was: Wenn die Grösse des Vektors der Architecture als Generic übergeben 
wird, ist sie für den Compiler statisch, da bei der Instanziierung schon 
festgelegt.

von Falk B. (falk)


Lesenswert?

@Erik (Gast)

>> Auf die Schnelle würde ich sagen, dass in dieser Schleife variable
>> Grenzen prinzipiell nicht synthetisierbar sind.

>Andere Arten von Schleifen?

Hab ich beschrieben.

>Richtig, aber diese Logik muss ja nicht zwangsläufig alle Eingänge
>benutzen sondern kann sich auf die beschränken welche durch den Range in
>der for-Schleife angewählt wurden.

Aber nur, denn diese Grenzen zur Compilezeit bekannt sind, sprich 
KONSTANT sind. Genau deswegen meckert ja der Compiler.

>Da kommt mir die Idee einfach die for-Schleife über den gesamten Vector
>laufen zu lassen und den eigentlichen Inhalt mit einem
>if ( (i >= START_WERT) and (i <= END_WERT) ) then
>einzuleiten. Damit müsste genau das raus kommen was ich will und der
>Compiler muss sich nicht mit einem variablen Range der for-Schleife
>ärgern muss aber trotzdem genau das machen was ich will.

Das geht, erzeugt aber etwas komplexere Logik. Dein Fall klingt ähnlich 
wie der hier.

Beitrag ""Höchstes" Bit finden"

MFG
Falk

von Erik (Gast)


Lesenswert?

Christian R. schrieb:
> Wahrscheinlich hast du wie viele Anfänger eine völlig
> falsche Vorstelleung ....

Das glaube ich eher nicht. Ich bin mir völlig im klaren darüber wie die 
Schleife im FPGA umgesetzt wird und ich weiß auch das dafür in meinem 
Fall einiges an Logik drauf gehen wird aber damit kann ich leben (wobei 
ich da sicher noch an der eigentlichen Auswertung optimieren kann).


Grüße
Erik


PS.: ich programmiere FPGAs beruflich seit fast 8 Jahren und zwar in der 
Medizinbranche,
das ich da noch nie das Problem einer flexiblen Schleife hatte wundert 
mich selber, das erscheint mir eigentlich gar nicht so abwegig, aber 
ganz offensichtlich habe ich sowas noch nie probiert sonst hätte ich ja 
gewusst dass das nicht geht (oder ich hab das erfolgreich verdrängt)

von Christian R. (supachris)


Lesenswert?

OK, dann war das eine falsche Annahme. Bei fast allen Anfänger-Fragen zu 
Schleifen in VHDL muss man erst mal den Unterschied erklären.

von Erik (Gast)


Lesenswert?

Georg A. schrieb:
> Irgendwoher muss die Variabilität ja kommen

Ja, die kommt aus dynamischen (einsynchronisierten) Signalen von 
Außerhalb, der Vector hat immer die selbe Größe (die der maximal 
benötigten Größe entspricht). Wenn ich die Größe des Vectors reduzieren 
würde könnte ich bestimmte Kombinationen an Eingangswerten nicht mehr 
unterstützen und das darf ich nicht.


Falk Brunner schrieb:
> Aber nur, denn diese Grenzen zur Compilezeit bekannt sind,
> sprich KONSTANT sind.
Ja, ich hatte mir naiver Weise vorgestellt das der Compiler sowas wie 
meine zusätzliche if-Anweisung von vorhin dann einfach selbstständig 
baut, den maximalen Range der Schleife kann der Compiler ja ermitteln 
indem er alle möglichen Kombinationen der Eingangssignale berücksichtigt 
(das hab ich ja sogar im Code beschrieben wie von den Eingangssignalen 
auf den Range zu kommen ist indem ich den Start-Wert und den End-Wert 
händisch im Code ermittle).

Ich werde das mit der if-Abfrage morgen einfach mal probieren und 
schauen wo es hin geht.

Das ganze über mehrere Takte zu verteilen (State-Maschine) geht leider 
nicht da der Vector mit jedem Takt seinen Inhalt ändern kann. Das 
einzige was geht ist das ganze zu pipelinen aber ob sich der Aufwand 
lohnt muss ich erst noch sehen.


Christian R. schrieb:
> OK, dann war das eine falsche Annahme.

Kein Problem, ist nichts passiert.


Grüße und Danke für Eure Hilfe
Erik

von Mike (Gast)


Lesenswert?

Wie groß ist denn dein Vektor und wieviele Bits daraus brauchst du?

Wenn du damit leben kannst dass der Ausschnitt eine feste Größe hat, 
dann kannst du dir ja den interessanten Bereich ausmaskieren und/oder 
mit einem Shifter (aus Multiplexern oder mit einem Multiplizierer) 
zurechtrücken.

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


Lesenswert?

Erik schrieb:
> Ich werde das mit der if-Abfrage morgen einfach mal probieren und
> schauen wo es hin geht.
Du kannst auch mit exit aus der for-Schleife raus. Auf jeden Fall wirst 
du tolle Kombinatorik bekommen, die dann diese Forderung ganz schön in 
die Enge treiben kann:
>  da der Vector mit jedem Takt seinen Inhalt ändern kann.

> Ideen? Vorschläge? Meinungen?
Hast du mal eine while-Schleife probiert? Du kannst dort mit einem 
Startwert /= 0 beginnen und mit einem variablen Endwert aufhören...

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.