Forum: FPGA, VHDL & Co. VHDL function für Umwandlung eines 16Bit Wertes??


von Oliver R. (rollinator)


Angehängte Dateien:

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

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


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

von Oliver R. (rollinator)


Lesenswert?

Vielen Dank, Lothar.

Jetzt sollte es kein Problem mehr sein.

von Dani (Gast)


Lesenswert?

Wenn der Divisor bekannt ist, kann man es auch reziproc machen. Das ist 
sehr effektiv. Beispiel:

Teilen durch 3 als Multiplikation mit 0,333 durch Addieren von 1/4 + 
1/16 + 1/64 + 1/256

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


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)

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.