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
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
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...
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.