Forum: FPGA, VHDL & Co. C-Präprozessor für FPGA?


von Robert M. (andro86)


Lesenswert?

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?

von J. S. (engineer) Benutzerseite


Lesenswert?

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.

von Robert M. (andro86)


Lesenswert?

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
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Fpgakuechle K. (Gast)


Lesenswert?

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

von Vancouver (Gast)


Lesenswert?

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.

von Fpgakuechle K. (Gast)


Lesenswert?

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.

von mads (Gast)


Lesenswert?

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.

von Robert M. (andro86)


Lesenswert?

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.

von Michael W. (Gast)


Lesenswert?

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?

von Vancouver (Gast)


Lesenswert?

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.

von Strubi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.