Forum: FPGA, VHDL & Co. Vivado, Rechnen mit Klammern und Punkt vor Strich


von Wolfgang (Gast)


Lesenswert?

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?
1
signal wert1 : integer RANGE -200000 to 200000 := 0;
2
signal wert2 : integer RANGE -200000 to 200000 := 0;
3
signal wert3 : integer RANGE -200000 to 200000 := 0;
4
signal wert4 : integer RANGE -200000 to 200000 := 0;
5
signal wert5 : integer RANGE -200000 to 200000 := 0;
6
signal wert6 : integer RANGE -200000 to 200000 := 0;
7
8
wert1 <= 92;
9
wert2 <= 34;
10
wert3 <= 53;
11
wert4 <= 68;
12
wert5 <= 36;
13
wert6 <= 0;
14
15
wert6 <= (wert1 * wert2 - wert3) / (wert4 - wert5);
Schöe Grüße
Wolfgang

: Bearbeitet durch Moderator
von Dussel (Gast)


Lesenswert?

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. ;-)

von Felix U. (ubfx)


Lesenswert?

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.

: Bearbeitet durch User
von Markus F. (mfro)


Lesenswert?

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.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

Vielen Dank euch

Schöne Grüße
Wolfgang

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


Lesenswert?

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... ;-)

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

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.
1
wert6 <= (wert1 * wert2 - wert3) / (wert4 - wert5);

In dem Fall wird man das wohl wirklich mit Shift Operationen beschreiben 
muessen ala (ungetestet):
1
function div_shift(a, b : integer) return integer is
2
  variable b_vec : unsigned(31 downto 0) := to_unsigned(b, 32);
3
begin
4
5
  for i in b_vec'range loop
6
    if b_vec(i) = '1' then
7
      return a / 2**i;  -- das klappt in der Regel ganz ordentlich und spart Schreibarbeit ;-)
8
    end if;
9
  end loop;
10
11
  return a;
12
13
end function;
14
15
wert6 <= div_shift(wert1 * wert2 - wert3, wert4 - wert5);

Ich kann mir sonst bei bestem Willen nicht vorstellen, dass die Synthese 
das rafft. :-/

von Markus F. (mfro)


Lesenswert?

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.

: Bearbeitet durch User
von Mampf F. (mampf) Benutzerseite


Lesenswert?

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^^

von Markus F. (mfro)


Lesenswert?

Mampf F. schrieb:
> je nach alte oder neue Rechenregeln

Huh? Wann haben sich Rechenregeln geändert?

von Dussel (Gast)


Lesenswert?

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.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

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.

von Markus F. (mfro)


Lesenswert?

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.

von Dussel (Gast)


Lesenswert?

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.

von Dussel (Gast)


Lesenswert?

Bei der Suche habe ich noch das gefunden: 
https://www.epochtimes.de/panorama/diy/knifflige-mathe-bruchrechnung-verbluefft-das-internet-koennen-sie-den-term-korrekt-loesen-a3222527.html
Das scheint mir aber diskussionswürdig zu sein.
"Abgesehen davon ist „÷“ kein gültiger Rechenoperator"
Warum soll ÷ kein gültiger Rechenoperator sein? Wikipedia zumindest gibt 
es als ein mögliches Divisionssymbol an.

von Dussel (Gast)


Lesenswert?

Und nochwas zum Problem: 
https://www.digitec.ch/de/page/wenn-sich-das-internet-wegen-mathe-streitet-und-sich-taschenrechner-uneinig-sind-12051
Da geht es darum, ob ab stärker 'klammert' als a*b (* als 
Multiplikationszeichen)

von Gustl B. (-gb-)


Lesenswert?

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.pdf

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.

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.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

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.

von Markus F. (mfro)


Lesenswert?

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.

von Jim (Gast)


Lesenswert?

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?

von Gustl B. (-gb-)


Lesenswert?

Exakt. Ich kann also nix gescheit.

von Dussel (Gast)


Lesenswert?

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.

von Gustl B. (-gb-)


Lesenswert?

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.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

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? ;-)

von Jim (Gast)


Lesenswert?

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.

von Gustl B. (gustl_b)


Lesenswert?

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.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

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.

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

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.

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

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.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

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.

: Bearbeitet durch User
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.