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
Ein Vergleich auf 0 wird wahrscheinlich weniger Zellen benötigen, als auf 2175.
> 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.
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.
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.
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.
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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.