www.mikrocontroller.net

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


Autor: Janusz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sonnenschein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Moeglichst perfomant

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

Autor: VHDL-Schnösel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: VHDL-Schnösel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun ja, eher eine Geschmackssache, lieber Lothar. :-)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: VHDL-Schnösel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Verilog-Schüler (Gast)
Datum:

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

Autor: Janusz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: TobiFlex (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.