VHDL function für Umwandlung eines 16Bit Wertes??

#2411021
Lesenswert?

Hallo,
ich wollte eine Funktion bauen, die aus einem 16Bit-Wert (den man ihr 
übergibt) eine Stelle ermittelt (Einer, Zehner, Hunderter, Tausender)


Jeder Wert des 16 Bit-Eingangsvektors steht dabei für eine Millisekunde!

nun wollte ich für jede Stelle einen Wert von 0 bis 9 ermitteln!

Die Auswahl sollte über den Parameter "sel_par" erfolgen:

z.B. wenn sel_par == 00 { Einerstelle ermitteln

    wenn sel_par == 01 { Zehnerstelle ermitteln

Danach wird die Stelle

mit ms_outp_lcd (0beren 4 Bits) verknüpft (Für die korrekte Ausgabe an 
einem LCD)!

Aber irgendwie mag er den Modulo operator nicht?

--> ** Error: Z:/Downloads/time_ms.vhd(21): No feasible entries for 
infix operator "mod".


Ist es denn überhaupt möglich eine Funktion auf diese Weise (mit case) 
zu realisieren? (hab nicht so die Erfahrung mir Funktionen in VHDL!)

Gruß

Olli
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #2411215
Lesenswert?

Oliver R. schrieb:
> Aber irgendwie mag er den Modulo operator nicht?
Vorab: Modulo basiert auf einer Division. Und eine Division, die nicht 
auf Zweierpotenzen beruht (2,4,8,16,...) ist in Hardware EXTREM 
aufwendig.

> ms_outp := time_16bit mod 10;
> ms_outp := (time_16bit / 10) mod 10;
Mit Vektoren rechnet man nicht. Und insbseondere ist für den Datentyp 
std_logic_vector offenbar keine Division mit einem Integer definiert. 
Das sagt die Meldung:
>>> No feasible entries for infix operator "mod".

Eine BCD-Umwandlung geht in Hardware ganz anders. Sieh dir das mal an:
http://www.lothar-miller.de/s9y/categories/44-BCD-Umwandlung
http://www.lothar-miller.de/s9y/archives/29-Division-in-VHDL.html
Moderator (Firma: Titel) Persönliche Seite #2470299
Lesenswert?

Falls sich jetzt jemand fragt, wie Dani ganz einfach auf diese Faktoren 
gekommen ist: man rechnet z.B. für 8 Bit einfach

256*0.33 = 84.48 --> 84 = 0x54 = 0101_0100

Und nimmt für die Bits von links die Wertigkeiten
  0    1    0     1     0     1      0      0
1/2  1/4  1/8  1/16  1/32  1/64  1/128  1/256

Damit ergibt sich  1/4 + 1/16 + 1/64 = 0.328125
(Am 1/256 von Dani kann man erkennen, dass hier auf 85/256 = 0.33203 
aufgerundet wurde)

Und damit muß man nur seine Zahl noch ein wenig zurechtschieben und 
zusammenaddieren.

Allerdings kann, wenn die Zahl der 1-en Überhand nimmt, eine Subtraktion 
schneller sein:
Statt zu rechnen  x*0.465 = x/4+x/8+x/16+x/64+x/128+x/256
(256*0.465 = 119 = 0x77 = 0b01110111)
Ginge es einfacher mit x-x*0.535 = x-x/2-x/32-X/256
(256*0.535 = 137 = 0x89 = 0b10001001)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren