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
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
Vielen Dank, Lothar. Jetzt sollte es kein Problem mehr sein.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.