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

OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.