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
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
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.
@ 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
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
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.
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.
@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
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)
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.