Forum: FPGA, VHDL & Co. Problem Synthesize Division


von Max (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich hoffe ihr könnt mir helfen. Ich habe folgendes Problem: Ich habe
das im Anhang hinzugefügte VHDL Programm geschrieben um eine 14 Bit
große Eingangsgröße in 4 Dezimalstellen aufzusplitten. (Nötig für eine
Displayansteuerung). Nun konnte ich mein Modul simulieren und es
funktioniert wie gewünscht. Sobald ich allerdings synthetizieren möchte
bringt er mir die Fehlermeldung ich dürfte nur mit konstanten divisionen
durchführen oder mit 2 (ich vermute er möchte eine Verschiebung machen
das heißt ich kann durch 2,4,8,.. teilen). Gibt es wirklich keine
Möglichkeit in VHDL eine Division mit einer Variablen durchzuführen?
Bin wirklich für jede Hilfe dankbar.

Danke im vorraus

Max

P.S: Das ganze mache ich mit dem WebPack 7.1 und auf dem Spartan 3
Board von Digilent

von T.M. (Gast)


Lesenswert?

Die einzige Möglichkeit, die ich sehe, du kannst einen eigenen
Divisionsalgorithmus implementieren. Meinetwegen durch Überladen des
Divisionsoperators. Das wird aber nicht ohne erheblichen Code- und HW
Aufwand von statten gehen können.

Oder du schreibst dein Programm um. Der Divisionsoperator wird wenn
überhaupt, nur durch Potenzen von 2 unterstützt. Oder auch durch
Konstanten, wenn das dein Tool so m eint.

von T.M. (Gast)


Lesenswert?

Als Hinweis:

So eine Umwandlung für nen LCD lässt sich auch mit Zählern
bewerkstelligen, ohne jegliche Division.
Für jede Dezimalstelle 1 Zähler und die werden ineinander geschachtelt.
Hab ich in einem meiner Designs auch mal gemacht. Da gabs mal nen Thread
hier im Forum, wo ich das hergenommen habe. Such einfach mal nach, das
wird dir bestimmt nützen. Man muss nur bedenken, dass, je grösser die
Zahl, umso länger auch die Umrechnung dauert. Aber das kann man ja
durch ein Handshake Signal an das nächste Modul lösen.

von Thomas B. (paraglider)


Lesenswert?

Hallo Max,

deinem Code zufolge kommst du von der Software-Seite und schreibst so
ziemlich den erster VHDL-Code. Macht nix, so ähnlich habe ich auch vor
einiger Zeit angefangen.

Daher erst mal zu deinem Code:
Was du in deinem Code beschrieben hast, ist ein Wandler, der in EINEM
Takt aus einer n-bit Binärzahl eine m-Digit Dezimalzahl berechnen soll.
Selbst wenn dein Syntheseprogramm Dividierer bauen könnte, würde das die
Kapazität deines FPGAs wahrscheinlich sprengen.

Bei der Hardware-Beschreibung musst du dir eine völlig neue
Vorgehensweise angewöhnen - deshalb auch Hardware-BESCHREIBUNG und
nicht Hardware-PROGRAMMIERUNG. Hardware-Kenntnisse sind unbedingt
erforderlich. Also im Zweifelsfall erst mal ein Buch über die Hardware
der Digitaltechnik lesen, bevor du dich weiter mit VHDL befasst.

Nun zum Vorgehen:
1. Kann man Software in Hochsprachen nahezu unabhängig vom Prozessor
schreiben, so stellt sich bei der Hardware-Beschreibung erst einmal die
Frage, welche Ressourcen der zu verwendende Baustein hat bzw. welchen
Baustein man sinnvollerweise einsetzt (ich weiß, da beißt sich die
Katze schon in den Schwanz...). Z. B. D-Flip-Flops mit synchronem oder
asynchronem Set/Preset/Clear/Reset, Funktionsgeneratoren (LUTs) mit
max. 4 Eingängen, RAM-Blöcke, Multiplizierer und noch ein paar
Spezialitäten => Unbedingt Datenblatt lesen!
Du wirst sehen, einen Dividierer hat dein FPGA nicht (meines Wissens
kein FPGA), außerdem bräuchtest du bei deinem Code gleich 4 davon.
VHDL ist zwar prinzipiell portierbar, aber du wirst bald feststellen,
dass du einige Module doch für jede Hardware anpassen musst, um Größe
und Geschwindigkeit zu optimieren.
2. Wie schnell muss eine Operation ausgeführt werden? Sehr schnell =>
parallele Verarbeitung, i. A. hoher Resourcenbedarf (insbes. viele
LUTs), langsam => Aufteilung der Operation auf mehrere Takte (i. A.
wesentlich weniger LUTs, vielleicht ein paar zusätzliche FFs zur
Speicherung von Zwischenergebnissen).
3. Ggf. Algorithmus überlegen oder suchen. Division z. B.
http://www.ingorohloff.de/tgi3/node7.html, Binär zu BCD z. B.
http://www2.informatik.uni-jena.de/~ct_mgr/a1/vhdl/binbcdn.vhd
Zugegeben, das ist nicht wirklich primitiv - aber so ist die
Hardware-Welt. Für dein Problem ist das von T. M. angesprochene
Verfahren sicher einfacher zu codieren und weniger resourcenintensiv,
allerdings eben relativ langsam (s. 2.): Es benötigt bei 4 Digits max.
10000 Takte für eine Wandlung.

Gruß,
Thomas

von Xenu (Gast)


Lesenswert?

Sollte tatsächlich mal eine Divisionseinheit gebraucht werden,
im 8er-Webpack ist eine als Teil des Coregenerators mit dabei.

http://www.xilinx.com/bvdocs/ipcenter/data_sheet/div_gen_ds530.pdf

von Max (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

ich danke euch für alle die Antworten. Ich habe mir jetzt also auf der
Idee von T.M mal ein Programm geschrieben. Es funktioniert in der
Simulation ganz gut. Leider bringt er mir beim Synthesis folgenden
Fehler: ERROR:Xst:827 - line 60: Signal Seg1000x cannot be synthesized,
bad synchronous description.

Kann mir einer meinen Fehler sagen?

Danke im vorraus

Max

von Andreas P. (andreas_p)


Angehängte Dateien:

Lesenswert?

Hallo

ich habe deinen source etwas geändert ich so müste es richtig sein.
Leider habe ich keinen simulator zur hand um die funktion zu
überprüfen.

Ich denke der Fehler ist in der event abfrage geschachtelt in einer
case Anweisung.

ich hoffe ich konnte helfen.

Andreas

von Max (Gast)


Lesenswert?

Danke genau das war das Problem. Jetzt funktioniert es wunderbar.

Nochmal Danke ^^

Max

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.