Forum: FPGA, VHDL & Co. Logikverbrauch Vergleichsoperatoren


von Magneto F. (fpga_stud)


Lesenswert?

Hallo zusammen,

ich versuche meinen Code zu optimieren und bin von einem Kollegen auf 
die Vergleichsoperanden angesprochen worden. Ist es so, dass ein >=, > 
oder == unterschiedlich viele Logikzellen benötigt?

Ich arbeite mit einem Cyclone IV.

Beste Grüsse

von Frank (Gast)


Lesenswert?

Ein Vergleich auf 0 wird wahrscheinlich weniger Zellen benötigen, als 
auf 2175.

von Vancouver (Gast)


Lesenswert?

> ich versuche meinen Code zu optimieren

Bezüglich was? Fläche? Zeit? Durchsatz?

> die Vergleichsoperanden angesprochen worden.

Operatoren.

> Ist es so, dass ein >=, >
> oder == unterschiedlich viele Logikzellen benötigt?

Nein, jedenfalls nicht wesentlich. Alle drei Operatoren funktionierem 
nahezu identisch. Es gibt in den Logikzellen spezielle Carry Chains, die 
bei allen Vergleichsoperatoren benutzt werden, das ist sehr effizient 
und kaum zu verbessern. Entscheidend ist die Länge der Operanden (jetzt 
stimmt es).
Sagen wir so: Du kannst vielleicht mit viel Trickserei die Vergleicher 
noch minimal optimieren, aber wenn Du nicht schon auf dem letzten 
Logikblock pfeifst, bringt das nichts.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Mmmh, während wir hier auf Lothar warten, könntest Du einfach mal 
ausprobieren, ob das auf Deiner vorliegenden Hardware unterschiedlichen 
Aufwand erzeugt.

Wie bereits angemerkt:
- Real Estate Usage
- Delay Time

Und die Ergebnisse hier posten.

von Bitwurschtler (Gast)


Lesenswert?

Magneto F. schrieb:
> ich versuche meinen Code zu optimieren und bin von einem Kollegen auf
> die Vergleichsoperanden angesprochen worden. Ist es so, dass ein >=, >
> oder == unterschiedlich viele Logikzellen benötigt?

Kommt darauf an, wie es gemappt wird.

wenn es in Gatter-logic umgesetzt wird also in LUT's wird es 
Unterschiede geben.
== ist einfach als AND auf Konstante realisierbar, größer als nicht.

Wird als als Subtraktion mit Auswertung des Vorzeichen realisiert sollte 
es humpe sein.


Man kann noch mehr optimieren wenn ein Operand ein Counter ist, dann 
genügt eine "==" LUT mit SR-FF.

von Bitwurschtler (Gast)


Lesenswert?

Marcus H. schrieb:
> Mmmh, während wir hier auf Lothar warten, könntest Du einfach mal
> ausprobieren, ob das auf Deiner vorliegenden Hardware unterschiedlichen
> Aufwand erzeugt.

Dann sollte aber auch die Options während der Synthese optimal stehen, 
die entscheiden wie der High-Level Code in der Hardware umgesetzt 
(architecture mapping) wird. Beispiel:
https://forums.xilinx.com/t5/Synthesis/logic-as-carry-chain/td-p/258260

Insofern ist der Ansatz

> ich versuche meinen Code zu optimieren

falsch.
Optimieren heisst hier nicht Code umzuschreiben, sondern im 
Synhtesescript resp makefile die richtigen Optionen zu setzen.

Aber das ist bei dem One-Button-Click-Compile DAU-Ansatz, den die 
Klickikacki-FPGA-Tools heutzutrage fahren, kaum noch machbar.

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


Lesenswert?

Marcus H. schrieb:
> Mmmh, während wir hier auf Lothar warten...
;-)

Magneto F. schrieb:
> Ist es so, dass ein >=, > oder == unterschiedlich viele Logikzellen
> benötigt?
Wie gesagt: probiers aus. Die Toolchains entwickeln sich weiter und 
unterschiedliche Hersteller verfolgen aufgrund unterschiedlicher 
Hardware jeweils eigene Strategien.
Der Witz ist: es gibt durchaus Unterschiede beim Vergleich gegen einen 
festen Wert. Beim Vergleich zweier variabler Werte kann nichts 
optimiert werden, der Vergleicher muss alle Möglichkeiten 
berücksichtigen.

Frank schrieb:
> Ein Vergleich auf 0 wird wahrscheinlich weniger Zellen benötigen, als
> auf 2175.
Die schlechteste Idee ist es aber idR. einen Zähler mit dem "oberen" 
Zählerwert zu laden und dann "auf 0" zu vergleichen. Denn dabei kann im 
Mittel gar nichts optimiert werden und zudem muss dann der Zähler 
umständlich mit dem passenden Bitmuster aus 0 und 1 geladen werden, 
statt dass einfach kurz an der Resetleitung aller Flipflops gezupft 
wird. Aber auch das kann man leicht mal mit einigen exemplarischen und 
beliebten Werten (2er und 10er Reihe jeweils -1 ) ausprobiert werden. 
Man lernt was dabei...

Magneto F. schrieb:
> ich versuche meinen Code zu optimieren und bin von einem Kollegen auf
> die Vergleichsoperanden angesprochen worden. Ist es so, dass ein >=, >
> oder == unterschiedlich viele Logikzellen benötigt?
Ich habe da noch den alten 
Beitrag "Re: Max(a,b) möglichst effizient" gefunden. Und da 
müsste nocht einer sein, wo gegen feste Werte verglichen wird...

Ach ja, zum Thema "was kleine Änderungen bewirken" noch das dort (im 
letzten Abschnitt):
http://www.lothar-miller.de/s9y/archives/52-Kompakte-Flankenerkennung.html
Obwohl lediglich der Quelltext anders formatiert ist, kommt die Synthese 
auf ein anderes Ergebnis.

EDIT: ich habe den Beitrag "VHDL und die Operatoren <, >, <=, >=" doch 
noch gefunden. Und den 
Beitrag "Re: VHDL-Anfänger verzweifelt an einfachem LED-Zähler" auch noch. Und dann 
noch den Beitrag "Ratschlag / Verbesserung zu vhdl-Progrämmchen"

: Bearbeitet durch Moderator
von C.G. (Gast)


Lesenswert?

Lothar M. schrieb:
> Frank schrieb:
>> Ein Vergleich auf 0 wird wahrscheinlich weniger Zellen benötigen, als
>> auf 2175.
> Die schlechteste Idee ist es aber idR. einen Zähler mit dem "oberen"
> Zählerwert zu laden und dann "auf 0" zu vergleichen. Denn dabei kann im
> Mittel gar nichts optimiert werden und zudem muss dann der Zähler
> umständlich mit dem passenden Bitmuster aus 0 und 1 geladen werden,
> statt dass einfach kurz an der Resetleitung aller Flipflops gezupft
> wird. Aber auch das kann man leicht mal mit einigen exemplarischen und
> beliebten Werten (2er und 10er Reihe jeweils -1 ) ausprobiert werden.
> Man lernt was dabei...

bin ein blutiger Anfänger, aber durfte letztens feststellen das es 
durchaus, wenigstens bei dem aktuellen Quartus lite, einen Unterschied 
macht ob man bei dem folgenden die Operation (i > 0) oder (i /= 0) 
benutzt.
1
i <= 3;
2
...
3
if i > 0 then     -- oder if i /= 0 then
4
    i <= i - 1;
5
...
6
else
7
   state <= other_state;
8
end if;

(i > 0) brauchte doppelt soviele LE's und war ca 10 MHz langsamer, war 
ich doch ein wenig erstaunt...

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


Lesenswert?

C.G. schrieb:
> (i > 0) brauchte doppelt soviele LE's und war ca 10 MHz langsamer,
Warum? Was sagt die RTL-Schematic zu diesem Design?
Liegt es tatsächlich nur an diesem Vergleich oder auch am "drumrum"?
Hast du das mal mit einem "Dreizeiler" analysiert?

> war ich doch ein wenig erstaunt...
Hast du das noch ein wenig weiter untersucht? Eine schöne Gelegenheit, 
seine Toolchain mal näher kennenzulernen.

> durfte letztens feststellen das es durchaus, wenigstens bei dem
> aktuellen Quartus lite, einen Unterschied macht ob man bei dem folgenden
> die Operation (i > 0) oder (i /= 0) benutzt.
Dieser Ansatz mit dem rückwärts laufenden Zähler ist tendenziell eher 
schlecht, weil schlecht optimierbar. Bei diesen kurzen Wortlängen kann 
es sein, dass die Carry-Chain, die zum Ermitteln der 0 verwendet wird, 
tatsächlich schneller als eine LUT ist.
Brauchst du das i in der FSM? Falls nicht: probiers mal mit einem 
Aufwärts-Zähler...

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