zwei zahlen subtrahieren (betrag)

#388646
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
Gast #388647
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
Gast #388649
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.
#388650
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
Gast #388651
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.
#388652
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
Gast #388654
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren