Forum: FPGA, VHDL & Co. Dividieren möglich?


von Chris R. (mrgreen)


Lesenswert?

Hi,
ich will eine Zahl durch 1000, 100 und 10 teilen und auch den Rest 
ausrechnen.

1. Kann ich einfach so dividieren: A<= B/C?
Auch für die Synthese?

Mich interessiert nur der ganzzahlige Wert der Division, der Bruchteil 
ist egal.
Kann ich auch die modulo.Operation nutzen und synthetisieren?


Wenn ich jetzt einfach X/1000 rechne, dann kommt ja ein Ganzzahlwert 
heraus (in der simulation jedenfalls). Das klappt soweit, bis auf die 
Warnung

# ** Warning: NUMERIC_STD.TO_INTEGER: metavalue detected, returning 0

und wenn ich dann einen Teil des Resultat-VEktors weiternutzen will (die 
unteren 4 Bit), dann sind die alle 0...?

Hintergrung: ich will die Stellen einer Zahl auslesen, also aus 1234 => 
1 2 3 und 4 herausholen.

von Coolman (Gast)


Lesenswert?

Liegt die Zahl denn in Binär vor oder Decimal ?
Wenn Binär, musst du so teilen, wie angegeben.
Multiplier werden bei der Syn automatisch inferiert.

von Chris R. (mrgreen)


Lesenswert?

Die Zahl ist ein signed und soll durch 1000 geteilt werden. Kann das 
klappen?
Es kommt zwar nach der Div das richtige raus, nach einer Zuweisung auf 
ein andres signal ist dieses aber 00000...

von Detlev T. (Gast)


Lesenswert?

Du schreibst nicht, auf welchem Prozessor du das einsetzen willst. 
Unterstützt die Hardware überhaupt die Division? Wenn diese durch 
Software ausgeführt wird, ist so eine Methode vielleicht effektiver:
1
  while(wert >= 1000) {wert -= 1000; stelle[0]++;}
2
  while(wert >=  100) {wert -=  100; stelle[1]++;}
3
  while(wert >=   10) {wert -=   10; stelle[2]++;}
4
  stelle[3] = wert;
Nur mal so als Anregung.

von Chris R. (mrgreen)


Lesenswert?

Das soll auf dem Cyclone II passieren, der müsste Dividierer mitbringen, 
oder?

von Mike (Gast)


Lesenswert?

FPGA mit Hardware-Divider? Ehrlich gesagt habe ich noch nie davon 
gehört.

> Das soll auf dem Cyclone II passieren, der müsste Dividierer mitbringen,
> oder?

Das "Cyclone II Device Handbook" erwähnt das Wort "Divider" nur im 
Zusammenhang mit der Takterzeugung (PLL). Vermutlich nicht ganz das was 
du suchst...

Wie hast du simuliert? Auf VHDL-Basis oder das was aus der Synthese 
herauskommt? Nicht alles was im VHDL-Simulator geht funktioniert auch 
nach der Synthese.

Du könntest dich auch nach Algorithmen umschauen die ohne Division 
auskommen. Ein Anfang wäre schonmal die Division in eine Multiplikation 
umzuwandeln.

von glücklicher (Gast)


Lesenswert?

Ich arbeite seit einigen Jahren mit Cyclone II FPGAs. Die 
Grundrechenarten sind problemlos möglich, d.h. Zuweisungen der Art "a <= 
b /c + d * e - f;" sind machbar. Dabei ist natürlich auf die Datentypen 
und deren Bitbreite zu achten.

von Mike (Gast)


Lesenswert?

Quartus bastelt sich den Divider aus normalen Logikblöcken zusammen. 
Aus:

d <= a * b / c;

werden so >1200 LE und 6 9-Bit Multiplier (für ein 16 Bit Ergebnis). 
Kann man machen wenn die Resourcen vorhanden sind. Allerdings beträgt 
die maximale Taktfrequenz 5.56 MHz...

von Thomas H. (mac4ever)


Lesenswert?

Ersetz die Division durch eine Multiplikation mit dem Reziprokwert. 
Dadurch erhältst Du ein paar Nachkommastellen die deinen Rest 
repräsentieren. Da sollte der Takt auch deutlich drüber liegen. Hab das 
auf einem VirtexII Pro so gemacht und es waren  knapp über 120 Mhz 
möglich.

von wasi (Gast)


Lesenswert?

Hallo Chris R.,

für die Binär zu BCD Umwandlung hatte ich vor einiger Zeit
hier im Forum einen kleinen Beitrag geschrieben.Suche nach dem
Beitrag "Dezimalzahl auf 7 Segment Anzeige".
Der Algorithmus benötigt nur shift und add.Ich hatte ihn mal
für ein kleines Xilinx CPLD implementiert.
Vielleicht hilft dir das weiter!?

Gruss,
wasi.

von der mechatroniker (Gast)


Lesenswert?

Bevor ich und andere sich den Kopf weitere zerbrechen:

In wievielen Taktzyklen muß das Ergebnis da sein?

