Hallo, wie kann ich am besten der position den ersten bits der auf "1" gesetzt ist von einem reg rausholen. Moeglichst perfomant. Vielen Dank im Voraus Janusz
> Moeglichst perfomant
Das heisst so viel wie "möglichst gut"...
Das haben wir früher (TM) mit einem Prioritätsencoder ermittelt. Bitte nachdenken, wie ein solcher in Verilog aussehen könnte. Wenn die Breite nicht allzugroß ist, würde ich es in VHDL über case machen.
> würde ich es in VHDL über case machen. Ich über eine while-Schleife ;-) Siehe http://www.lothar-miller.de/s9y/
> Nun ja, eher eine Geschmackssache, lieber Lothar. :-) Hmmm... eher eine Performance-Sache, liebster VHDL-Schnösel ;-) Als Tipp: Sieh dir den Link an. Aber es geht darum, wie man das in Verilog beschreiben könnte... Da gibts doch auch sowas wie ein if.
@ Lothar Lob: sehr gute Seite! Da sind Erklärungen für Sachen, die in der einschlägigen Literatur (ich habe mir als Autodidakt bisher alle sinnvoll erscheinenden Bücher zugelegt) nicht findet. Die Bücher sind offenbar von irgendwelchen Profs geschrieben, die keinerlei Produktverantwortung übernehmen müssen. Das, was wirklich interesssant wäre. taucht dort nicht auf. Schluss mit der Lobhudelei - Performance: ich bin mir da nicht so sicher, letzlich hängt es ja davon ab, was das Synthesewerkzeug wirklich daraus macht. Letzlich wird man es wohl erst in der Simulation oder in der RTL sehen. Leider muss ich jetzt schindern, damit wieder Geld in die Kasse kommt. Ich werde aber nebenher das Problem zergrübeln. :-)
Ich kenne Verilog nicht, aber in VHDL wird aus einer Schleife bei der Synthese einfach n-fache Logik. Und die braucht dann "zur Laufzeit" genau einen Takt. Ich würds zumindest so machen.
Ist in Verilog nicht anders. Aber der Thread-Opener hat ja noch nicht gesagt, was sein eigentliches Problem ist.
Vielen Dank fuer die Antworten. Ich habe das Problem bereits geloest allerdings anders. Was ich eigentlich machen wollte war : Eine 64 bit addresse mit eine 64 bit maske maskieren und dann ermitteln wo die erste "1" sich befindet um zu wissen wie oft ich es shiften muss weil ich die 6 bits nach der erste "1" brauche.(Maske kann sich zur laufzeit aendern). Irgendwie glaube ich nicht dass es so einfach mit eine for schleife geht, wenn dann nur mit generate und dann kann es bis zu 64 takte dauern. Korrigiere mich bitte wenn ich mich irre. Ich kriege es in 5 takten hin wenn es in 1 gehen sollte wuerde ich mich sehr freuen wenn mir das jemand erklaert. Viele Gruesse Janusz
> dann ermitteln wo die erste "1" sich befindet um > zu wissen wie oft ich es shiften muss weil ich die 6 bits nach der erste > "1" brauche Warum shiftest du nicht einfach so lange, bis ne 1 im höchsten Bit steht? Da die Anzahl der shifts sowieso variabel ist, was bringt es die die Anzahl ein paar Takte im vorraus zu wissen?
>Ich kriege es in 5 takten hin wenn es in 1 gehen sollte wuerde ich mich >sehr freuen wenn mir das jemand erklaert. > >Viele Gruesse >Janusz Hi, mir faellt da spontan etwas ein, was ich vor >10 Jahren mal gemacht habe, wurde dann in einem full-custom Macro implementiert (weil deutlich schneller, damals ging's um 350MHz). Das ganze war da noch etwas komplizierter, weil es sich um einen Ring von Bits gehandelt hatte, sprich, der hoechstwertige ist 'beweglich' gewesen. Aber sei's drum: Du kannst mit Bit63='1' die Bits62..0 ausknippsen, Bit62='1' knippst die Bits 61..0 aus, und so weiter... Am Ende bleibt dir also genau 1 Bit auf '1'. Damit musst du dann ja auch noch etwas machen... Sind also ein paar Logikstufen (deshalb damals auch das full-custom Macro). Aber vlt. hilft dir der Ansatz...
Hier kommt mein Vorschlag in VHDL. Ist eine Abwandlung zur Registerermittlung des MOVEM-Befehls aus meinem 68000 Core. Verbraucht in einem Cyclone III 46 LC's und läßt sich mit 160MHz takten.
TobiFlex schrieb: > Hier kommt mein Vorschlag in VHDL. Das ist aber ein überraschend erfrischender getaktet kombinatorischer (Mixed-Style) Prozess :-o Ich habe den Takt mal rausgemacht (das ganze ist reine Kombinatorik) und das Ergebnis ist (für Xilinx) vom Ressourcenverbrauch recht ansehnlich: Number of Slices: 19 Number of 4 input LUTs: 35 Allerdings ist meine Lösung 4 (**) mit 18.82ns schneller als deine: Maximum combinational path delay: 21.586ns (**) Lösung 4 siehe Beitrag "Re: Verilog erste "1" in reg rausfinden"
naja, wenn ich jetzt meinen Vorschlag von oben mal ueberdenke, dann haette ich zwischen 2 Registern ein 63-Bit NOR mit einem 2-Bit AND, macht also vermutlich 4 LUTs in Reihe. Ohne jetzt ISE angeschmissen zu haben, das erscheint mir doch deutlich effektiver (obwohl es in VHDL eine Tipporgie ist...) Und 4 LUTs in Serie plus Wiring sollte deutlich unter 20ns rauskommen...
Also ich wähle die Beschreibung so aus, dass die letztendlich benötigte Fläche (Gatter plus Verdrahtung) minimal wird. (Was natürlich schwer zu beweisen ist...) Selbst wenn das Synthesewerkzeug dazu 100 mal länger braucht, bei sagen wir 5% Flächenersparnis, ist es das wert. Bei einem FPGA stellt sich doch eigentlich nur die Frage: Passt es noch rein oder nicht? Der Besucher
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.