Problem Synthesize Division

Gast #388094
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
Angehängte Dateien:
Gast #388095
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.
Gast #388096
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.
#388097
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
Gast #388099
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
Angehängte Dateien:

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