Wenn die Dezimalzahl nur zur Anzeige benötigt wird, so hat man ja i.d.R. 
200-300 msec, also ne Ewigkeit, bis es zu einer für den Benutzer 
merklichen Verzögerung kommt.

von der mechatroniker (Gast)


Lesenswert?

@wasi: Dein Beitrag würde mich auch mal interessieren. Sicher daß der 
Thread hier im Forum noch existiert und so heißt? Ich find den nämlich 
nicht.

von Kai G. (runtimeterror)


Lesenswert?

Guckst du hier: Beitrag "Dezimalzahl auf 7 Segment Aneige"

Eigentlich muss er ja noch nicht mal durch 100, 1000, etc dividieren. 
Wenn nicht unbedingt alles parallel laufen muss, kann auch einfach 
sukzessive durch 10 dividiert werden.

Gruß

Kai

von der mechatroniker (Gast)


Lesenswert?

Hm. Den Thread hatte ich schon gefunden, aber irgendwie wasis Beitrag 
übersehen.

Mir ist noch nicht ganz klar, warum das funktioniert, aber schaut genial 
aus. Wenn ich mich nicht irre, ist der Ansatz anscheinend folgender: 
statt sukzessiver Division im Ursprungs-Zahlensystem (binär) geht 
natürlich auch sukzessive Multiplikation im Zielsystem (BCD). Da nur 0 
oder 1 addiert werden kann, läßt sich das anscheinend irgendwie in das 
Reinschieben eines Bits umformulieren. Nur wie multipliziert man eine 
BCD-Zahl mit 2?

Ich muß nochmal drüber nachdenken.

von wasi (Gast)


Lesenswert?

Hallo ,

ich bin kein Zahlentheoretiker und habe den Algorithmus auch nicht
erfunden,habe ihn in der im posting angegebenen Literatur gefunden!

"mechatroniker" hat aber Recht! Man Rechnet "anders" herum!
Wenn man die Binärzahl nach dem Horner Schema entwickelt und von
innen nach aussen Rechnet dann kommt dieses Berechnungsschema
zustande.Nun bleibt die Frage nach der Multiplikation einer BCD
Zahl mit 2:Man multipliziert halt binär und korrigiert dann das
Ergebniss,falls es > 9 ist.(Dann muss man 6 dazuaddieren und das
halfcarry propagieren.)
Und damit man die halfcarrys nicht
durchreichen muss prüft man vor der Multiplikation mit 2,ob das
Ergebniss > 4 sein wird,weil dann das Resultat > 9 wäre und addiert
+3 um es zu korrigieren.

Ich weiss,etwas wirr,man muss sich es mit Bleistift und Papier
mal durchrechnen.

Gruss,
wasi.

von der mechatroniker (Gast)


Angehängte Dateien:

Lesenswert?

> Und damit man die halfcarrys nicht
> durchreichen muss prüft man vor der Multiplikation mit 2, ob das
> Ergebniss > 4 sein wird,weil dann das Resultat > 9 wäre und addiert
> +3 um es zu korrigieren.

Habe mich dunkel an die 6 erinnert, die man bei der BCD-Arithmetik im 
Falle eines Übertrags addieren muß, und mir dann gestern vor dem 
Einschlafen noch genau das zusammengereimt.

Ich hab es mal zum Anlaß genommen, mich an einer Implementierung zu 
versuchen (etwas Übung in VHDL kann nicht schaden).

Herausgekommen ist ein "intelligentes" Schieberegister (also ohne den 
Teil, der rausschiebt). Funktioniert in der Simulation ganz gut, braucht 
einen Takt pro Binärstelle, enthält 4 Flipflops pro Ziffer und ein paar 
with-selects, sollte also ordentlich synthetisieren (für CPLD?), was ich 
noch nicht ausprobiert habe.

Mag vielleicht einer der Profis mal drüberschauen? ;-)

Gruß
Sebastian

von der mechatroniker (Gast)


Angehängte Dateien:

Lesenswert?

Ach so, hier die fehlende Entity

von der mechatroniker (Gast)


Angehängte Dateien:

Lesenswert?

Und weil mir sonst nachher niemand glaubt, daß das funktioniert, hier 
eine Testbench.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Von Xilinx gibts die Appnote XAPP029, da wird dieser serielle 
Algorithmus für CPLDs beschrieben, in beide Richtungen Bin-zu-BCD und 
zurück.
http://www.xilinx.com/support/documentation/application_notes/xapp029.pdf

In Atmel AVR204 wird zwar ein Flußdiagramm beschrieben, aber keine 
Erklärung geliefert:
http://www.atmel.com/dyn/resources/prod_documents/doc0938.pdf

Ich habe hier im Tutorial unter AVR-Arithmetik etwas geschrieben. Wer 
hat noch interessante Links oder weitere Beiträge? Ein Kapitel über 
BCD-zu-Binär fehlt noch:
http://www.mikrocontroller.net/articles/AVR_Arithmetik#Binär_zu_BCD_-_Umwandlung

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Auch bei Opencores gibt es synthetisierbare Dividierer.

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.