www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Bits zählen mit Verilog


Autor: A380 A380 (a380)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich suche einen möglichst effizienten Code der aus einem Bitvektor die 
Anzahl der Einsen bestimmt.
Also 10101011100 = 6 Einsen
Die Größe des Bitvektors kann dabei (vor der Synthese) eingestellt 
werden, der Code sollte daher allgemein sein (for-Schleife o.ä).

Autor: Fredy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Du brauchst nur:
ein register mit einer bestimmten Länge
eine Variable mit Null initialisiert(counter)
eine For-Schleife
das wars!

dein Register wird mit der for-Schleife untersucht, fallst es 1 gefunden 
wird , wird dein counter incrementiert.
das ist voll einfach
Good luck
fredy

Autor: Günter -.. (guenter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fredy wrote:
> Hi!
> Du brauchst nur:
[...]
> eine For-Schleife
[...]
> dein Register wird mit der for-Schleife untersucht, fallst es 1 gefunden
[...]

Was macht denn die Synthese aus der for-Schleife in diesem Fall? Wird 
die nicht in parallele Logik umgewandelt?

Währe es da nicht sinnvoller das Register zu shiften und dann immer das 
lsb zu testen?

Gruß,

Günter

Autor: fredy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Günter
Was redest du da?
Ist das für dich eine Aufgabe, die eine Diskussion braucht?
wer hat das Wort "shiften" verwendet?
weiss du was eine For-Schleife leistet überhaupt?
Wenn du mit eine For-Schleife nicht zufreiden bist, von mir aus kannst 
du eine zweite Zähler werwenden.
Gruß
fredy

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Günter .. (guenter)

>Was macht denn die Synthese aus der for-Schleife in diesem Fall? Wird
>die nicht in parallele Logik umgewandelt?

Ja.

>Währe es da nicht sinnvoller das Register zu shiften und dann immer das
>lsb zu testen?

Geht auch, nur braucht das bei N Bits N Takte. Ist aber wahrscheinlich 
resourcenschonender bei sehr vielen Bits.

MFG
Falk

Autor: Günter -.. (guenter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fredy wrote:
> @ Günter
[...]
> Ist das für dich eine Aufgabe, die eine Diskussion braucht?

Nein, ich habe nach einer Klarstellung gesucht, ob ich das Ergebnis der 
Synthese von deinem Vorschlag verstanden haben. Das hat Falk jetzt 
freundlicherweise getan.

> wer hat das Wort "shiften" verwendet?

Das habe ich als eine Alternative vorgeschlagen und mich hat 
interessiert ob das auch ein gangbare Lösung ist. Erneut hat Falk hier 
die Unterschiede zwischen deinem und meinem Vorschlag aufgezeigt, was 
für mich sehr lehrreich war.
[...]


@ Falk

Danke für die Klarstellung!

Autor: A380 A380 (a380)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also eine for-Schleife baut bei mir eine Reihe aus Addierern und 
Multiplexern, immer abwechselnd. D.h. je Stelle addiert er eins auf das 
vorherige Ergebnis und per Mux wählt er aus ob er das um eins erhöhte 
weiterleitet oder nicht. Das ist vor allem bei einem großen Bitvektor 
sehr langsam bzw reduziert die maximale Frequenz deutlich.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Also eine for-Schleife baut bei mir eine Reihe aus Addierern und
> Multiplexern, immer abwechselnd.

Das ist allerdings schwach, ich hätte erwartet dass das doch ein 
bisschen schlauer implementiert wird.

Hier wurde ausführlich über das Bit-Zählen diskutiert:

Beitrag "einsen im Vektor zählen"
Beitrag "Weils so schön war : Einsen Zählen II"

Musst du nur noch in Verilog umsetzen.

Autor: Günter -.. (guenter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A380 A380 wrote:
> Also eine for-Schleife baut bei mir eine Reihe aus Addierern und
> Multiplexern, immer abwechselnd. D.h. je Stelle addiert er eins auf das
> vorherige Ergebnis und per Mux wählt er aus ob er das um eins erhöhte
> weiterleitet oder nicht. Das ist vor allem bei einem großen Bitvektor
> sehr langsam bzw reduziert die maximale Frequenz deutlich.

Auf comp.arch.fpga war gerade so eine Diskussion. Vielleicht hilft das:

http://groups.google.com/group/comp.arch.fpga/brow...

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.