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?