Forum: FPGA, VHDL & Co. Wie kann ich real/float synthetisieren?


von real (Gast)


Lesenswert?

Hallo,

ich habe einen std_logic_vector, in dem ein Wert steht. Dieser Wert 
macht nur mit diversen Umrechnungsfaktoren Sinn.
Ich möchte diesen jetzt vergleichen und den Vergleichswert vor dem 
synthetisieren berechnen lassen und dann auf Integer runden.

Bsp.
constant Umrechnungsfaktor1 : real 1.2393;
constant Umrechnungsfaktor2 : real 3.2493;

if (unsigned(std_logic_vectorXYZ) > (Wert * Umrechnungsfaktor1 / 
Umrechnungsfaktor2 * 2^16)) then
....
end if;

D.h. ich möchte einfach den Wert im Klartext eingeben und nicht jedesmal 
vorher mit dem Taschenrechner ausrechnen, sondern diesen Wert vor dem 
synthetisieren berechnenlassen und dann auf Integer runden.


Probiert habe ich das

if (unsigned(std_logic_vectorXYZ) >  to_unsigned(integer(Wert * 
Umrechnungsfaktor1 / Umrechnungsfaktor2 * 2^16), 
std_logic_vectorXYZ'length) then

von Martin (Gast)


Lesenswert?

runden  geht so:

Man addiere 1  im  obersten LSB  und schneide  dann ab

round_int = ((int + 1<<(2-1)) & b...11111100  ) >> 2

Umrechnungsfaktor  2^2 , nicht 2^16

Original


xxxxx00
xxxxx01
xxxxx10
xxxxx11

Original+1<<(2-1)

xxxx10
xxxx11
xxxy00
xxxy01

Original+1<<(2-1)   Abschneiden

xxxx
xxxx
xxxy
xxxy

von real (Gast)


Lesenswert?

Ich will nicht den logic_vector runden.
Angenommen der std_logic_vector entspricht einer Kraft. Jetzt will ich 
schauen, ob die Kraft > als 0.3 Newton ist.
Ich habe im Sensor und der nachfolgenden Aufbereitung viele Faktoren 
drin.
D.h. ich rechne 0.3 / 2.2 * 1.020 * 2^16 = 9115.461818 und vergleiche 
dann

if (unsigned(std_logic_vectorXYZ) > 9115 ) then ...
Die Schwellwerte sollen sich aber leicht ändern lassen. Nicht zur 
Laufzeit!
D.h. ich möchte das mir das Programm das berechenen abnimmt und ich nur 
noch schreiben muss
if (unsigned(std_logic_vectorXYZ) > Schwellwert / 2.2 * 1.020 * 2^16 ) 
then ...
Die Faktoren sind auch an zentraler Stelle gespeichert...

von Lattice User (Gast)


Lesenswert?

Indem du dir einen Floatingpoint IP Core kaufst.

von real (Gast)


Lesenswert?

Lattice User schrieb:
> Indem du dir einen Floatingpoint IP Core kaufst.

Falls es kein Witz war, der soll das nicht zur Laufzeit machen sondern 
vor/beim synthetisieren. D.h. der Schwellwert ist eine Konstante, die 
ich vorher festlege.

von Lattice User (Gast)


Lesenswert?

real schrieb:
> Falls es kein Witz war, der soll das nicht zur Laufzeit machen sondern
> vor/beim synthetisieren. D.h. der Schwellwert ist eine Konstante, die
> ich vorher festlege.

Nein, war kein Witz. Nur die Frage beantwortet.

wenn du es den Synthesizer machen lassen willst, musst du explizit von 
Float nach Integer konvertieren. Wie kann jetzt auf die schnelle nicht 
beantworten, aber vielleicht reicht dir der Hinweis.

Ist übrigens in C auch nicht anders.
1
Integervariable > Floatkonstante
braucht eine floatingpointfähige CPU bzw Runtime.
1
Integervariable > (int)Floatkonstante
braucht das nicht.

von real (Gast)


Lesenswert?

real schrieb:
> if (unsigned(std_logic_vectorXYZ) >  to_unsigned(integer(Wert *
> Umrechnungsfaktor1 / Umrechnungsfaktor2 * 2^16),
> std_logic_vectorXYZ'length) then

soooo, das funktioniert wenn man Klammern richtig setzten würde.
Danke an alle ...

Lattice User schrieb:
> musst du explizit von
> Float nach Integer konvertieren.

habe ich versucht, viell. war der betreff des themas kacke gewählt. 
Trotzdem Danke für deine Mühe

von Duke Scarring (Gast)


Lesenswert?

real schrieb:
>> if (unsigned(std_logic_vectorXYZ) >  to_unsigned(integer(Wert *
>> Umrechnungsfaktor1 / Umrechnungsfaktor2 * 2^16),
>> std_logic_vectorXYZ'length) then
Wenn Du das lesbarer haben willst, würde ich es ungefähr so machen:
1
  ...
2
  constant width : integer := 16
3
  ...
4
  constant Umrechnungsfaktor1 : real 1.2393;
5
  constant Umrechnungsfaktor2 : real 3.2493;
6
  constant schwellwert : unsigned(width-1 downto 0) := to_unsigned(integer(Wert *
7
 Umrechnungsfaktor1 / Umrechnungsfaktor2 * 2^16), width);
8
9
  ...
10
  if unsignedXYZ > schwellwert then
11
  ...
Und ich würde bei Zahlenwerten so zeitig wie möglich statt 
std_logic_vector auf signed oder unsigned wechseln.

Duke

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.