Hallo,
ich bin noch recht neu im FPGA und VHDL.
Ich habe eine Frage zu Rechenoperatioen.
Funktioniert folgendes Konstrukt eigentlich immer in VHDL ?
Die Entity und Architecture habe ich jetzt mal weggelassen und ich setze
voraus, dass der Teiler nach dem Subtrahieren eine Zweierpotenz ist.
Mir geht es hauptsächlich um die Klammern und Punkt vor Strich.
Können das Tools wie Vivado zuverlässig oder muss man das ganze auf
mehrere Schritte verteilen?
Ohne es jetzt ausprobiert zu haben, bin ich doch ziemlich sicher, dass
das problemlos geht. Sowas ist ja relativ häufig und wenn es nicht
ginge, wäre mir das wahrscheinlich schonmal aufgefallen.
Man kann es aber auch einfach ausprobieren. ;-)
Wolfgang schrieb:> Können das Tools wie Vivado zuverlässig oder muss man das ganze auf> mehrere Schritte verteilen?
Zuverlässig synthetisieren? Ziemlich sicher nicht sofern es nicht alles
Konstanten sind.
Felix U. schrieb:> Zuverlässig synthetisieren? Ziemlich sicher nicht sofern es nicht alles> Konstanten sind.
Natürlich können das die Tools vernünftig synthetisieren, warum denn
auch nicht?
Es kann natürlich sein, dass das Ergebnis die Erwartungen an das Timing
nicht erfüllt, aber der TO hat ja keine genannt.
So wird's halt fertig, wenn's fertig wird.
VHDL Operatoren haben das gleiche Vorrang Konzept wie in allen anderen
Sprachen auch. Die Rangfolge ist (je weiter oben in der Liste, desto
hoeher der Rang:
1
** exponentiation, numeric ** integer, result numeric
2
abs absolute value, abs numeric, result numeric
3
not complement, not logic or boolean, result same
4
5
* multiplication, numeric * numeric, result numeric
6
/ division, numeric / numeric, result numeric
7
mod modulo, integer mod integer, result integer
8
rem remainder, integer rem integer, result integer
9
10
+ unary plus, + numeric, result numeric
11
- unary minus, - numeric, result numeric
12
13
+ addition, numeric + numeric, result numeric
14
- subtraction, numeric - numeric, result numeric
15
& concatenation, array or element & array or element,
16
result array
17
18
sll shift left logical, logical array sll integer, result same
19
srl shift right logical, logical array srl integer, result same
20
sla shift left arithmetic, logical array sla integer, result same
21
sra shift right arithmetic, logical array sra integer, result same
22
rol rotate left, logical array rol integer, result same
23
ror rotate right, logical array ror integer, result same
24
25
= test for equality, result is boolean
26
/= test for inequality, result is boolean
27
< test for less than, result is boolean
28
<= test for less than or equal, result is boolean
29
> test for greater than, result is boolean
30
>= test for greater than or equal, result is boolean
31
32
and logical and, logical array or boolean, result is same
33
or logical or, logical array or boolean, result is same
34
nand logical complement of and, logical array or boolean, result is same
35
nor logical complement of or, logical array or boolean, result is same
36
xor logical exclusive or, logical array or boolean, result is same
37
xnor logical complement of exclusive or, logical array or boolean, result is same
Punkt vor Strich stellt also absolut kein Problem da.
Wolfgang schrieb:> Funktioniert folgendes Konstrukt eigentlich immer in VHDL ?
In VHDL schon. Wenn du das auf Hardware bringen willst, dann kommt es
darauf an, ob deine Toolchain eine kombinatorische Division
synthetisieren kann. Und wie schnell das dann wird, kommt darauf an, wie
gut sie es kann, wenn sie es kann... ;-)
Lothar M. schrieb:> Wenn du das auf Hardware bringen willst, dann kommt es> darauf an, ob deine Toolchain eine kombinatorische Division> synthetisieren kann. Und wie schnell das dann wird, kommt darauf an, wie> gut sie es kann, wenn sie es kann... ;-)
In seinem Fall geht er davon aus, dass der Teiler eine Zweierpotenz ist.
Huh?
Ich hab' das mal testhalber in Quartus genauso hingeschrieben, wie der
TO das oben hatte: wird klaglos übersetzt.
Schafft halt - wie erwartet - kaum 10 MHz (Cyclone III), aber die
Synthese ist kein Problem.
P.S.: im Übrigen dürfte obiger Code verkehrt sein. Die Quotienten sind
eine integer subrange, das Ergebnis muss also jedenfalls
vorzeichenkorrigiert werden.
Tobias B. schrieb:> * multiplication, numeric * numeric, result numeric> / division, numeric / numeric, result numeric
Das ist interessant ... Da gabs auf irgendeines social-Plattform zuletzt
eine Frage, was bei
> 8 / 2 * (2 + 2)
herauskommt.
Die Antwort ist: je nach alte oder neue Rechenregeln 1 oder 16.
VHDL funktioniert wohl noch nach den alten Regeln.
Besser also: Immer Klammern setzen^^
Markus F. schrieb:> Mampf F. schrieb:>> je nach alte oder neue Rechenregeln>> Huh? Wann haben sich Rechenregeln geändert?
Irgendwann kam mal die Idee auf, dass / für den Bruchstrich stünde und
deshalb alles dahinterstehende 'unter dem Bruchstrich' steht.
Allerdings habe ich keine Ahnung, wie man danach wieder über den
Bruchstrich kommen soll.
Dussel schrieb:> Irgendwann kam mal die Idee auf, dass / für den Bruchstrich stünde und> deshalb alles dahinterstehende 'unter dem Bruchstrich' steht.> Allerdings habe ich keine Ahnung, wie man danach wieder über den> Bruchstrich kommen soll.
Kannst du mir mal ein Beispiel nennen wo der / Operator so interpretiert
wird? Das kann ich mir bei bestem Willen nicht vorstellen.
Dussel schrieb:> Markus F. schrieb:>> Mampf F. schrieb:>>> je nach alte oder neue Rechenregeln>>>> Huh? Wann haben sich Rechenregeln geändert?> Irgendwann kam mal die Idee auf, dass / für den Bruchstrich stünde und> deshalb alles dahinterstehende 'unter dem Bruchstrich' steht.> Allerdings habe ich keine Ahnung, wie man danach wieder über den> Bruchstrich kommen soll.
Blödsinn, mit Verlaub. Mathematik ändert sich nicht, bloß weil
irgendeiner im Internet "auf eine Idee kommt".
8 / 2 * (2 + 2)
Klammern zuerst:
8 / 2 * 4
Dann sind nur noch gleichberechtigte Operatoren da, also strikt von
links nach rechts. Da gibt's nix dran rumzudeuteln.
16 kommt raus. Wer 1 rauskriegt hat keine "Idee", sondern ist
durchgefallen.
Tobias B. schrieb:> Kannst du mir mal ein Beispiel nennen wo der / Operator> so interpretiert wird? Das kann ich mir bei bestem Willen> nicht vorstellen.
Kann ich nicht. Das habe ich vor einigen Jahren mal im Internet gelesen
und fand es ziemlich blöd.
Die Argumentation war halt, dass bei 2/3+4 der Schrägstrich einen
Bruchstrich darstellt, damit 3+4 unter dem Bruchstrich steht und
entsprechend als 2/(3+4) berechnet werden müsse.
Dussel schrieb:> Irgendwann kam mal die Idee auf, dass / für den Bruchstrich stünde und> deshalb alles dahinterstehende 'unter dem Bruchstrich' steht.
Bitte was? Also ich habe jetzt erst recht frisch die Ausbildung zum
Mathelehrer in Bayern gemacht und da wird noch so gerechnet wie früher.
Mag an Bayern liegen, aber dass man da jetzt Klammern setzen müsste beim
Bruchstrich ist mir neu.
Aber:
In der deutschen Sprache ist das so wie du es beschreibst.
"Acht geteilt durch eins plus drei."
Tja, da fehlt die Klammersetzung in der Sprache. Hätte ich auch gerne.
Ja man kann Pausen machen oder eben "Klammer" sagen. Hier im Beispiel
wird aber oft angenommen (fälschlicherweise), dass da Klammern um 1+3
wären. Warum das so ist weiß ich auch nicht, für Schüler (und viele
Erwachsene) ist das nicht einfach von natürlicher Sprache in Mathematik
zu übersetzen.
Dussel schrieb:> "Abgesehen davon ist „÷“ kein gültiger Rechenoperator"
Ja, stimmt. Steht zumindest im bayrischen Lehrplan nicht im
Zeichenkatalog der gültigen mathematischen Symbole.
https://www.isb.bayern.de/download/9019/m_neu.pdfDussel schrieb:> Da geht es darum, ob ab stärker 'klammert' als a*b (* als> Multiplikationszeichen)
Bwahahaha. Aber da sind wir bei einem häufigen Problem: In der
Mathematik darf man das Malzeichen weglassen. Und das verwirrt.
ab ist ausgeschrieben also a⋅b. Nix Anderes.
Wo man jetzt drüber streiten könnte wäre z. B.
1 km^2. Was bedeutet das?
Ausgeschrieben sind das
1 ⋅1000⋅m^2
also
1000 m^2 und das ist natürlich falsch.
Ja, aber das ist doch ein Vorsatzzeichen, das gehört zur Einheit!!!!
Klar, stimmt, so wird argumentiert. Aber dann wird den Schülern
beigebracht, dass das Vorsatzzeichen exakt das gleiche ist wie eine
Zehnerpotenz. Und die ist mit einem ⋅ mit der Einheit verbunden.
Aus meiner Sicht müssten da entweder:
- Klammern drum, also 1 (km)^2 oder
- das Vorsatzzeichen gehört zur Zahl, also 1k m^2.
Klar weiß ich wie es gemeint ist und ich komme damit auch klar, aber es
ist etwas was aus meiner Sicht für unnötige Verwirrung sorgt weil es
eine Ausnahme ist die mit bekannten Regeln aus der Mathematik bricht.
Markus F. schrieb:> Dann sind nur noch gleichberechtigte Operatoren da, also strikt von> links nach rechts. Da gibt's nix dran rumzudeuteln.
Der VHDL-Simulator sieht es auch so - evaluiert von links nach rechts,
obwohl Multiplikation in der Liste über der Division steht.
Herausgekommen ist 16.
Mampf F. schrieb:> Herausgekommen ist 16.
apropos 16.
Wieder (wenigstens ein Stück) zurück zum Thema.
Wenn man der verwendeten LPM_DIVIDE Component 16 Pipeline-Stufen
zugesteht (dazu muss man die allerdings "von Hand" instanziieren, kann
also die Division nicht mehr direkt hinschreiben), kommt man bei der
Geschichte von oben auf ganz kommode 110 MHz.
Gustl B. schrieb:> Also ich habe jetzt erst recht frisch die Ausbildung zum> Mathelehrer in Bayern gemacht
Hast du nicht Physik studiert? Oder war das auf Lehramt?
Mampf F. schrieb:> Der VHDL-Simulator sieht es auch so - evaluiert von links nach rechts,> obwohl Multiplikation in der Liste über der Division steht.
Meinst du die Operatorenliste von weiter oben? Ich glaube, da geht es
nach Gruppen, getrennt durch eine Leerzeile. * und / stehen in der
gleichen Gruppe und sind daher gleichberechtigt. abs und ** haben eine
höhere Priorität, sind aber untereinander auch gleichwertig.
Gustl B. schrieb:> Mag an Bayern liegen, aber dass man da jetzt Klammern> setzen müsste beim Bruchstrich ist mir neu.
Wie meinst du das? Ich denke, wir sind uns einig, dass man bei
erst 3+4 rechnet und dann 2 durch 7 teilt. Irgendwo im Internet, das
kann ein Beitrag in einem Online-Käsblatt oder sogar ein Forum gewesen
sein, habe ich gelesen, dass sich obige Formel als 2/3+4 (ohne Klammern)
geschrieben werden könne, weil / für den Bruchstrich steht und alles,
was unter dem Bruchstrich steht, automatisch geklammert ist und das
ebenso gelte für alles, was hinter dem / steht.
Das nur dazu, wie jemand dazu kommen könnte, dass 8/2*(2+2)=1 sei.
Gustl B. schrieb:> Dussel schrieb:>> Da geht es darum, ob ab stärker 'klammert' als a*b (* als>> Multiplikationszeichen)>> Bwahahaha. Aber da sind wir bei einem häufigen Problem: In der> Mathematik darf man das Malzeichen weglassen. Und das verwirrt.>> ab ist ausgeschrieben also a⋅b. Nix Anderes.
Formal würde ich zustimmen. Ich habe aber das Gefühl, dass sprachlich
ohne 'mal' stärker geklammert wird. Wenn ich sage "a durch fünf mal b",
gleichmäßig ausgesprochen, wird das eher verstanden als (a/5)*b. "a
durch fünf b" wird meinem Gefühl nach eher so verstanden, dass 5b
gruppiert ist und a durch dieses zusammenhängende 5b geteilt wird, also
a/(5b).
Als Lehrer würde ich wohl am Anfang sagen, was richtig ist bzw. was ich
für richtig halte. Vielleicht sogar in der Klassenarbeit oder Klausur
auf dem Aufgabenblatt als Hinweis geben.
Dussel schrieb:> Ich denke, wir sind uns einig, dass man bei23+4> \frac{2}{3+4}> erst 3+4 rechnet und dann 2 durch 7 teilt.
Genau.
Dussel schrieb:> Irgendwo im Internet, das> kann ein Beitrag in einem Online-Käsblatt oder sogar ein Forum gewesen> sein, habe ich gelesen, dass sich obige Formel als 2/3+4 (ohne Klammern)> geschrieben werden könne, weil / für den Bruchstrich steht und alles,> was unter dem Bruchstrich steht, automatisch geklammert ist und das> ebenso gelte für alles, was hinter dem / steht.
Tja, das ist eigentlich ja auch richtig. Aber nur, wenn / nicht generell
für "geteilt" steht, sondern explizit für den Bruchstrich.
Und auch da bleibt unklar wie man das Ende des Bruchstrichs/Nenners
kennzeichnet.
Dussel schrieb:> "a> durch fünf b" wird meinem Gefühl nach eher so verstanden, dass 5b> gruppiert ist und a durch dieses zusammenhängende 5b geteilt wird, also> a/(5b).
Exakt. Und das hat auch einen Grund, den Alltag. Zahlen kommen eben sehr
oft nicht alleine vor sondern als Angabe einer Anzahl von etwas.
Dussel schrieb:> Als Lehrer würde ich wohl am Anfang sagen, was richtig ist bzw. was ich> für richtig halte.
Ja, und auch darauf hinweisen wo die Unterschiede zwischen
Alltagssprache und Mathematik sind.
Ich finde ja auch bei negativen Klammern wie -(3-4) könnte man ja mal
sagen, dass da eine 1 und ein Malpunkt weggelassen wurden. Bei -1⋅(3-4)
kann man das wunderschön ausmultiplizieren. -1⋅3-1⋅(-4). Aber
stattdessen wird den Schülern oft nur der Merksatz beigebracht, dass
sich die Vorzeichen umdrehen und die Klammer weglassen kann. Praktisch
ja, aber dann ist es eben nicht verstanden.
Gustl B. schrieb:> dass> sich die Vorzeichen umdrehen und die Klammer weglassen kann. Praktisch> ja, aber dann ist es eben nicht verstanden.
Ist doch eine effiziente Lösung - du leitest dir ja auch nicht ständig
das Ohmsche Gesetz her, sondern merkst es dir nur. Ob du es wirklich
verstanden hast? ;-)
Mampf F. schrieb:> du leitest dir ja auch nicht ständig> das Ohmsche Gesetz her, sondern merkst es dir nur
Das Ohm'sche Gesetz kann man nicht herleiten, denn es ist eine
Beobachtung.
Mampf F. schrieb:> Ist doch eine effiziente Lösung
Klar ist sie das. Trotzdem sollte die nicht vom Himmel fallen und
geglaubt sondern einmal hergeleitet und verstanden werden.
Jim schrieb:> Das Ohm'sche Gesetz kann man nicht herleiten, denn es ist eine> Beobachtung.
Aber selbstverstaendlich laesst sich das Ohmsche Gesetz herleiten, das
ist fester Bestandteil der klassischen Elektrodynamik.
Lediglich die Annahme das der Leitfaehigkeitstensor, in den gaengigen
Materialen die wir kennen und auf denen wir das Ohmsche Gesetz anwenden,
ein Skalar (in ausreichend guter Naeherung) ist, ist eine Beobachtung.
Tobias B. schrieb:> ein Skalar (in ausreichend guter Naeherung) ist, ist eine Beobachtung.
... und genau genommen ist es eine Festlegung und eine zudem die so gut
wie nie stimmt und das nicht nur deshalb weil Widerstände nicht
kontinuierlich sind sondern in Quanten springen. Für die Herleitung
braucht man nämlich auch noch eine Stromdichte und eine differentielle
Feldstärke und die drei bilden das Ohmsche Gesetz im kleinen und damit
doch wieder eine Beobachtung. :-)
Und integriert man die nun in eine tatsächliche 3D-Bauform, kommt
nirgendwann so etwas einfaches raus, wie das Ohmsche Gesetz, schon wegen
der Breite von Widerständen und engen Anschlussdrähten nicht.
Tobias B. schrieb:> wert6 <= div_shift(wert1 * wert2 - wert3, wert4 - wert5);>> Ich kann mir sonst bei bestem Willen nicht vorstellen, dass die Synthese> das rafft. :-/
Um solchen WirrWarr elegant zu umgehen, erlassen kluge Firmen Coding
Styles, die Vorgaben machen, wie man mit der Verwendung von
Zwischensignalen und Variablen klare und eindeutige Interpretationen
erzielt.
Jürgen S. schrieb:> ... und genau genommen ist es eine Festlegung und eine zudem die so gut> wie nie stimmt und das nicht nur deshalb weil Widerstände nicht> kontinuierlich sind sondern in Quanten springen.
Da mischelst du aber QED mit der klassischen Elektrondynamik.
Jürgen S. schrieb:> Für die Herleitung> braucht man nämlich auch noch eine Stromdichte und eine differentielle> Feldstärke und die drei bilden das Ohmsche Gesetz im kleinen und damit> doch wieder eine Beobachtung. :-)
Jep, alles Bestandteile der klassischen Elektrodynamik. Ob Festlegung
oder Beobachtung sit da zweitrangig. Fakt ist halt, dass sich Ohmsche
Leiter so Verhalten wie wir sie kennen, wenn der Leitfaehigkeitstenor in
ausreichend guter Naeherung ein Skalar ist. Auf mehr kommts da nicht an.
;-)
Wenn das naeher interessiert einfach mal im Jackson stoebern, das ist
die Standard Literatur zu dem Thema.