Forum: FPGA, VHDL & Co. VHDL: negativer Exponent in math_real


von Chris (Gast)


Lesenswert?

Hallo,

ich möchte mir eine Arkustangens-Tabelle basteln, mit VHDL und 
Synthese-Werkzeug Synplify. Formel sieht wie folgt aus:
value = atan(2^(-2) * 16)
1
use ieee.math_real.all;
2
[...]
3
architecture of ... is ...
4
begin
5
integer value <= integer(math_rad_to_deg*arctan(real(2**(-2))*16));

Folgende Fehlermeldung wird bei den Synthese ausgepuckt:
@E: CD450 :Arithmetic operator ** with negative exponent -2

Das müsste doch eigentlich so gehen, negative Exponenten sollten doch 
erlaubt sein. Was mache ich falsch?

von Duke Scarring (Gast)


Lesenswert?

Versuch's mal mit
1
2**(-2.0)
Damit wird real statt integer verwendet.

Duke

von D. I. (Gast)


Lesenswert?

> real(2**(-2))*16)

4 zu schreiben wär zu einfach? :)

von Chris (Gast)


Lesenswert?

Duke Scarring schrieb:
> Versuch's mal mit2**(-2.0)Damit wird real statt integer verwendet.

Danke, das wars.

D. I. schrieb:
> 4 zu schreiben wär zu einfach? :)

Ja ;) Ich hab den angegebenen Code hier etwas vereinfacht. In 
Wirklichkeit wird eine Indexvariable verwendet, damit wird der negative 
Exponent bei jedem Schleifendurchlauf der Wertetabelle geändert.

Danke!

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


Lesenswert?

Schleife, Variable und Real? Hoffentlich nur in einer Initialisierung 
oder einer Testbench...  :-o

Schleifenzähler sind generell nur Integer, du musst den erst mal nach 
Real konvertieren:
 http://www.lothar-miller.de/s9y/archives/14-Numeric_Std.html

von Chris (Gast)


Lesenswert?

Ja, ich muss lediglich ein Signal anfänglich initialisieren (Soll eine 
Wertetabelle werden). Genau wie auf deiner Seite beschrieben: 
http://www.lothar-miller.de/s9y/archives/37-DDFS-mit-BROM.html

Tolle Seite übrigens! Viele Tipps aus der Praxis (im Gegensatz zu vielen 
Büchern).

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


Lesenswert?

Chris schrieb:
> Tolle Seite übrigens!
Danke.
> Viele Tipps aus der Praxis
Das war meine Absicht, weil ich es in den Büchern auch vermisst habe.

von Chris (Gast)


Lesenswert?

Hallo nochmal,

ich brech gleich ab, ich komme schon wieder nicht weiter. Ich bastele 
mir gerade für eine Filterstruktur die Filterkoeffizienten zusammen. Die 
habe ich als auf 1 normalisierte Werte in einem zweidimensionalen Array 
gespeichert:
1
architecture...
2
  type c_t is array (0 to 10, 0 to 7) of real;
3
  constant c:c_t := ((1.00000,0.50000,0.00000,0.00000,0.00000,0.00000,0.00000,0.00000),
4
                     (0.00000,1.00000,0.50000,0.00000,0.00000,0.00000,0.00000,0.00000),
5
                     ...
6
                     (0.00000,0.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000));
7
begin -- architecture

Mit dem Array möchte ich nun ein zweites initialisieren, die 
Koeffizienten allerdings mit einem konstanten Faktor (2**x) 
multiplizieren. Ich möchte also die Position des Kommas verändern können 
(zur Synthese, nicht zur Laufzeit). Dann muss ich das nicht immer erst 
mittels externem Programm berechnen lassen und neu für VHDL formatieren.

1
architecture...
2
  constant my_fact: integer <= 64;
3
4
  type my_c_t is array (0 to 10, 0 to 7) of integer range -integer(my_fact) to integer(my_fact);
5
  signal my_c: my_c_t;
6
7
8
begin --architecture
9
  lines: for my_line in 0 to 10 generate
10
  begin
11
    rows: for my_row in 0 to 7 generate
12
    begin
13
      my_c(my_line,my_row) <= integer(c(my_line,my_row) * real(my_fact));
14
    end generate rows;
15
  end generate lines;

Ich sehe nicht, was hier falsch ist, bekomme aber den Fehler "Real value 
must evaluate to a constant for synthesis", der auf die Wertzuweisung in 
der for-Schleife zeigt. "c" ist doch schonmal als Konstante deklariert. 
Außerdem sollte "c" doch konstant sein, sie wird schließlich nirgendwo 
sonst gebraucht oder verändert. Ersetze ich "c" durch einen 
Fließkommawert, verschwindet die Fehlermeldung. Wo ist hier der Fehler 
versteckt?

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


Lesenswert?

Chris schrieb:
> bekomme aber den Fehler "Real value must evaluate to a constant
> for synthesis",
Von wem bekommst du den Fehler?

von Chris (Gast)


Lesenswert?

Sorry. Bei der Synthese von Synplify.

von Chris (Gast)


Lesenswert?

1
architecture...
2
  constant my_fact: integer <= 64;
ist ntürlich
1
architecture...
2
  constant my_fact: integer := 64;

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.