Forum: FPGA, VHDL & Co. Dezimalzahl zerschneiden


von Robert T. (robert0815)


Lesenswert?

Hallo,

gibt es eine Möglichekeit eine Dezimalzahl zu "zerhacken"? Also z.B. 
würde gerne eine zweistellige Zahl in 2 verschiende Signale legen.

45 z.B. => Z1 = 4, Z2 = 5.

Gibt es da einen Befehl in VHDL? Bisher habe ich nichts gefunden.

von Nephilim (Gast)


Lesenswert?

also ich würde es über einfache rechnungen machen. je nach anzahl der 
stellen halt erstmal z.B. -100 rechnen und einen zähler mitlaufen 
lassen, so oft diese operation geht bis die zahl <100 ist. anschließend 
das gleiche mit -10 machen und einen weiteren zähler mitlaufen lassen 
und dann mit -1. und die werte der zähler is dann die "zerhackte" 
dezimalzahl.

so zumindest mein erster gedanke.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Robert T. wrote:
> Gibt es da einen Befehl in VHDL? Bisher habe ich nichts gefunden.
Jein.
Was du willst ist eine Division durch 10.
Die Division an sich gibt es in VHDL (das ist das '/').
Aber der Haken an der Sache: die ist nicht synthetisierbar :-(

Am einfachsten ist die Zählermethode, wie von Nephilim beschreiben. 
Allerdings ist die Laufzeit u.U. recht lang :-/

Deterministischer ist da eine Radix-2 Division, allerdings ist die 
Komplexität schon deutlich höher.

von Robert T. (robert0815)


Lesenswert?

Hi, danke für die Antwort. Diesen Ansatz hatte ich 2 Minuten nach dieser 
Frage im Forum entdeckt. Andere Idee:

Könnte ich meinen Zähler als std_logic_vector(7 downto 0) laufen lassen 
und von diesem dann Z1 <= xy_std_logic_vector(7 downto 4) und Z2 <= 
yx_std_logic_vecotor(3 downto 0) "cutten".

Oder macht man sowas nicht?

von Jan M. (mueschel)


Lesenswert?

Wenn Z1 und Z2 jeweils nur Ziffern von 0 bis 9 enthalten sollen, dann 
nennt man das BCD Codierung.

von Robert T. (robert0815)


Lesenswert?

Also eigentlich will ich eine ganz einfache Anzeige auf einem 7-Segment 
Display haben. Und da dachte ich mir (ohne Überlauf und Instanzierungen 
usw.) könnte ich einfach meinen Zähler zerschneiden und dann auf meine 
beiden (oder eventuell mehr) Anzeigen bringen.

von Jan M. (mueschel)


Lesenswert?

Also da gibt es zwei einfache Moeglichkeiten:

a) Du zeigst die Zahl nicht dezimal sondern hexadezimal an, dann kannst 
du direkt jeweils vier Bit breite Stuecke deines Zaehlers auf die 
Anzeige legen

b) Du verwendest mehrere Counter, die jeweils von 0 bis 9 zaehlen, dann 
zurueckgesetzt werden und den jeweils hoeherwertigen um eins erhoehen 
(das ist dann das BCD-Format)

und eine kompliziertere:

c) Einen grossen Counter und dann eine mehr oder weniger aufwendige 
Logik die den grossen Vektor in die einzelnen Ziffern zerlegt wie oben 
beschrieben.

von Robert T. (robert0815)


Lesenswert?

Vielen Dank. Ich denke ich werde jetzt mit die Variante mit den 2 
Zählern ausprobieren.

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.