VHDL generate nicht verstanden

Gast #4945893
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
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.
Gast
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.
Gast
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.
Moderator (Firma: Titel) Persönliche Seite
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...
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).
Moderator (Firma: Titel) Persönliche Seite
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.
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.
Moderator (Firma: Titel) Persönliche Seite
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...
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.