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
Noch als Ergänzung Resource Sharing war bei der Synthese eingeschaltet. Gruß Frank
Nein. Du brauchst sie ja ca. 40x gleichzeitig. Wenn Du multiplexen willst, dann schreib das hin. Rick
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
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.
Ach ja, kombinatorisch geht das auch... Du rufst in einem Prozess die Methode auf und übergibst mit einem Anderen ein Quell- und Zielangabe.
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
Nein. Auch ein Block ist nichts anderes als eine logische Einheit, vergleichbar mit einer Baugruppe. Da braucht es auch alle Gruppen nebeneinander. Was du brauchst, ist eine state machine.
Jan hat recht... So geht das nicht. Du solltest lieber einen taktgesteuerten Zustandsautomaten verwenden. Eine kombinatorische Realisierung ist nicht ganz trivial.
Hallo Jan hallo Mathi, besten Dank! Ich werde es mal versuchen. Gruß Frank
Dort oben lugt mir entgegen:
1 | Studio_logig_vector (7 down to 0) |
Ist das eine neue Deklaration a la VHDL-2008????
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.