VHDL-Forum - Anfänger

Funktionsaufruf mit 2DArray als Argument

Funktionsaufruf mit 2DArray als Argument

Hallo,

ich bin neu hier im Forum und höffe, Ihr könnt mir weiterhelfen!

Folgends Problem:

Ich will eine Funktion aufrufen, die in einem 2D Array Werte interpoliert. Der Algorithmus ist an sich kein Problem, vielmehr der Funktionsaufruf:

Bis jetzt sieht die Funktion so aus (definiert in einem separaten package):

package interpolate is
type real_array2D is array (1 to 7, 1 to 9) of real;
function inter (data : real_array2D) return real;
end interpolate;

package body interpolate is
function inter (data : real_array2D) return real is
begin
return data(2,2)*2.0; -- some math for testing
end inter;
end interpolate;


Diese Funktion möchte ich nun wo anders aufrufen mit

variable result: real := inter(HDINVD1_A_r_mu);

mit der bereits definierten Konstante:

constant HDINVD1_A_r_mu : real_array2D :=
((6.605091e-09, 8.233016e-09, 9.816608e-09, 1.293426e-08, 1.911347e-08, 3.143472e-08, 5.606581e-08, 1.053358e-07, 2.037920e-07 ),
(1.564942e-08, 3.186405e-08, 4.504218e-08, 6.602079e-08, 9.655917e-08, 1.376546e-07, 1.912387e-07, 2.647705e-07, 3.793970e-07 ) );
...ein 2D-Array halt.

Aber es kommt immer die Compilermeldung:
"subprogram call or operator argument type mismatch"
bei eben diesem Funktionsaufruf.

Ich verstehe dass nicht und bin total verzweifelt.
Kann mir bitte jemand helfen?

Vielen Dank!

Schöne Grüße

Jan Kokert

Re: Funktionsaufruf mit 2DArray als Argument

Hallo,

mir leuchtet zwar nicht ganz ein was Du machen willst aber egal.

Genau sicher bin ich mir auch nicht.
Hast Du mal probiert "result" nicht als variable sondern als signal zu deklarieren?
Ich würde auch die deklaration und den Funktionsaufruf nicht in einer Zeile machen. Weis gar nicht ob das geht.

Gruesse.

Re: Funktionsaufruf mit 2DArray als Argument

Hallo! Danke für deine Antwort!

Zu dem, was ich machen will:
Ein Inverter-Gatter wurde in Abhängigkeit von der Eingangskapazität (9 Spalten und der riseTime(7 Zeilen) charakterisiert.
Es ergibt sich die bereits erwähnte Tabelle in Form eines real_array2D (constant HDINVD1_A_r_mu).
Die einzelnen Werte sind dann die Verzögerungszeiten.

Nun sind diese Wert aber eben nur bei diskreten Kapazitätswerten (0 pF, 0.3 pF, 0.6 pF, 1.2 pF, ...) angegeben.
Für beliebige Werte muss demzufolge (lin.) interpoliert werden.

Dafür soll eine Funktion geschrieben werden, der als Argumente das 2DArray, die gewünschte Kapazität und die RiseTime übergeben wird.

Zum Problem:
Als Test soll zunächst eine Funktion geschrieben werden, die ein 2D-Array übergeben werden kann und die dann z.B einfach den Wert der Tabelle an der Stelle (1,1) zurückgibt.
Die Funktion habe ich in dem separatem package interpolate definiert.

Jetzt habe ich Probleme mit dem Funktionsaufruf

(...) inter(HDINVD1_A_r_mu);

Ob ich das Ergebnis einer Variablen oder einem Signal zuweise spielt keine Rolle.
Immer kommt der Fehler:
"subprogram call or operator argument type mismatch"
obwohl ich doch eine real_array2D "reinstecke".

Muss man da noch einen Art Type-Cast durchführen?

Funktionsaufrufe von dieser Stelle aus mit Funktionen mit z.B. real Argumenten funktioniert.

Danke für weitere Antworten!


Schöne Grüße