Forum: FPGA, VHDL & Co. zwei zahlen subtrahieren (betrag)


von Ssss S. (sssssss)


Lesenswert?

Hi!

Nur ne ganz kurze Frage. Ich habe zwei 5bit std_logic_vector zahlen.
Ich möchte nun von der größeren die kleinere abziehen bzw

result = abs( x - y);

berechnen.

momentan mache ich es so:
1
if (x > y) then
2
  result <= x - y;
3
else
4
  result <= y - x;
5
endif;

Da wird vom vhdl compiler ja der result = ... - ... Teil quasi doppelt
angelegt.

Gibt es einen weg das ganze zu optimieren ?
Das ganze soll auf nem Spartan3 FPGA laufen und ich brauche sehr viele

dieser Berechnungen (teils ineinander geschachtelt).

Bye, Simon

von Sebastian (Gast)


Lesenswert?

Hi,

so als Idee. Teste, nach Subtrahktion, das msb (Vorzeichen) auf 1
(negativ). Wenn negativ dann führe ein Zweierkomplent aus. Ansonsten
mache nichts.

Zweierkomplent:
Gegeben: d-52 == 1.1001100 (negativ.52)
Lösung:            0110011
                        +1
Ist gleich:        0110100 (= d52)

Geht bestimmt schneller.

Gruß Sebastian

von Sebastian (Gast)


Lesenswert?

Zweierkomplement.

Ich sollte ins Bett gehen.

von Xenu (Gast)


Lesenswert?

>Da wird vom vhdl compiler ja der result = ... - ... Teil quasi >doppelt
angelegt.

Hast Du mal nachgeschaut?

Bei mir kommt folgende Meldung:

    Summary:
  inferred   1 Adder/Subtractor(s).
  inferred   1 Comparator(s).


Bei Sebastians Lösung braucht man zwar keinen Komparator, dafür aber
zwei Addierer.

von Ssss S. (sssssss)


Lesenswert?

Oha da hab ich den compiler aber unterschätzt :o

Hatte es nicht einzeln ausprobiert, bei meinem großes Projekt lässt
sich
das ganze nämlich nicht als RTL View anzeigen (rendert ewig rum, nach
1h hab ich abgebrochen g).
Damit hat sich dann meine Optimierungsidee erledigt g
Danke !!

Bye, Simon

von Xenu (Gast)


Lesenswert?

>das ganze nämlich nicht als RTL View anzeigen

Brauchst Du gar nicht. Auch nicht in größeren Projekten. Im
Synthesizer-Bericht steht normalerweise alles drin:


 Synthesizing Unit <bla>.
 .....
 Found 5-bit subtractor for signal <result>.
 Found 5-bit comparator greater for signal <$n0003> created
 at line 30.

von Ssss S. (sssssss)


Lesenswert?

Leider ist das ganze derart komplex dass man da im Bericht nicht mehr
durchblickt.
Der Vergleicher Teil belegt ~30% eines 400k Spartan3 ;)
Und da das mit procedure bzw function macros gebaut wird machen die
signalnamen auch nicht wirklich sinn ;)

Aber da der vhdl Compiler wirklich wieder einmal viel schlauer ist als
ich dachte brauch ich da ja eh nicht weiter optimieren :)
Ist immer wieder erstaunlich wie gut der opimiert...

Bye, Simon

von Sebastian (Gast)


Lesenswert?

Also ich sehe nur einen Addierer.

von Xenu (Gast)


Lesenswert?

>Also ich sehe nur einen Addierer.

Ich nehme an Du beziehst Dich auf Deinen Vorschlag und meinen Kommentar
dazu.

Für die Subtraktion brauchst Du einen Addierer/Subtrahierer und für das
Zweierkomplement brauchst Du nochmal einen. Korrigiere mich falls ich
falsch liege.

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.