Vorab, ich entwerfe einen Regler mittels VHDL auf einem FPGA von Altera. Der Regler regelt dabei einen Step-Down, wobei dessen Eingangspannung veränderbar sein soll. Die Reglerparameter meines Reglers sind dabei abhängig von der Eingangspannung. Da die Eingangsspannung oft variert wird und dadurch die Reglerparamter ständig geändert werden müssen (was mit einen gewissen Zeitaufwand verbunden ist), wollte ich nachfragen, ob es eine Möglichkeit gibt, ähnlich wie bei C, eine Präprozessor-Konstante zu deklarieren, die dem Synthesetool anweist nur einen spezielen Pfad zu synthetisieren?
Was du brauchst, ist ein generate-Konstrukt, der eine Bedinung auswertet. Über generics würde eine Standardfunktion festgelegt und die Bedingungen gehen dann drüber. Alternativ baust Du alles parallel auf und bringst die Bedingung in den Code. Das Nichtbenötigte purzelt dann raus.
hallo Jürgen, danke für deine Antwort. Ich bin noch recht neu in der VHDL Welt, vondaher könntest du mir bitte einpaar Zeilen Beispielcode schreiben? Und was auch noch interessant wäre; mein Aufbau besteht aus mehreren Hierarchieebenen. Könnte ich demnach die genric für meine Top-Entity-hierarchy schreiben, sodass auch die Blöcke in den tieferen Ebenen auch den Wert der generi erhalten?
:
Bearbeitet durch User
Robert M. schrieb: > Könnte ich demnach die genric für meine Top-Entity-hierarchy schreiben, > sodass auch die Blöcke in den tieferen Ebenen auch den Wert der generi > erhalten? Du kannst generics natürlich auch einfach "von oben her" durchreichen. Robert M. schrieb: > Die Reglerparameter meines Reglers sind dabei abhängig von der > Eingangspannung. Da die Eingangsspannung oft variert wird und dadurch > die Reglerparamter ständig geändert werden müssen Der logische Kurzschluss ist mir nicht ganz nachvollziehbar. Wenn die Reglerparameter variabel sind, dann müssen die Dinger als Ports oder Registersätze in die Hardware. So, wie es ja z.B. in µCs auch Register für von aussen änderbare Werte gibt: Timerregister, Compareregister, Konfigurationsregister...
Robert M. schrieb: > ob > es eine Möglichkeit gibt, ähnlich wie bei C, eine Präprozessor-Konstante > zu deklarieren, die dem Synthesetool anweist nur einen spezielen Pfad zu > synthetisieren? Klar, der C-Präprocessor cpp kann super für VHDL-Code genutzt werden. Einfach die üblichen Präprocessor makros nutzen, cpp (bspw. per gcc -E *.vhd) drüber laufen lassen und den code nach dem Präprozessorlauf dem synthesizer verwerfen. Geht wunderbar mit make. http://blog.jwcxz.com/?p=1031 https://groups.google.com/forum/#!topic/comp.lang.vhdl/i2XxIlt0plI
Nur zum Verständnis: Bei einer Änderung der Regelparameter soll das Design aber schon neu synthetisiert werden, oder? Du möchtest nur mehrere Implementierungsvarianten in einem gemeinsamen Sourcecode vorhalten, zwischen denen Du mit einer Konstanten wählen kannst? Generics kannst Du Dir am besten vorstellen wie ein zusätzlicher Eingang Deiner Entity, der aber mit einer Konstanten belegt sein muss, die zur Synthesezeit bekannt ist, und der auch nur einmal bei der Synthese ausgewertet wird. Entspricht damit etwa einem #define bei C, und das #ifdef aus C heißt bei VHDL "if generate", wobei die abgeprüfte Bedingung bei der Synthese vollständig auswertbar sein muss. Falls Du ein großes Design mit vielen Konstanten hast, wird die Generic-Geschichte allerdings schnell unübersichtlich. In diesem Fall schreibt man ein VHDL-Package, das nur Konstantendeklarationen enthält und überall eingebunden wird, wo es gebraucht wird. Auf diese Weise kannst Du Dein gesamtes Design aus einem (oder mehreren) Package(s) parametrisieren. Das hat auch den Charme, dass Du keine Entities über zwanzig Hierarchiestufen ändern musst, wenn ein neuer Parameter hinzukommt. @Fpga Küchle Interesant, dass war mir auch neu. Aber wozu soll das gut sein? Das alles kann man doch in vhdl direkt machen, ohne zusätzlichen Preprocessor.
Vancouver schrieb: > @Fpga Küchle > > Interesant, dass war mir auch neu. Aber wozu soll das gut sein? Das > alles kann man doch in vhdl direkt machen, ohne zusätzlichen > Preprocessor. Der Preprocessor kann immer und überall Textpassagen entfernen/hinzufügen/austauschen egal welcher Compiler danach übern den Code läuft. Deshalb ist er der Klassiker seit über 30 Jahren und gestattete C Konstanten und Parameter eoinzusetzen bevor dergleichen im sprachspezifische Syntax-Lexik aufgenommen wurde. Allerdings sieht er eben nur dummen Text und deshalb kann man sich mit dem Präprozessor auch kräftig ins eigene Knie schiessen. Anders betrachtet erlaubt er gerade durch das "dumme Textersetzen" bedingte Kompilierung, wo ''if generate'' nicht eingesetzt werden kann. Oder das bedinget Einbinden von Files/Definition wo ''packages/config/use'' nicht benutzt werden können und den Ersatz von "magic numbers" ohne per ''generic/generic map'' durch die gesamte Hierarchie zu tunneln. Präprocessor ist halt ein dummes aber mächtiges Uralt-tool des Computerzeitalters. Ist nicht unersetzbar abe res finden sich immer wieder "Jobs" die der PräProz am besten kann.
Ich verwende denn cpp gern mal für komplexe/konfigurierbare toplevel entities. Mit VHDL geht das leider nicht. Auch haben manche Syn-tools Probleme mit if..generate.
Vancouver schrieb: > Nur zum Verständnis: Bei einer Änderung der Regelparameter soll das > Design aber schon neu synthetisiert werden, oder? Du möchtest nur > mehrere Implementierungsvarianten in einem gemeinsamen Sourcecode > vorhalten, zwischen denen Du mit einer Konstanten wählen kannst? Genau so war es gemeint. Danke das werde ich mal ausprobieren.
Wozu braucht es bei einer SO einfachen Regelung so viel Aufwand? Ich schreibe viel komplizierte Sachen direkt hin, mache Copy und Paste und passe ein paar Parameter an und fertig ist die Laube. Wird da wirklich SO oft hin und her geändert?
M. W. schrieb: > Ich schreibe viel komplizierte Sachen direkt hin, mache Copy und Paste > und passe ein paar Parameter an und fertig ist die Laube. Wenn du ein VHDL-Design weiterentwickelst, das mit unterschiedlichen Parametern in unterschiedlichen Umgebungen laufen soll, bist Du nach kurzer Zeit recht dankbar für parametrisierbaren Sourcecode. Copy-und-Paste-Orgien sind fehleranfällig und kosten viel Zeit. Irgendwann gewöhnt man sich daran, den Code von Anfang an flexibel zu halten.
Moin, copy/paste is fürs Coden von VHDL ja prima, aber fürs Unterhalten des Code weniger.. Das Problem ist oft: 1) man wird alt 2) man hat den Code monatelang nicht angeschaut 3) jemand möchte eine andere Konfiguration (-> rev 2.1) 3a) ein Kunde will nochmal die Konfiguration von rev 0.1 aber mit Interface rev 2.0. Und dann kommen alle noch mit nem neuen FPGA-Hersteller an... Diesen Baum von Revisionen willst du nicht mit copy paste warten, geschweige denn testen... Man kann auch noch einen Schritt weitergehen und die linux kernel config scripte missbrauchen. Mit dessen Hilfe und cpp lassen sich die ganzen Konfigurations-Orgien prima erschlagen. Siehe auch http://tech.section5.ch/news/?p=370. Gruss, - Strubi
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.