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
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.
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.
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.