Forum: FPGA, VHDL & Co. Multiplikation von real und int


von Klaus (Gast)


Lesenswert?

Hallo!

Zunächst mal eine Beschreibung, was für ein Problem ich versuche zu 
lösen:

- ich möchte eine Konstante haben, mit der ein Filterkoeffizient 
festgelegt wird (Bereich 0 bis 1).  Der Wert soll im Klartext angegeben 
werden.

- zur Verwendung im eigentlich Code möchte ich eine zweite Konstante, in 
welcher der Koeffizient mit der passende Bitbreite skaliert drin steht.

Nun mein Versuch einer Lösung:
1
constant A:     real    := 0.5;         
2
  
3
constant B: integer := integer(A * 2**coeffWidth );
Das erzeugt leider beim Compilieren mit ModelSim die Fehlermeldung: No 
feasible entries for infix operator "*".

Die Variante
1
constant B: integer := integer(0.5 * 2**coeffWidth );
  funktioniert dagegen (allerdings möchte ich das vermeiden, da ich 
Konstanten zur Konfigutation, und die berechneten an unterschiedlicher 
Stelle stehen).

Warum funktioniert das ein und das andere nicht, in beiden Fällen wird 
doch eine Multiplikation von Real mit Int durchgeführt, oder nicht? Und 
wie kann ich das ganze nun elegant lösen?

von D. I. (Gast)


Lesenswert?

0.5 kann man auch als fixed point interpretieren, da 0.1 in binär und 
dann ist es eine normale integer multiplikation

von Klaus (Gast)


Lesenswert?

D. I. schrieb:
> 0.5 kann man auch als fixed point interpretieren, da 0.1 in binär und
> dann ist es eine normale integer multiplikation

ok, das erklärt, warum das zweite funktioniert. Aber wie löse ich nun 
die Aufteilung zwischen Konfiguration und Berechnung elegant?

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


Lesenswert?

Klaus schrieb:
> constant B: integer := integer(A * 2**coeffWidth);
Probiers mal so:
  constant B: integer := integer(A * real(2**coeffWidth));

von Klaus (Gast)


Lesenswert?

Danke nun passt es!

Ich komm bei VHDL mit der ganzen hin und her Konvertiererei der 
Datentypen, bis alles so ist wie die Operatoren es haben wollen, 
immernoch ganz schön durcheinander :-/

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


Lesenswert?

Klaus schrieb:
> bis alles so ist wie die Operatoren es haben wollen,
> immernoch ganz schön durcheinander :-/
Du kannst zwei Sachen machen:
1. dich auf die Intuition verlassen
oder
2. in den entprechenden Sourcecodes der Packages nachsehen... ;-)

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.