Dividieren möglich?

OP #716996
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.
Gast #717022
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.
Gast #717112
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.
Gast #717148
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.
Gast #717224
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...
#717246
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.
Gast #717259
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.
Gast #717415
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.
Gast #717479
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.
Gast #717519
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.
Gast #717926
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
Angehängte Dateien:
#738283
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren