Hallo
Ich hab folgendes Problem bei der Konvertierung einer realzahl: beim
unten dargestellten Code spuckt der synthetisierer die Fehlermeldung
aus:
"Real operand is not supported in this context."
die betreffende Zeile ist innerhalb einers GENERATE blocks mit der
Laufvariable j.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.STD_LOGIC_ARITH.ALL;
--use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.numeric_std.all;
use IEEE.MATH_REAL.all;
........
conv_vector(j) <=
std_logic_vector(to_signed(integer(conv_matrix_real(matrix_sel,
j)*1024.0 ),18));
matrix_sel <= to_integer(unsigned(SEL)) when unsigned(SEL) < 9 else 9;
........
wenn ich das jedoch das signal "matrix_sel" durch eine Konstante
ersetzte dann gehts
conv_vector(j) <= std_logic_vector(to_signed(integer(conv_matrix_real(2,
j)*1024.0 ),18));
Ich kann mir das bis jetzt nicht erklären, hoffe jemand kann mir helfen.
Was ist conv_matrix_real()? Wenn das ein Array ist, dann ist klar, was
da schief läuft: ein Arrayindex darf nur ein Integer sein.
Als Gegentest:
Probier mal als Konstante den Wert 2.0 (float) statt 2 (integer)...
Hallo Lothar
conv_matrix_real() ist ein Array aus realzahlen.
als index habe ich das signal "matrix_sel" verwendet, das aber als
integer deklariert ist. Das Eingangssignal "SEL" wird von
std_logic_vector in integer gewandelt.
Demnach wird "matrix_sel" als real interpretiert?
Eraser schrieb:> als index habe ich das signal "matrix_sel" verwendet, das aber als> integer deklariert ist.
Das war nicht erkennbar...
> mult_inst : MULT18X18SIO
Warum so umständlich? Ein Multiplizierer wird in VHDL einfach über ein
'*' instantitiert.
Eraser schrieb:> spuckt der synthetisierer die Fehlermeldung aus:> "Real operand is not supported in this context."
Welche Toolchain? Kann die überhaupt mit real-Zahlen umgehen? Sind die
Synthesizer schon so weit? Auf jeden Fall wird die MATH_REAL alleine für
die Synthese nicht ausreichen.
Für Xilinx gilt laut dem XST Users Guide z.B.:
1
VHDL Predefined IEEE Fixed and Floating Point Packages
2
XST supports VHDL predefined IEEE fixed and floating point packages.
3
:
4
:
5
• The float_pkg package:
6
– Contains functions for floating point math.
7
– Is already precompiled into the ieee_proposed library.
Hallo Lothar
Ich hab jetzt das real-array in ein std_logic_vector-array konvertiert
mittels einer weiteren generate-schleife. Mit den beiden Laufvariablen
geht das ohne Probleme. Danach habe ich das Signal "matrix_sel" mit dem
std_logic_vector-array verknüpft. Jetzt gehts.
ich frag mich wieso das vorher nicht gegangen ist. Die Realzahlen sind
ja immer noch da und die bib MATH_REAL reicht trotzdem.
Die Multiplikation mit * hat bei mir nie funktioniert, das endete immer
mit einer Fehlermeldung. Deshalb mach ich das mit den Primitives.
Vielleicht ist im ISE was falsch eingestellt oder ich hab die falschen
Bibs.
Eraser schrieb:> Die Multiplikation mit * hat bei mir nie funktioniert, das endete immer> mit einer Fehlermeldung
Du kannst mit der numeric_std keine std_logic_vector miteinander
multiplizieren.
> Die Multiplikation mit * hat bei mir nie funktioniert, das endete immer> mit einer Fehlermeldung.
Mit welcher Fehlermeldung denn? Bei mir geht das ohne Fehlermeldung
tadellos. Und das steht auch im Handbuch zum Synthesizer...
> ich frag mich wieso das vorher nicht gegangen ist. Die Realzahlen sind> ja immer noch da und die bib MATH_REAL reicht trotzdem.
Schon klar, aber jetzt kann sich die Toolchain zur Synthesezeit (auf
dem Entwicklungsrechner) einmalig die Tabelle ausrechnen und ablegen.
Mit der ersten Beschreibung hätte er zur Laufzeit (im FPGA) die
angegebenen Berechnungen machen müssen.