Hallo, ich habe eine Dezimalanzeige mit vier Stellen. Rechnen tue ich aber im Hex-Dezimalsystem... z.B. habe ich das Ergebnis BB8 ... anzeigen möchte ich aber die Zahl 3000 Wie kann ich das Problem lösen, wie macht es ein Taschenrechner? Gruß Bustle
Du musst die Zahl manuell zerlegen. Andere Möglichkeiten gibts nicht.
ich glaub ich bin zu blöd... wie kann ich das in VHDL lösen? Hätte auch Multipliziereinheiten zur Verfügung, da ich ein XC3S400 verwende...
Moment mal...Da Du nichts von VHDL oder Ähnlichem erwähnt hast habe ich vermutet, dass Du eigentlich ins uC Forum posten wolltest... Wenns nun doch VHDL sein soll wird die Sache schon einfacher: Im FPGA sind sowieso alle Zahlen binär. Nur in der Sprache VHDL gibts verschiedene Datentypen. D.h. Dein Signal muss wohl std_logic_vector sein, oder?? Dieses könnte man jetzt über einige Rechnerei und Zählerei in die gewünschte Form bringen... Verrate mir doch bitte mal, um was es geht. Ich vermute mal irgend ein Zähler über 7-Segment Anzeigen, oder? Wenn das der Fall ist kann ich Dir eine super Lösung ohne rumrechnen anbieten. Daniel
Das kann man über Zähler lösen, für jede Dezimalstelle einen. Schau mal in das File im Anhang, so hab ich das vor ner Weile mal gemacht. Ist nicht perfekt, funktioniert aber. Man muss nur bedenken, dass das je nach Größe der Zahl unterschiedlich lange dauert... T.M. ============================= http://editthis.info/freefpga =============================
Das mit den Zählern scheint mir zwar recht schlau programmiert, aber die konventionelle Methode über MUL/DIV scheint mir die schnellere, zumal die Resourcen an MULs und DIVs geswitched werden können, wenn man es stufenweise über eine FSM realisiert. Ausserdem dürfte eine solche Anzeige ständig aktualisiert werden, wodurch sich pipelined divider anbieten.
Ich bin da nicht so führend drin. Zu dem Zeitpunkt des Codes hatte ich auch nicht soviel Zeit mich mit Alternativen zu beschäftigen ;-) Welche konventionelle Methode ist denn damit gemeint? Divisionen in VHDL sind ja auch so ne Sache, wenn sie nicht grad durch Vielfache von 2 sind. T.M. ============================= http://editthis.info/freefpga =============================
Ok, klar. Du meinst die Standardmethode mit den Wertigkeiten der Binärzahl. Da hat man dann zwar eine Dezimalzahl, nur die müsste man dann auch noch zerlegen für die Anzeige. Das macht die Methode mit den Zählern schon automatisch. Deshalb hatte ich das auch so gemacht, wenn ich mich nicht irre, ist fast schon wieder nen Jahr her... Bei meiner Anwendung kam es auch nicht so auf Schnelligkeit drauf an, zumal das Display ja eh nur aller paar ms neue Daten verträgt. T.M. ============================= http://editthis.info/freefpga =============================
Ich meinte einfach, an der n.-ten Stelle durch 10hoch n zu dividieren und den Rest weiter zu berechnen. Ja nach Resorurcen im FPGA werden Divider als LUTs realisiert und die nötigen Resourcen automatisch multiplexed. Ansonsten kann man es auch als 4 stufige Schleife definieren, die 2 Register, einen DIV, einen MUL und einen SUB hat. Stelle 1 = HEX / 10000 (mit REST1 = HEX - 10.000 x Stelle1) Stelle 2 = REST1 / 1000 ... etc ...
der letzte Lösungweg habe ich noch nicht ganz verstanden... z.B. hab ich die Zahl 8B1... Stelle 1 = 0 Stelle 2 = 0 Stelle 3 = 8 ... aber den Dezimalwert habe ich damit doch noch nicht. Oder wie stellst du dir das dann weiter vor?
In konventioneller Schaltungstechnik habe ich mal einen BCD zu Binär-Wandler gebaut, nur mit einigen Binär-Addierern. Für jedes Bit des BCD-Eingangs braucht man eine weitere Addiererstufe. Dasselbe könnte man für die umgekehrte Richtung mit BCD-Addierern aufbauen. Zum Beispiel für das Bit der Wertigkeit "16" wird die Konstante 16 addiert. Das wäre die "massiv parallele" Variante. Das Gegenteil dazu wäre die rein serielle Verarbeitung, wie es ein Mikrocontroller machen müßte. Im FPGA gibt es noch beliebige Zwischenstufen.
Ich würde es so machen, wenn du auf drei Hex-Stellen begrenzt bist: Beispiel 0xAB8 Nibbleweis dein Ergebnis betrachten: A x 256 + B x 16 + 8 Braucht zwei Multiplizierer und zwei Addierer und die meisten FPGAs haben sowas ja on Chip
Die Lösung mit den Zählern find ich klasse! Sehr schlau gemacht, da es sehr ressourcenschonend ist. Und ich denk, für ne Anzeige auch allemal schnell genug. Die Wandlung für ne 3 Stellige Hexzahl dauert im Schlimmsten fall ja nur ca. 80 us bei nem Systemtakt von 50 MHz
wie siehts mit dem package txt_util.vhd aus? da gibts zb. folgende funktion, -- converts integer to string, using base 10 function str(int: integer) return string; erst hex nach int, dann int nach string, und dann die einzelnen charakter des strings auswerten und innen std_logic_vector oder signed/unsigned konvertieren... (wenn du bei deiner berechnung in hex bleiben möchtest) gruß
@Steffen hört sich interessant an. Was ist "txt_util.vhd" für ein Package? Ist das bei der Xilinx-Software dabei? Finde es nämlich nicht... Gruß Bustle
nein, nicht bei der xilinx-software dabei... keine ahnung wer das mal geschrieben hat, ich habe es mal hier gefunden http://www.stefanvhdl.com/vhdl/vhdl/txt_util.vhd, ist eine super ergänzung zur textio... gruß
...umfangreich... das muss ich mir mal ansehen, wenn ich wieder Zeit hab. Vielen Dank, kann ich sicherlich brauchen. Sieht professionell aus.
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.