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


von A380 A. (a380)


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

von Fredy (Gast)


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

von Günter -. (guenter)


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

von fredy (Gast)


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

von Falk B. (falk)


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

von Günter -. (guenter)


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!

von A380 A. (a380)


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.

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von Günter -. (guenter)


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/browse_frm/thread/8a83e6fe293e9ac7/389c3d6893e9dc7e#389c3d6893e9dc7e

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.