Forum: FPGA, VHDL & Co. Rechnen im Hex-Dezimalsystem mit Dezimalanzeige


von Bustle (Gast)


Lesenswert?

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

von Daniel R. (daniel_r)


Lesenswert?

Du musst die Zahl manuell zerlegen. Andere Möglichkeiten gibts nicht.

von Bustle (Gast)


Lesenswert?

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...

von Daniel R. (daniel_r)


Lesenswert?

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

von T.M. (Gast)


Angehängte Dateien:

Lesenswert?

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
=============================

von Juergen Schuhmacher (Gast)


Lesenswert?

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.

von T.M. (Gast)


Lesenswert?

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
=============================

von T.M. (Gast)


Lesenswert?

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
=============================

von Juergen Schuhmacher (Gast)


Lesenswert?

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 ...

von Bustle (Gast)


Lesenswert?

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?

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

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.

von schlumpf (Gast)


Lesenswert?

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

von schlumpf (Gast)


Lesenswert?

sorry, das war völliger quatsch!

von schlumpf (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

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ß

von Bustle (Gast)


Lesenswert?

@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

von Steffen (Gast)


Angehängte Dateien:

Lesenswert?

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ß

von Bustle (Gast)


Lesenswert?

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