mikrocontroller.net

Forum: FPGA, VHDL & Co. Problem Synthesize Division


Autor: Max (Gast)
Datum:
Angehängte Dateien:

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

Autor: T.M. (Gast)
Datum:

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

Autor: T.M. (Gast)
Datum:

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

Autor: Thomas B. (paraglider)
Datum:

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

Autor: Xenu (Gast)
Datum:

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

Autor: Max (Gast)
Datum:
Angehängte Dateien:

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

Autor: Andreas Pi (andreas_p)
Datum:
Angehängte Dateien:

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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke genau das war das Problem. Jetzt funktioniert es wunderbar.

Nochmal Danke ^^

Max

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.