Hi Leute!
Ich hab wieder eine Frage zu VHDL.
Heute geht's um for-Schleifen.
Da ich C/C++ gewohnt bin, ist VHDL jetzt schon irgendwie eine große
Umstellung. Deswegen hab ich nun zu diesem Code-Fragment eine Frage:
1
for i in 0 to 7 loop
2
w(i) <= a(i) and b; -- 8bit bus "a" mit Einzelsignal "b" verunden
3
end loop;
In C/C++ muss man im Kopf der for-Schleife die Zählvariable
inkrementieren; i++ bspw. Warum muss man das VHDL nicht? Oder ist dieser
Code falsch?
In Abhängigkeit von i wird dem w also irgendwie was zugeordnet. Ich
verstehe also nicht so ganz was mit dem Ausdruck
Das ist so, weil anders als in C/C++ eine for-Schleife in VHDL eine
parallele Hardware ist. In deinem konkreten Fall werden zwei Vektoren
ver-Undet und zwar alle Bits auf einem Schlag gleichzeitig.
For-Schleifen werden in VHDL/Verilog immer aufgerollt.
In deinem konkreten Fall könntest du auch schreiben:
1
w(0)<=a(0)andb;
2
w(1)<=a(1)andb;
3
w(2)<=a(2)andb;
4
w(3)<=a(3)andb;
5
w(4)<=a(4)andb;
6
w(5)<=a(5)andb;
7
w(6)<=a(6)andb;
8
w(7)<=a(7)andb;
Das wäre exakt das gleiche. Nur weil das weniger zu schreiben ist, kann
man auch die for-Schleife nehmen.
Immer merken. For ist in VHDL/Verilog parallel, in C/C++ usw. dagegen
sequenziell.
Christian R. schrieb:> Das ist so, weil anders als in C/C++ eine for-Schleife in VHDL eine> parallele Hardware ist. In deinem konkreten Fall werden zwei Vektoren> ver-Undet und zwar alle Bits auf einem Schlag gleichzeitig.> For-Schleifen werden in VHDL/Verilog immer aufgerollt.
Meinst du mit "aufrollen" immer von 0 nach oben zählen? Wie gibt man an
wie weit man nach oben zählen will?
> Immer merken. For ist in VHDL/Verilog parallel, in C/C++ usw. dagegen> sequenziell.
Was bedeutet parallel? In C/C++ wird bspw. erst w(0) ein Wert zugewiesen
dann w(1) usw. In VHDL geht das dann in einem Rutsch quasi alles auf
einmal, oder wie? Irgendwie schwierig vorzustellen...
wert schrieb:> Meinst du mit "aufrollen" immer von 0 nach oben zählen? Wie gibt man an> wie weit man nach oben zählen will?
Aufgerollt wird so, wie du die Schleife hinschreibst.
>> Immer merken. For ist in VHDL/Verilog parallel, in C/C++ usw. dagegen>> sequenziell.> In VHDL geht das dann in einem Rutsch quasi alles auf> einmal, oder wie?
Nicht in VHDL, sondern in der damit beschriebenen Hardware geht das "auf
einmal", einfach, weil alles paralell existiert.
> Irgendwie schwierig vorzustellen...
Wird schon noch...
Einfach merken: VHDL ist nicht C!
Ein Syntaxelement, das in beiden Sprachen vorkommt, muss nicht auch
beide Male das gleiche bewirken...
Sieh dir einfach immer wieder mal den RTL-Plan deiner VHDL-Beschreibung
an (es ist keinVHDL "Programm"!)
Gut, ich werd mir merken, es ist eine VHDL-Beschreibung!
1
for i in 0 to 7 loop
2
w(i) <= a(i) and b; -- 8bit bus "a" mit Einzelsignal "b" verunden
3
end loop;
Ich hab also noch dieses Code-Fragment. Ich frage mich nun schon die
ganze Zeit - da ich auch weiß, dass es in VHDL auch Funktionen gibt -
wie ich aus dieser for-Schleife eine Funktion aufrufen kann.
Könntet ihr mir vielleicht helfen und mein Code-Fragment um einen
x-beliebige Funktionsaufruf erweitern?
Wie die Funktion heißen soll ist ja egal. Nenn wir sie einfach myFunc
oder so...
function parity_generator (din : std_ulogic_vector)
2
return std_ulogic is
3
variable t : std_ulogic := '0'; -- variable mit default Zuweisung
4
begin
5
6
for i in din'range loop -- ganze Busbreite
7
t := t xor din(i);
8
end loop;
9
10
return t;
11
end parity_generator;
Ich hab nun auf Wiki ein Beispiel gefunden, dass mir eine Funktion
zeigt, die eine for-Schleife besitzt. In dieser for-Loop verstehe ich
nun einiges nicht. "for i" ist soweit noch in Ordnung. Das "i" ist die
Zählvariable das "in" kommt mir aus meinem anderen Beispiel auch noch
bekannt vor und kenn ich auch noch. Aber nun geht's los: Was soll das
"din'range" bedeuten?
Weitere Frage: An eine Funktion kann doch bestimmt auch ein Wert "von
außen" übergeben werden. Wie greife ich innerhalb der Funktion bzw.
innerhalb der for-Loop (was ja wahrscheinlich gleich bleiben dürfte!)
drauf zu?
Wie man lesen kann, steht in der Funktionsdefinition auch "din".
Anscheinend wird an die Funktion vector übergeben, der in der Funktion
mit "din" benannt wird. Ich verstehe aber nun "din'range" leider immer
noch nicht, auch wenn ich mir vorstellen kann, dass das was damit zu tun
hat.
Über dieses " ' " im Code von VHDL-Beschreibungen bin ich auch schon
desöfteren in Form von Prozessen gestoßen. Leider hab ich da auch noch
nicht so ganz verstanden, was es mit diesem " ' " auf sich hat!
Vielleicht mögt ihr mir ja meine Fragen beantworten?
wert schrieb:> Wie gibt man an> wie weit man nach oben zählen will?
In deinem Beispiel oben 0 bis 7, steht ja da. Die beschriebene
Hardware wird also 8 mal nebeneinander abgebildet. Denke mal bei
VHDL immer in Gattern und FlipFlops. Das was da als For-Schleife steht,
sind einfach 8 UND-Gatter.
Funktionen in VHDL sehen zwar ähnlich aus, wie in C, machen aber auch
was anderes. Hinter einer Funktion (die synthetisierbar ist) verbirgt
sich nichts weiter als eine Schaltung. Das Wort aufrufen passt bei VHDL
aber auch nicht.
Ich geb dir einen guten Rat: Als Anfänger brauchst du keine
For-Schleifen, keine (selbst geschriebenen) Funktionen und nur genau
einen einzigen Takt in deinem System.
Und denke außerdem dran: Nur etwa 5% von VHDL lassen sich
synthetisieren, also in Hardware wirklich benutzen. Der Rest ist für die
Simulation.
Das ' (sprich: Tic) zeigt an, dass anschliessend ein Attribut kommt,
das auf den vorhergehenden Ausdruck angewendet werden soll. Ein recht
bekanntes Attribut ist z.B. 'event für die Auswertung eines
Signalwechsels (als Beschreibung einer steigenden oder fallenden Flanke
eines Taktes).
Such mal mit Google nach vhdlqrc und druck dir die dann aus.
Christian R. schrieb:> Ich geb dir einen guten Rat: Als Anfänger brauchst du keine> For-Schleifen, keine (selbst geschriebenen) Funktionen und nur genau> einen einzigen Takt in deinem System.
Und nur in seltensten Ausnahmefällen das erste halbe Jahr eine Variable!
Hier sind sie nochmal, meine Postulate:
Beitrag "VHDL - For-Schleife"
Ein TIpp: lies den Thread ruhig mal ganz durch.
Und auch der hier geht alle Anfänger (und insbesondere die
Programmierer) an:
Beitrag "Re: Einige Fragen zu VHDL"
wert schrieb:> Ich hab wieder eine Frage zu VHDL.
Ich Tip:
Programmiersprache in C usw. laufen auf einem Prozessor, der ein
Programm Schritt für Schritt abarbeitet.
Mit VHDL beschreibst Du das Verhalten einer Schaltung. Es gibt aber
keinen Prozessor, der das "VHDL-Programm" abarbeiten würde.
Danke für eure Hilfe!
Ich hab dann mal noch eine Frage, allerdings nicht zu for-Schleifen,
sondern, zu concurrent statements.
Wie würdet ihr concurrent statements in einem Satz beschreiben?
Ich hab das mal so probiert: Concurrent Statements sind nebenläufige
Signalzuweiseungen, für die es egal ist, an welcher Stelle innerhalb
der Architektur sie aufgerufen werden.
Könnte man das so sagen?
wert schrieb:> Wie würdet ihr concurrent statements in einem Satz beschreiben?
Vom Satz her bedeutet es ja so was wie gleichsam/-zeitig existente
Deklarationen"
Mit Bezug auf die Fragestellung C++/VHDL würde ich es so übersetzen:
"gleichzeitig ausführbare Anweisungen"
wert schrieb:> In C/C++ muss man im Kopf der for-Schleife die Zählvariable>> inkrementieren; i++ bspw. Warum muss man das VHDL nicht?
Doch, aber die Anweisung steckt im Kommando "loop" mit drin. Der
Synthesizer, also das Programmpaket, weiss schon, dass er um 1 erhöhen
soll.
Bezüglich Deiner grundsätzlichen Frage und Herangehensweise:
Ich habe den Studenten immer erklärt, dass man mit VHDL nicht direkt den
Chip-, sondern das Chipprogrammiertool programmiert und kommandiert.
Die Loopanweisung führt also nicht der Chip aus, sondern das Programm
zur Compile/Ausführungszeit und tut irgendwas mehrfach. Dabei kann
durchaus ein zeitlich variantes Schaltwerk rauskommen - muss aber nicht.
Es kann auch eine mehrdimensionale pipeline oder Matrix aufgezogen
werden. Das Ganze ähnelt sehr den Beschreigungen, wie sie auch im CAD/MM
BEreich benutzt werden, um Szenen für Renderanimationen zu beschreiben.
Dort werden gewaltige Gebilde mit Schleifen und bool'schen Operationen
gebildet.
wert schrieb:> an welcher Stelle innerhalb der Architektur sie aufgerufen werden.
Da wird nichts "aufgerufen". Die nebenläufige Anweisung steht einfach
nur da.
Jürgen S. schrieb:> Ich habe den Studenten immer erklärt, dass man mit VHDL nicht direkt den> Chip-, sondern das Chipprogrammiertool programmiert und kommandiert.>> Die Loopanweisung führt also nicht der Chip aus, sondern das Programm> zur Compile/Ausführungszeit und tut irgendwas mehrfach.
Du darfst das "Chipprogrammiertool" und das "Programm" schon beim Namen
nennen: Synthesizer. Oder wenns globaler werden soll (und
Translate,P&R,Bitgen... dazukommen) auch Toolchain. Dann bekommt man ein
Gefühl dafür, dass es eben nicht nur 1 Programm ist, das da versteckt
die Arbeit tut, sondern mehrere, die jeweils eine nahezu unabhängige
Funktion haben.
Das ist das erste, was ich meinen Praktikanten und Diplomanden (sowie
auch Bacheloranden und Masteranden [*]) klar mache.
[*]
Das sind ja mal blöde Wortschöpfungen...
Und vor/trotz allem deutscher Sprachgebrauch laut Duden:
http://www.duden.de/rechtschreibung/Bachelorandhttp://www.duden.de/rechtschreibung/Masterand
>> Ich habe den Studenten immer erklärt, dass man mit VHDL nicht direkt den> Chip-, sondern das Chipprogrammiertool programmiert und kommandiert.>> Die Loopanweisung führt also nicht der Chip aus, sondern das Programm> zur Compile/Ausführungszeit und tut irgendwas mehrfach. Dabei kann> durchaus ein zeitlich variantes Schaltwerk rauskommen - muss aber nicht.
Argh, mit VHDL wird nicht programmiert sondern Hardware beschrieben!
Das wird zwar der Etymologie nicht gerecht, vermeidert aber dicke
Kopfschmerzen. Da wird auch nix zur Laufzeit ausgeführt sondern die
Verhaltensbeschreibung eine Äquivalente Netzliste überführt.
Loop bedeutet hier auch nicht schleife im sinne eines mehrfaches
Durchlaufen eines Zyklus sondern das nebeneinander ausführen der selbeb
Funktion durch unabhängige Instanzen, also eher loop - unrooling oder
cloning.
Vielleicht sollte man den Stunden erst eine Netzbeschreibung wie in
Spice oder EDIFF nahebringen und dann zeigen das VHDL durch die Synthese
in eine solche überführt. Vergleiche mit Programmiersprachen wie
C/PASCAL/ADA sind m.E. immer kontraproduktiv.
MfG,
Fritz Jaeger schrieb:> Vielleicht sollte man den Stunden erst eine Netzbeschreibung wie in> Spice oder EDIFF nahebringen und dann zeigen das VHDL durch die Synthese> in eine solche überführt.
Ich erkläre immer, dass VHDL/Verilog lediglich eine texturelle
Darstellung eines Schaltplans ist.
Christian R. schrieb:> Ich erkläre immer, dass VHDL/Verilog lediglich eine texturelle> Darstellung eines Schaltplans ist.
Nein, VHDL/Verilog ist die Beschreibung des VERHALTENS des Schaltplans,
nicht des Schaltplans selbst.
Daraus kann man dann einen Schaltplan erzeugen, der sich genauso verhält
wie die gewünschte Beschreibung.
Das muss nicht unbedingt eindeutig sein, wie man bei der VHDL Synthese
sieht.
Der Compiler für Altera wird aus der selben Beschreibung eine andere
Netzliste erzeugen als der von Xilinx, weil er andere Elemente zur
Verfügung hat.
Sicher, aber wenn du das einem Studenten versuchst zu erklären, fällt
der meist wieder in die Programm-Denkweise zurück. Ein Verhalten ist für
die meisten, die mal programmiert haben, nicht das, was "wir" unter
Verhalten verstehen.
Christian R. schrieb:> Sicher, aber wenn du das einem Studenten versuchst zu erklären, fällt> der meist wieder in die Programm-Denkweise zurück.
Das erinnert mich daran, wie ich in VHDL anfangs mal versucht habe,
einen Zeiger zu übergeben ;)
> Das erinnert mich daran, wie ich in VHDL anfangs mal versucht habe,> einen Zeiger zu übergeben ;)
Mag jemand einen Thread "Die schlimmsten Verbrechen in VHDL starten"?
Ich hab da mal von einem ATA-Controller gehört der rekursiv beschrieben
wurde. Synthetisierte zu genialen 278 kHz maximale Taktfrequenz.
Gruß
Am Anfang muß man begreifen, daß man VHDL interpretieren muß und dabei
am Ende ein Schaltplan herauskommt. Der vergleich mit einem
Rederingprogramm finde ich sehr treffen. Nennt sich übrigens SDL
(Scene-Description-Language). VHDL ist halt auch eine HDL
(Hardware-Description-Language). Dort wird etwas gebaut. Und wenn man
mal ein gebautes Teil öffter brauch dann packt man es halt in eine
Schleife und "zeichnet" es öfter in den Schaltplan. In der Schleife muß
man nun auch mathematisch beschreiben welche "Pins" (Signale) des
Bauteils mit welchen "Pins" anderer Bauteile verdrahte werden sollen.
Wenn man eine Schleife bauen möchte muß man erstmal etwas bauen das
Zählen kann. Also einen Zähler, (aus FlipFlops) und wenn man bis zu
einem bestimmten Wert zählen möchte, dann muß man an den Zähler einen
Vergleicher anschließen (Comparator).
Fritz Jaeger schrieb:> Argh, mit VHDL wird nicht programmiert sondern Hardware beschrieben!
"prgrammieren" = "vorschreiben" siehe Wikipedia!
Fritz Jaeger schrieb:> Da wird auch nix zur Laufzeit ausgeführt
Aber klar doch. Es war die Laufzeit des Syntheseprogramms gemeint.
Das Synthesprogramm wird angewiesen (also "programmiert"), was es tun
soll, ähnlich, wie eine Werkzeugmaschine.
Klaus Falser schrieb:> Nein, VHDL/Verilog ist die Beschreibung des VERHALTENS des Schaltplans,>> nicht des Schaltplans selbst.
Moment mal, dass ist jetzt das "Miauen" des "Katzengesangs".
Da hast Du Dich verrannt, oder verschrieben. Pläne haben keine
Eigenschaft "Verhalten" sondern nur die Eigenschaften "existent",
"detailliert" etc.... Pläne sind statisch!
Es wird also nicht das Verhalten des Schaltplans, sondern das
Verhalten der Schaltung beschrieben! Und das Verhalten der Schaltung
wird durch das Aufschreiben oder Malen beschrieben und damit "geplant".
Damit ist VHDL auf der logischen Ebene wie ein Schaltplan.
Du darfst nicht übersehen, dass ein Schaltplan durch die Darstellung der
Verbindungen nicht nur die Struktur- sondern auch Verhalten
symbolisiert, weil durch die Nennnung der Chips klar ist, was passiert.
Das ist definitiv so, sonst könnte kein Simulator eine Schaltung
simulieren.
Dipl.-Ing. (TH) schrieb:> Damit ist VHDL auf der logischen Ebene wie ein Schaltplan.
Sehe ich ähnlich, und damit kann man die meisten auch in die richtige
Denkweise bringen.
Dipl.-Ing. (TH) schrieb:> Da hast Du Dich verrannt, oder verschrieben. Pläne haben keine> Eigenschaft "Verhalten" sondern nur die Eigenschaften "existent",> "detailliert" etc.... Pläne sind statisch!>> Es wird also nicht das Verhalten des Schaltplans, sondern das> Verhalten der Schaltung beschrieben! Und das Verhalten der Schaltung> wird durch das Aufschreiben oder Malen beschrieben und damit "geplant".
Ok, da muss ich mich entschuldigen, da hätte ich genauer sein sollen.
Ich meinte natürlich das Verhalten der Schaltung.
Ein Schaltplan ist für mich aber nur die Beschreibung der Verdrahtung,
also was wohin verbunden ist.
Er beschreibt eigentlich nicht wann und wie sich die Signale ändern, das
steckt im Wissen über das Verhalten der verdrahteten Komponenten.
Ist aber alles letztendlich ein Streit um des Kaisers Bart, wenn jeder
versteht worum es geht ist ja alles OK.
Klaus Falser schrieb:> Ok, da muss ich mich entschuldigen,
warum schreibst du als Gast?
Ich sehe es ähnlich wie Christian: VDHL ist eine Darstellung der
Struktur, aber auch des Verhaltens. Es ist eben beides.
Dipl.-Ing. (TH) schrieb:> Fritz Jaeger schrieb:>>> Da wird auch nix zur Laufzeit ausgeführt>> Aber klar doch. Es war die Laufzeit des Syntheseprogramms gemeint.
Man darf den Begriff Programm nicht immer nur in die Software
hineindenken und Abläufe sehen.
Eine Modenschau, eine Zauberveranschaltung und sogar manche Parteien,
haben auch ein "Programm".
Berndt schrieb:> Klaus Falser schrieb:>> Ok, da muss ich mich entschuldigen,>> warum schreibst du als Gast?>> Ich sehe es ähnlich wie Christian: VDHL ist eine Darstellung der> Struktur, aber auch des Verhaltens. Es ist eben beides.>> Dipl.-Ing. (TH) schrieb:>> Fritz Jaeger schrieb:>>>>> Da wird auch nix zur Laufzeit ausgeführt>>>> Aber klar doch. Es war die Laufzeit des Syntheseprogramms gemeint.>> Man darf den Begriff Programm nicht immer nur in die Software> hineindenken und Abläufe sehen.>> Eine Modenschau, eine Zauberveranschaltung und sogar manche Parteien,> haben auch ein "Programm".
Klar hat "Programmieren" eine Etymologie die andere Wortbedeutungen
beinhalten. Aber jetzt Lernende aufzufordern sich in die Gemeinsamkeiten
zwischen einem VHDL-Programm und dem Programm der Piratenpartei ist doch
ungequirrlter Bullensch*:
MfG,
Dipl.-Ing. (TH) schrieb:> Fritz Jaeger schrieb:>> Argh, mit VHDL wird nicht programmiert sondern Hardware beschrieben!>> "prgrammieren" = "vorschreiben" siehe Wikipedia!
Hier ist nicht Wikipedia hier ist die geballte Kompetenz von mehreren
Hundert Mannjahren VHDL-Erfahrung. Und die besagt das man tunlichst
vermeiden soll das Erstellen von VHDL-Code mit der Erstellung von
Computerprogrammen zu erklären oder nahezubringen.
Ferner impliziert "Laufzeitumgebung" eine Interpretersprache die VHDL
bestimmt nicht ist. Es sei denn man bezeichnet jeden Text der von einem
Computer verarbeitet wird als Programm.
>> Fritz Jaeger schrieb:>> Da wird auch nix zur Laufzeit ausgeführt> Aber klar doch. Es war die Laufzeit des Syntheseprogramms gemeint.>> Das Synthesprogramm wird angewiesen (also "programmiert"), was es tun> soll, ähnlich, wie eine Werkzeugmaschine.
Nein, es handelt sich hierbei nicht um die Abarbeitung eines im
VHDL-Code hinterlegten Ablauf sondern um die Synthese von einer
Beschreibungsform in die andere. Es behauptet auch keiner eine
Spracherkennung wie Siri würde durch das gesprochenen Wort programmiert,
oder die Bildverarbeitung durch das zu verarbeitende Bild.
MfG
Klaus Falser schrieb:> Christian R. schrieb:>>> Ich erkläre immer, dass VHDL/Verilog lediglich eine texturelle>> Darstellung eines Schaltplans ist.>> Nein, VHDL/Verilog ist die Beschreibung des VERHALTENS des Schaltplans,> nicht des Schaltplans selbst.> Daraus kann man dann einen Schaltplan erzeugen, der sich genauso verhält> wie die gewünschte Beschreibung.> Das muss nicht unbedingt eindeutig sein, wie man bei der VHDL Synthese> sieht.
?Beispiele? Mir fällt gerade kein eindeutiger synthesefähiger Code ein.
Gerade für die Synthese muss das System vollständig beschrieben sein,
insbesonderes alle Zustandsübergänge und alle Übertragungsfunktionen.
Eine verhaltensbeschreibung wie "Wenn CE für 8 Takte 1 war dann schalte
den Ausgang auf 1". genügt keinesfalls dem synthesetool um daraus einen
Zähler zu bauen. Da musst du schon die komplette Struktur vorgeben
(Kodierung der Zustandsvariable, Abfolge, etc). Erst wenn alles
eindeutig ist, bekommst eine BinärUp oder binärDown, oder Gray, oder
OneHot SR, oder LFSR mit komperator, oder, oder oder.
MfG,