Synthes von Funktionen

Gast #843208
Lesenswert?

Hallo,

eine Frage zur Synthese von Funktionen.

Ein Prozess ruft häufig ca. 40 mal mehrere Funktionen auf.

Wenn ich unter Xilinx ISE bei der Synthese nun alles umsetze, kann ich 
angeben, um Harwareresourcen zu sparen, das die Funktion nur einmal 
implementiert wird und über Multiplexer zugeschaltet wird?

Oder wird die Funktion bei jedem Aufruf an dieser Stelle implementiert?

Kann ich über VHDL so etwas erzwingen?

Besten Dank im Voraus!

Gruß

Frank
Gast #843647
Lesenswert?

Hallo Rick

besten Dank!

Es sieht im Prozess ca. so aus:

entity test (B in Studio_logig_vector (7 down to 0)
              y out Studio_logig_vector (7 down to 0);

process test (B)

variable a,c,k,o Studio_logig_vector (7 down to 0)

begin

A:=B;
C:=function1 (A);
K:=function1 (C);
O:=function1 (K);
y<=O;
end process

Also die Funktionen werden nacheinander aufgerufen. Sie werden aber 
trotzdem 3 mal realisiert richtig?

Wie kann ich die funktion1 denn explizit multiplexen so das sie nur 
einmal realisiert wird?

Gruß

Frank
Gast #843669
Lesenswert?

Dir muss klar werden, das ein Prozess lediglich die sequentielle 
Beschreibung eines parallelen Vorgangs ist. Deine Funktionsaufrufe 
"geschehen" alle zur exakt gleichen Zeit. D.h. das jeder Aufruf in ein 
Schaltnetz umgesetzt wird. Wenn Du Hardware einsparen willst, musst Du 
dafür sorgen das Zeit zwischen den Aufrufen vergeht. Das kannst Du z.B. 
mit einem Zustandsautomaten machen der Takt für Takt die Funktion mit 
einem anderen Parameter aufruft. Oder den "Eingang" der Funktion 
implizit durch ein Signalmapping ändert. Das sollte jedoch beides in die 
gleiche Struktur übersetzt werden.
Gast #843726
Lesenswert?

Hallo Mathi,

wenn ich also die einzelnen Funktionsaufrufe in
einzelne Blöcke packe und über Signale verbinde, dann kann die Synthese 
dort die Funktion nur einmal realisieren.

Das Beispiel von oben, jetzt anders realisiert: (stark vereinfacht)

Original----------------
A:=B;
C:=function1 (A);
K:=function1 (C);
O:=function1 (K);
y<=O;
-----------------------
Jetzt als Sequenz von drei Blöcken


Block 1 (A in Studio_logig_vector (7 down to 0)
              B out Studio_logig_vector (7 down to 0);
begin
B<= funktion1 (A)
end Block1

Block 2 (A in Studio_logig_vector (7 down to 0)
              B out Studio_logig_vector (7 down to 0);
begin
B<= funktion1 (A)
end Block2

Block 3 (A in Studio_logig_vector (7 down to 0)
              B out Studio_logig_vector (7 down to 0);
begin
B<= funktion1 (A)
end Block3

Die Blöcke werden über Signale miteinander verbunden.

Wenn ich das jetzt richtig verstanden habe liegt jetzt eine zeiliche 
Abfolge dazwischen und die Synthese kann die Funktion einmal 
realisieren-

Richtig?


Gruß

Frank

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren