Forum: FPGA, VHDL & Co. VHDL generate nicht verstanden


von Daniel (Gast)


Lesenswert?

1
clk_rising : if RISING generate
2
begin
3
process(clk)
4
begin
5
if rising_edge(clk) then
6
q <= i;
7
end if;
8
end process;
9
end generate;

Ich verstehe einfach dieses generate nicht. Ich habe auch schon 
verschiedene Beschreibungen gelesen. Aber ich stehe irgendwie auf dem 
Schlauch.
Das ist doch das selbe wie:
1
process(clk)
2
begin
3
if rising_edge(clk) then
4
if (RISING) then
5
q <= i;
6
end if;
7
end if;
8
end process;

Ich verstehe den Vorteil diese befehles gegenüber einer normalen 
if-Anweisung nicht

von S. R. (svenska)


Lesenswert?

Im ersten Fall wird nichts erzeugt, wenn RISING false ist.

Im zweiten Fall wird in jedem Fall eine Schaltung erzeugt und es ist 
Aufgabe des Optimizers, festzustellen, dass RISING konstant ist und die 
Schaltung entweder rauszuoptimieren oder eben nicht.

von Eulen aus Düsseldorf (Gast)


Lesenswert?

Daniel schrieb:
> Ich verstehe den Vorteil diese befehles gegenüber einer normalen
> if-Anweisung nicht

Es gibt kein normales if in VHDL.

If ist im unterschied zu C kontextabhängig also ob es sequentiell oder 
nebenläufig ist, halt in welchen Kontext (getaktere oder 
kjombinatorischer Prozess) gebraucht wird.

Am besten du versuchst erst garnicht deine C-Erfahrung aus dem Bereich 
programmiersprachen auf die Hardwarebeschreibungssprache VHDL zu 
übertragen.

von MagIO (Gast)


Lesenswert?

Bin selbst neu in VHDL, aber vielleicht stimmt ja mein Senf :o)

Generate erlaubt es Hardware-Module generisch zu machen. So für sich 
allein gesehen würde das obere Beispiel keinen Sinn machen, vielleicht 
deswegen auch das Verständnis-Problem.
Entweder ich brauche diesen process, dann schreib ich ihn hin, oder eben 
nicht.

Wenn diese Hardware Definition aber Teil von einem größeren Modul ist, 
dann kann man durch RISING eben von Außen bestimmen - also von da, wo 
das Modul benutzt wird - ob da ein getasteter Ausgang gewünscht ist, 
oder nicht.

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


Lesenswert?

MagIO schrieb:
> Generate erlaubt es Hardware-Module generisch zu machen.
"Gener"ate hat ausser den selben Anfangsbuchstaben erst mal nichts mit 
"gener"isch zu tun.

Generisch bedeutet nur, dass etwas plattformunabhängig (beschrieben) 
ist.

Mit "Generate" kann man (mehrfach) Hardwaremodule erzeugen oder auch 
nicht.

Und so kann ein "Generate" dabei helfen generische Beschreibungen zu 
erstellen. Man braucht es aber nicht dazu.

Daniel schrieb:
> clk_rising : if RISING generate
> begin
> process(clk)
> begin
> if rising_edge(clk) then
> q <= i;
> end if;
> end process;
> end generate;
>
> Ich verstehe einfach dieses generate nicht.
Wie seiht der Rest darum herum aus? Hier wird wie gesagt einfach 
abhängig davon, ob RISING als true definiert ist oder nicht, ein Fipflop 
mit steigender Flanke erzeugt oder eben auch nicht.
Ich könnte mir vorstellen, dass da noch irgendwo ein FALLING oder ein 
LATCH oder ein THROUGH auch noch auftaucht...

von S. R. (svenska)


Lesenswert?

MagIO schrieb:
> Generate erlaubt es Hardware-Module generisch zu machen.

Du verwechselst "generate" mit "generic". ;-)

von Georg A. (georga)


Lesenswert?

Oft braucht man aber auch noch ein generate, um die generic-Werte zu 
verwursten ;)

von Daniel (Gast)


Lesenswert?

Sorry, aber ich verstehe es nicht. Ist es nur ein Compilerflag? also 
wird dies IF-Abfrage zum compilezeitpunkt entschieden?

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


Lesenswert?

Daniel schrieb:
> also wird dies IF-Abfrage zum compilezeitpunkt entschieden?
So ist es.
Allerdings hast du es nicht mit einem Compiler zu tun, sondern mit einem 
Synthesizer.

: Bearbeitet durch Moderator
von Georg A. (georga)


Lesenswert?

In C wäre das RISING (auch als generic) ein #define mit (am Ende der 
Auswertung) einer Konstante. Und das generate in #if. VHDL hat im 
Gegensatz zu C aber auch noch ein #for. Und als generic-Parameter 
"durchgereicht" wird der Wert in allen Modulen als Konstante angesehen 
und allen damit möglichen Optimierungen unterworfen bzw. im generate 
behandelt. Das geht so in C nicht (bzw. nur sehr mühsam).

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


Lesenswert?

Georg A. schrieb:
> Das geht so in C nicht (bzw. nur sehr mühsam).
Wenn man ein wenig nachdenkt, dann wird auch klar,  warum:  mit Generate 
wird parallele Hardware erzeugt. So etwas gibt's in C nicht annähernd.
Wobei wir jetzt am eigentlichen Problem angekommen sind: es ist 
unsinnig, VHDL mit C zu vergleichen.
Das ist wie wenn ich einen Toaster mit einem Schweißgerät vergleiche: 
natürlich ist an beiden Blech verbaut. Und natürlich haben beide einen 
Knopf, und wenn man den betätigt wirds heiß. Aber diese Gemeinsamkeiten 
sind eben an den Haaren herbeigezogenes und eigentlich belanglos.
Kurz und knackig: wer VHDL machen will muss VHDL verstanden haben. Es 
bringt ihm nichts, wenn er super C kann.

von Georg A. (georga)


Lesenswert?

Lothar M. schrieb:
> Wenn man ein wenig nachdenkt, dann wird auch klar,  warum:  mit Generate
> wird parallele Hardware erzeugt. So etwas gibt's in C nicht annähernd.

Nein, das ist IMO in dem Fall kein HW-spezifisches Ding, es liegt an der 
Sprache an sich. In C gibt es keinen Typ, der einen lokal statischen 
Wert (oder wie das bei VHDL heisst) als Funktionsparameter signalisieren 
kann, wie das bei generics möglich ist. Nur so kann der Linker (opps, 
Elaborator...) basierend darauf wieder den Compiler samt Optimierungen 
anwerfen. Innerhalb eines C-Moduls geht das noch, bei C++-Templates, die 
direkt in includes definiert werden, auch, aber modulübergreifend wird 
das recht anstrengend. Klar gibt es in C inzwischen auch globale 
Optimierungen, aber VHDL hat es mit dem generic viel einfacher.

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


Lesenswert?

Georg A. schrieb:
> es liegt an der Sprache an sich.
Natürlich, denn das Ziel der Sprache ist ja auch jeweils ein anderes.
Bevor ich in C z.B. 32 Funktionen mit einem statischen Index erzeuge, 
nehme ich 1 Funktion und übergebe den Index als Parameter. Denn es ist 
ja prinzipiell nicht nötig, 32 fast gleiche Funktionen zu haben, 
wenn/weil sowieso immer nur 1 davon aktiv sein kann.

Und deshalb sollte man C nicht mit VHDL vergleichen. Dieser Vergleich 
wird immer hinken...

von Georg A. (georga)


Lesenswert?

Lothar M. schrieb:
> Denn es ist
> ja prinzipiell nicht nötig, 32 fast gleiche Funktionen zu haben,
> wenn/weil sowieso immer nur 1 davon aktiv sein kann.

Aus Sicht der abstrakten Ausführung schon, darauf will ich aber gar 
nicht hinaus. Es ist völlig egal, ob ich aus einer Sprache eine Menge 
von Anweisungen oder eine Menge von Gattern synthetisiere/compiliere. 
Die Sprache kann das in der Effizienz des Ergebnisses unterstützen oder 
auch nicht.

C tut es nicht. Es erlaubt sehr viel, damit ist zu Compilezeit nur wenig 
Optimierung möglich. Unter anderem deswegen ist ja auch Fortran immer 
noch im HPC-Bereich so verbreitet. Das ist so simpel gestrickt, dass man 
viel optimieren kann.

VHDL würde auch problemlos ohne generate oder generics funktionieren. 
Wäre halt eine üble Schreibarbeit mit viel Redundanz. Von daher sind die 
Konstrukte in ihrem Ergebnis mit dem Präprozessor von C vergleichbar. 
Sie erzeugen/modifizieren Quellcode.

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.