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.
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.
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...
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.
Das soll auf dem Cyclone II passieren, der müsste Dividierer mitbringen, oder?
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.
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.
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...
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.
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.
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.
@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.
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
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.
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.
> 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
Und weil mir sonst nachher niemand glaubt, daß das funktioniert, hier eine Testbench.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.