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
ifrising_edge(clk)then
4
if(RISING)then
5
q<=i;
6
endif;
7
endif;
8
endprocess;
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.
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.
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.
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...
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.
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).
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.
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.