www.mikrocontroller.net

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


Autor: Chris R. (mrgreen)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Coolman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chris R. (mrgreen)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Detlev T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  while(wert >= 1000) {wert -= 1000; stelle[0]++;}
  while(wert >=  100) {wert -=  100; stelle[1]++;}
  while(wert >=   10) {wert -=   10; stelle[2]++;}
  stelle[3] = wert;
Nur mal so als Anregung.

Autor: Chris R. (mrgreen)
Datum:

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

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: glücklicher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thomas Hertwig (mac4ever)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: wasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: wasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: der mechatroniker (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: der mechatroniker (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ach so, hier die fehlende Entity

Autor: der mechatroniker (Gast)
Datum:
Angehängte Dateien:

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

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht 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/applic...

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

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_Arithm...

Autor: Uwe Bonnes (Firma: TU Darmstadt) (uwebonnes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch bei Opencores gibt es synthetisierbare Dividierer.

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.