Forum: FPGA, VHDL & Co. Verilog erste "1" in reg rausfinden


von Janusz (Gast)


Lesenswert?

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

von Sonnenschein (Gast)


Lesenswert?

> Moeglichst perfomant

Das heisst so viel wie "möglichst gut"...

von VHDL-Schnösel (Gast)


Lesenswert?

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.

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


Lesenswert?

> würde ich es in VHDL über case machen.
Ich über eine while-Schleife   ;-)
Siehe http://www.lothar-miller.de/s9y/

von VHDL-Schnösel (Gast)


Lesenswert?

Nun ja, eher eine Geschmackssache, lieber Lothar. :-)

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


Lesenswert?

> 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.

von VHDL-Schnösel (Gast)


Lesenswert?

@ 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. :-)

von der mechatroniker (Gast)


Lesenswert?

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.

von Verilog-Schüler (Gast)


Lesenswert?

Ist in Verilog nicht anders. Aber der Thread-Opener hat ja noch nicht 
gesagt, was sein eigentliches Problem ist.

von Janusz (Gast)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

> 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?

von berndl (Gast)


Lesenswert?

>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...

von TobiFlex (Gast)


Angehängte Dateien:

Lesenswert?

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.

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


Lesenswert?

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"

von berndl (Gast)


Lesenswert?

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...

von Der Besucher (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.